Получить токен доступа от Azure AD, используя имя пользователя и пароль для Azure DevOps REST Api - PullRequest
0 голосов
/ 03 марта 2020

Мы внедряем зарегистрированное приложение AD (развернутое как Azure Служба приложений) для доступа к Azure DevOps Rest Api. Я следовал инструкциям по аутентификации, предоставленным для Azure DevOps, и с помощью контекста аутентификации получал токен доступа, отправляя имя пользователя и пароль. Хотя MS не рекомендует этот процесс аутентификации, причина, по которой мы это делаем, заключается в том, что у учетной записи пользователя есть права на c доступ к нескольким проектам в разных организациях . Таким образом, мы получаем токен для этого пользователя и получаем доступ к Azure DevOps REST Api, доступным для пользователя. По сути, мы создали общую учетную запись пользователя c, которая может получать доступ к DevOps REST Api из моего приложения.

В локальной среде я могу получить маркер доступа для пользователя, используя следующий код:

AuthenticationContext ctx = new AuthenticationContext("https://login.microsoftonline.com/org.onmicrosoft.com/");            
AuthenticationResult result = null;

var username = "********"; // This is your AAD username in the form user@domain.com.
var password = "********"; // This is your AAD password.            

var adalCredential = new UserPasswordCredential(username, password);
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;

try
{
    result = ctx.AcquireTokenAsync(azureDevOpsResourceId, clientId, adalCredential).Result;                
    Console.WriteLine("Token expires on: " + result.ExpiresOn);
}
catch (Exception ex)
{
    Console.WriteLine("{0}: {1}", ex.GetType(), ex.Message);
}

Тот же код при доступе через веб-приложение работает не так, как ожидалось, и выдает ниже ADAL Exception,

System.AggregateException: One or more errors occurred. ---> Microsoft.IdentityModel.Clients.ActiveDirectory.AdalException: parsing_wstrust_response_failed: Parsing WS-Trust response failed
   at Microsoft.IdentityModel.Clients.ActiveDirectory.Internal.WsTrust.WsTrustResponse.CreateFromResponseDocument(XDocument responseDocument, WsTrustVersion version)
   at Microsoft.IdentityModel.Clients.ActiveDirectory.Internal.WsTrust.WsTrustRequest.<SendRequestAsync>d__3.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
   at Microsoft.IdentityModel.Clients.ActiveDirectory.Internal.Flows.AcquireTokenNonInteractiveHandler.<PreTokenRequestAsync>d__5.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
   at Microsoft.IdentityModel.Clients.ActiveDirectory.Internal.Flows.AcquireTokenHandlerBase.<RunAsync>d__57.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext.<AcquireTokenCommonAsync>d__37.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContextIntegratedAuthExtensions.<AcquireTokenAsync>d__0.MoveNext()
   --- End of inner exception stack trace ---
   at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
   at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
   at System.Threading.Tasks.Task`1.get_Result()

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

1 Ответ

0 голосов
/ 04 марта 2020

Честно говоря, этот код выглядит нормально. Тем не менее, из сообщения об ошибке, кажется, что не был получен успешный ответ.

Я создаю тестовое веб-приложение с вашим кодом для получения токена. Моя среда:. NET framework 4.7.2 и ADAL 5.2.7. В результате я могу успешно получить токен.

enter image description here

Таким образом, вы можете попытаться выполнить обновление до последней версии ADAL и развернуть ваше веб-приложение в новом веб-приложении.

Если проблема все еще возникает, вы можете попытаться напрямую сделать http-запрос для получения токена:

POST https://login.microsoftonline.com/{tenant-id}/oauth2/token
Content-Type: application/x-www-form-urlencoded

grant_type=password
&resource={resource}
&username={username}
&password={password}
&client_id={client-id}

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...