Как получить учетные записи из Azure AD? - PullRequest
1 голос
/ 04 июня 2019

У меня есть хорошая 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. Просто простое и пошаговое объяснение. Я мог бы, вероятно, Google это, но я получил тысячи результатов, и ни один из них не помог ... Это должно быть легко, верно?

[РЕДАКТИРОВАТЬ] Сначала я хотел получить список пользователей, который потерпел неудачу из-за опечатки ... (перед точкой по умолчанию есть точка ...)

1 Ответ

0 голосов
/ 04 июня 2019

Потребовалось немного дурачиться, но это не так уж сложно в конце концов.В 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 , и теперь я знаю, как это сделать.Это все еще оставляет намного больше вопросов, но все это в основном отвечает на мой вопрос ... Я буду использовать это как ответ, поскольку другие могли бы счесть это полезным ...

...