正文必须包含client_secret或client_assertion

时间:2018-06-28 10:26:24

标签: c# azure-active-directory adal dynamics-crm-online

我将新应用程序注册为 Web应用程序/ 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 :(得分:1)

Client Credential和Client Assertion身份验证流旨在用于服务之间的通信,而无需用户参与。因此,您的Web Api不会在用户上下文中而是在其本身中访问Dynamics。

请查看官方Wiki以了解更多信息:https://github.com/AzureAD/azure-activedirectory-library-for-dotnet/wiki/Client-credential-flows

此外,请注意,如果您对Microsoft.IdentityModel.Clients.ActiveDirectory进行更改,我们将无法为您提供帮助。您还会错过更新,其中一些对安全性至关重要。但是,如果您认为其他人会受益,请随时提出更改!