正文必须包含 client_secret 或 client_assertion
Body must contain client_secret or client_assertion
我将新应用程序注册为 Web 应用程序/API(非本机),添加了 Access Dynamics 365 作为组织用户的权限.
我按照本指南 (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;
客户端凭据和客户端断言身份验证流程用于服务到服务的通信,无需用户参与。因此您的 Web Api 将不会在用户的上下文中访问 Dynamics,而是作为它本身。
查看官方 wiki 以了解更多信息:https://github.com/AzureAD/azure-activedirectory-library-for-dotnet/wiki/Client-credential-flows
此外,请注意,如果您对 Microsoft.IdentityModel.Clients.ActiveDirectory 进行更改,我们将无法为您提供帮助。您还会错过更新,其中一些更新对安全至关重要。但如果您认为其他人会受益,请随时提出更改!
我将新应用程序注册为 Web 应用程序/API(非本机),添加了 Access Dynamics 365 作为组织用户的权限.
我按照本指南 (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;
客户端凭据和客户端断言身份验证流程用于服务到服务的通信,无需用户参与。因此您的 Web Api 将不会在用户的上下文中访问 Dynamics,而是作为它本身。
查看官方 wiki 以了解更多信息:https://github.com/AzureAD/azure-activedirectory-library-for-dotnet/wiki/Client-credential-flows
此外,请注意,如果您对 Microsoft.IdentityModel.Clients.ActiveDirectory 进行更改,我们将无法为您提供帮助。您还会错过更新,其中一些更新对安全至关重要。但如果您认为其他人会受益,请随时提出更改!