Тело должно содержать client_secret или client_assertion - PullRequest
0 голосов
/ 28 июня 2018

Я зарегистрировал новое приложение как Веб-приложение / API (не нативное), добавил разрешение для Access Dynamics 365 как пользователи организации .

enter image description here

Я следую этому руководству (https://code.msdn.microsoft.com/simple-web-api-quick-start-e0ba3d6b) с приведенным ниже кодом, единственное отличие состоит в том, что я обновил библиотеку Microsoft.IdentityModel.Clients.ActiveDirectory, которая требовала небольшого изменения кода.

//Obtain the Azure Active Directory Authentication Library (ADAL)    
AuthenticationParameters ap = AuthenticationParameters.CreateFromResourceUrlAsync(new Uri(serviceUrl + "api/data/")).Result;

AuthenticationContext authContext = new AuthenticationContext(ap.Authority, false);

//Note that an Azure AD access token has finite lifetime, default expiration is 60 minutes.
AuthenticationResult authResult = authContext.AcquireTokenAsync(
    serviceUrl, clientId, new Uri(redirectUrl), 
    new PlatformParameters(PromptBehavior.Always)).Result;

Когда я запускаю это, я получаю всплывающее окно, где я заполняю свои учетные данные, а затем выдает эту ошибку:

AdalException: {"error":"invalid_client","error_description":"AADSTS70002: The request body must contain the following parameter: 'client_secret or client_assertion'.\r\nTrace ID: xxx\r\nCorrelation ID: xxx\r\nTimestamp: 2018-06-28 10:17:20Z","error_codes":[70002],"timestamp":"2018-06-28 10:17:20Z","trace_id":"xxx","correlation_id":"xxx"}: Unknown error

Я попытался добавить client_secret, применив приведенное ниже изменение, но оно все равно не работает

AuthenticationResult authResult = authContext.AcquireTokenAsync(
    serviceUrl, clientId, new Uri(redirectUrl), 
    new PlatformParameters(PromptBehavior.Always), UserIdentifier.AnyUser, 
    $"client_secret={clientSecret}").Result;

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

AuthenticationResult authResult = authContext.AcquireTokenAsync(
    serviceUrl, new ClientCredential(clientId, clientSecret)).Result;

1 Ответ

0 голосов
/ 02 июля 2018

Потоки аутентификации Client Credential и Client Assertion предназначены для обмена данными между сервисами без участия пользователя. Таким образом, ваш веб-интерфейс будет иметь доступ к динамике не в контексте пользователя, а как сам по себе.

Взгляните на официальную вики, чтобы понять больше: https://github.com/AzureAD/azure-activedirectory-library-for-dotnet/wiki/Client-credential-flows

Также учтите, что мы не сможем вам помочь, если вы внесете изменения в Microsoft.IdentityModel.Clients.ActiveDirectory. Вы также пропустите обновления, некоторые из которых критически важны для безопасности. Но не стесняйтесь предлагать изменения, если вы думаете, что другие выиграют!

...