Получение токена для веб-API с использованием учетных данных пользователя - PullRequest
0 голосов
/ 06 сентября 2018

Я создал новую учетную запись пользователя в своем тестовом клиенте AAD, скажем testuser1@mytenant.onmicrosoft.com, и установил для нее пароль. Эта новая учетная запись является членом группы безопасности, которая может получить доступ к определенному веб-API. Я пытаюсь написать тест (консольную программу), который неинтерактивно получает токен доступа, используя учетные данные пользователя и идентификатор приложения в качестве аудитории, а затем вызывает конечную точку.

Как мне это сделать?

Обновление

Я пытаюсь написать набор тестов безопасности интеграции для моего приложения Web API. Приложение использует группы AAD, которые оно получает в виде набора заявок, и рассматривает их как роли. Поэтому я хочу, чтобы набор тестовых учетных записей пользователей с известным паролем с разными ролями проверял поведение конечной точки в разных контекстах безопасности. Этот подход работал для меня годами с классической AD (где я мог выдать себя за пользователя, используя пару логин / пароль и выполнить SOAP-вызов службы с включенной аутентификацией Windows).

Updated2:

Я мог бы использовать набор регистраций приложений вместо тестовых учетных записей пользователей и без проблем получить токен, используя пару client_id / client_secret , но при назначении корпоративного приложения группе безопасности требуется премиальный уровень AAD, который очень дорого: (

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Это в основном то, для чего предназначен поток грантов ROPC. Вы предоставляете Azure AD учетные данные своего приложения с учетными данными пользователя и получаете токен доступа.

Этот поток обычно не следует использовать для аутентификации, поскольку он существует в стандарте в основном как устаревший путь обновления. И он не работает с федеративными пользователями, пользователями с MFA или с просроченным паролем. Тем не менее, ваш случай автоматизированного тестирования является одним из сценариев, где я думаю, что его использование является приемлемым.

Вот пример вызова в C #:

string tokenUrl = $"https://login.microsoftonline.com/joonasapps.onmicrosoft.com/oauth2/token";
var req = new HttpRequestMessage(HttpMethod.Post, tokenUrl);

req.Content = new FormUrlEncodedContent(new Dictionary<string, string>
{
    ["grant_type"] = "password",
    ["client_id"] = "23d3be1b-a671-4452-a928-78fb842cb969",
    ["client_secret"] = "REDACTED",
    ["resource"] = "https://graph.windows.net",
    ["username"] = "testuser@joonasapps.onmicrosoft.com",
    ["password"] = "REDACTED"
});

using (var client = new HttpClient())
{
    var res = await client.SendAsync(req);

    string json = await res.Content.ReadAsStringAsync();
}

ADAL.NET не предоставляет перегрузки для этого AFAIK, поэтому вам нужно сделать это вручную, как это. Вам нужно будет заменить параметры учетными данными вашего приложения + учетными данными вашего пользователя, конечно. URL токена также должен быть указан ваш идентификатор клиента или имя домена. Измените параметр ресурса на URI идентификатора клиента / идентификатора приложения вашего API.

0 голосов
/ 06 сентября 2018

Под "неинтерактивно" вы имеете в виду окно входа в систему?Если так, учитывая описанный вами поток и архитектуру, это невозможно.Как еще вы могли бы получить учетные данные пользователей?

Вы должны использовать эту статью в качестве справочного материала при создании своего решения, чтобы понимать различные потоки и параметры OAuth 2.0, в том числе для собственного приложения.

https://docs.microsoft.com/en-us/azure/active-directory/develop/authentication-scenarios#native-application-to-web-api

...