Получаване на токен за уеб API с помощта на потребителски идентификационни данни

Създадох нов потребителски акаунт в моя тестов клиент на AAD, кажете [email protected] и задайте парола за него. Този нов акаунт е член на група за сигурност, която има достъп до конкретен уеб API. Опитвам се да напиша тест (конзолна програма), който неинтерактивно получава токен за достъп, използвайки потребителските идентификационни данни и идентификатора на приложението като аудитория и след това извиква крайна точка.

Как да направя това?

Актуализация:

Опитвам се да напиша набор от тестове за сигурност на интеграцията за моето уеб API приложение. Приложението използва AAD групи, които получава като набор от твърдения и ги третира като роли. Така че искам набор от тестови потребителски акаунти с известна парола с различни роли, за да тествам поведението на крайна точка при различни контексти на сигурност. Подходът работеше за мен години наред с класическия AD (където можех да се представя за потребител, използвайки двойка вход/парола и да извърша SOAP повикване към услуга с активирано Windows Auth).

Актуализирано 2:

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


person UserControl    schedule 06.09.2018    source източник


Отговори (2)


По принцип това е целта на потока за предоставяне на идентификационни данни на собственик на ресурс (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"] = "[email protected]",
    ["password"] = "REDACTED"
});

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

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

ADAL.NET не излага претоварване за извършване на това AFAIK, така че трябва да го направите ръчно по този начин. Ще трябва да замените параметрите с идентификационните данни на вашето приложение + идентификационните данни на вашия потребител, разбира се. URL адресът на токена също се нуждае от вашия идентификатор на клиент или име на домейн. Променете параметъра за ресурс на вашия API клиентски идентификатор/идентификационен номер на приложение URI.

person juunas    schedule 06.09.2018

Под „неинтерактивно“ имате предвид прозореца за влизане? Ако е така предвид потока и архитектурата, които сте описали, това не е възможно. Как иначе бихте получили потребителските идентификационни данни?

Трябва да използвате тази статия като справка, когато създавате вашето решение, за да разберете различните потоци и опции на OAuth 2.0, включително тези за собствено приложение.

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

person Mehdi Ibrahim    schedule 06.09.2018
comment
Но вече имам идентификационни данни (двойка име на акаунт/парола). Просто не разбирам какво ми пречи да получа токен неинтерактивно, ако мога да го получа с имплицитен поток? - person UserControl; 06.09.2018
comment
имплицитният поток все още ще се нуждае от активна сесия и потребителят да бъде удостоверен поне веднъж. Моля, вижте дали този ресурс ви помага: azure .microsoft.com/en-us/resources/samples/ - person Mehdi Ibrahim; 06.09.2018
comment
Благодаря ти, Мехди! За съжаление нито един от сценариите няма да работи за мен - първият се нуждае от потребителска сесия, вторият се нуждае от домейн среда :( - person UserControl; 06.09.2018
comment
Друга мисъл би била да се създаде прост визуален студио кодиран потребителски интерфейс тест за автоматизиране на популацията от идентификационни данни и вашето тестване. - person Mehdi Ibrahim; 06.09.2018
comment
Добра идея, благодаря! Вероятно ще трябва да направя интерактивни потребителски акаунти, под които моите CI агенти работят. - person UserControl; 06.09.2018
comment
@MehdiIbrahim Изглежда, че не сте чували за потока за предоставяне на идентификационни данни на собственик на ресурс, който съществува точно за тази цел. Има своите ограничения, но автоматизираното API тестване е мястото, където го използвам и аз лично. - person juunas; 06.09.2018
comment
@juunas, моля, разяснете как да приложите това с Azure. - person Mehdi Ibrahim; 06.09.2018
comment
Добавих отговор :) - person juunas; 06.09.2018
comment
благодаря juunas, @UserControl, моля, опитайте алтернативното предложение, за да видите дали решава проблема ви - person Mehdi Ibrahim; 06.09.2018