Как получить учетные записи из Azure AD?

У меня есть хорошая Azure Active Directory с дюжиной пользователей. (Все я!) Итак, у меня есть идентификатор арендатора, идентификатор клиента и секрет клиента.
Я также работаю над простым консольным приложением, которое будет функционировать как общедоступный клиент для этого каталога. Этот клиент также содержит список имен пользователей и паролей, так как это просто эксперимент. Не безопасно, я знаю. Но сначала мне нужно понять, как это работает...

Я делаю это:

IConfidentialClientApplication client = ConfidentialClientApplicationBuilder
                                  .CreateWithApplicationOptions(options).Build();

И это создает мое клиентское приложение. Работает нормально.
Я также получаю токен, используя "https://graph.microsoft.com/.default" и может использовать это для получения всех пользователей в формате JSON:

string result = await GetHttpContentWithToken("https://graph.microsoft.com/v1.0/users", 
                                               token.AccessToken);

Хотя я, возможно, хотел бы, чтобы он был более удобным для пользователя, на данный момент JSON подходит.

Как проверить, является ли пользователь авторизованным пользователем?
И нет, мне не нужны сложные решения, для которых требуются различные пакеты nuget. Простое и простое пошаговое объяснение. Я мог бы, вероятно, погуглить это, но в итоге я получил тысячи результатов, и ни один из них не помог... Это должно быть легко, верно?

[EDIT] Сначала я хотел получить список пользователей, у которых произошел сбой из-за опечатки... (Точка перед "по умолчанию"...)


person Wim ten Brink    schedule 04.06.2019    source источник
comment
Вам нужно будет получить токен доступа, используя этот объект приложения. Для области вам нужно использовать https://graph.microsoft.com/.default, и для этого вам потребуется разрешение приложения в Azure AD для чтения всех пользователей через API MS Graph. (для этого найдите регистрацию своего приложения на портале Azure). Затем вы можете вызвать конечную точку /v1.0/users Microsoft Graph API с маркером, прикрепленным к запросу. Это дает вам всех пользователей.   -  person juunas    schedule 04.06.2019
comment
Для аутентификации пользователя необходимо использовать один из доступных потоков аутентификации. Какой поток вы должны использовать, зависит от типа приложения. И нет, вам не нужен пароль пользователя. Они никогда не должны сообщать вам свой пароль.   -  person juunas    schedule 04.06.2019
comment
Что ж, мне удалось получить токен доступа... Но теперь часть аутентификации...   -  person Wim ten Brink    schedule 04.06.2019


Ответы (1)


Пришлось немного повозиться, но в конце концов это не так уж и сложно. Вокруг Azure есть много библиотек, но в основном это всего лишь набор HTTP-запросов и ответов. Даже в консольном приложении... Я начал с создания PublicClientApplicationBuilder:

var options = new PublicClientApplicationOptions()
{
    ClientId = <**clientid**>,
    TenantId = <**tenantid**>,
    AzureCloudInstance = AzureCloudInstance.AzurePublic,
};
var client = PublicClientApplicationBuilder.CreateWithApplicationOptions(options).Build();

Вместо этого я также могу создать ConfidentialClientApplication, но это позволит мне войти в систему в интерактивном режиме, если это необходимо.

Затем настройте области видимости:

var scopes = new List<string>() { "https://graph.microsoft.com/.default" };

Поскольку я хотел войти в систему, используя имя пользователя и пароль, я должен использовать это:

var token = await client.AcquireTokenInteractive(scopes).ExecuteAsync();

Но если я хочу войти в систему с помощью кода, я также могу использовать это:

var password = new SecureString();
foreach (var c in <**password**>) { password.AppendChar(c); }
var token = await client.AcquireTokenByUsernamePassword(scopes, <**account**>, password).ExecuteAsync();

На данный момент я авторизован как указанный пользователь. Итак, теперь все, что мне нужно, это получить любые данные, которые мне нравятся, в строках JSON...

public static async Task<string> ExecCmd(string name, string url, string token)
{
    HttpClient httpClient = new HttpClient();
    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", token);
    string result = await GetHttpContentWithToken(url, token);
    JObject json = JsonConvert.DeserializeObject(result) as JObject;
    File.WriteAllText(name, json.ToString());
    return result;
}

Поскольку я просто хочу прочитать данные в виде текстовых файлов, я просто выполняю действие с использованием определенного и записываю его в формате JSON в файл. Итак, используя этот простой метод, я теперь могу использовать это:

await ExecCmd("Profile.txt", "https://graph.microsoft.com/v1.0/me/", token.AccessToken);
await ExecCmd("Groups.txt", "https://graph.microsoft.com/v1.0/groups", token.AccessToken);
await ExecCmd("Users.txt", "https://graph.microsoft.com/v1.0/users", token.AccessToken);

Они предоставят мне (1) профиль текущего пользователя, (2) группы AD и (3) пользователей AD. И, возможно, еще немного... Я могу использовать этот ExecCmd для извлечения гораздо большего количества данных, если захочу. Но есть еще кое-что, о чем следует помнить! Чтобы все это заработало, вам также необходимо настроить приложение Azure и убедиться, что все права доступа назначены и утверждены! Итак, в Azure AD вам нужно добавить «Регистрацию приложения» и возиться с настройками... (Эксперты Azure сейчас ужасно шокированы, но когда вы хотите учиться, вам просто нужно пытаться и терпеть неудачу, пока вы не успешно...) Также установите «Тип клиента по умолчанию» на «общедоступный клиент» для зарегистрированного приложения. В Azure с зарегистрированным приложением вам также необходимо установить соответствующие разрешения API! В противном случае у вас не будет доступа. И поскольку мне нужен доступ к Active Directory, мне нужно добавить разрешения в «Azure Active Directory Graph». Я могу сделать это внутри Azure или с помощью области при вызове AcquireTokenInteractive(). Например, используя "https://graph.windows.net/Directory.Read.All" вместо "https://graph.windows.net/.default". Получив интерактивный доступ к токену, вы также можете получить больше токенов с помощью client.AcquireTokenSilent(). Отсюда становится немного сложно, особенно если вы хотите получить доступ к большому количеству различных предметов. К счастью, Active Directory — это в основном сам каталог, группы, пользователи и участники. Лично я предпочитаю предоставлять доступ с веб-сайта Azure, но это довольно интересно. В любом случае, я хотел аутентифицировать пользователей с помощью Azure и теперь знаю, как это сделать. Это все еще оставляет гораздо больше вопросов, но все это в основном отвечает на мой вопрос... Я буду использовать это как ответ, так как другие могут найти его полезным...

person Wim ten Brink    schedule 04.06.2019