C# 试图通过AcquireTokenAsync获取访问令牌,但获取失败,异常正文参数必须包含';客户机机密或客户机断言';

C# 试图通过AcquireTokenAsync获取访问令牌,但获取失败,异常正文参数必须包含';客户机机密或客户机断言';,c#,access-token,azure-active-directory,C#,Access Token,Azure Active Directory,我正在尝试在没有身份验证代码的情况下获取访问令牌,所以使用下面的方法来获取它。但我面临的问题是“请求主体必须包含以下参数‘client\u secret或client\u assertion’” 你能在这方面提出必要的建议吗。在控制台应用程序中运行此操作 try { // Use the 'Microsoft.Experimental.IdentityModel.Clients.ActiveDirectory' Nuget package for auth. Authentica

我正在尝试在没有身份验证代码的情况下获取访问令牌,所以使用下面的方法来获取它。但我面临的问题是“请求主体必须包含以下参数‘client\u secret或client\u assertion’

你能在这方面提出必要的建议吗。在
控制台应用程序中运行此操作

try
{
    // Use the 'Microsoft.Experimental.IdentityModel.Clients.ActiveDirectory' Nuget package for auth.
    AuthenticationContext authContext = new AuthenticationContext(authority);
    AuthenticationResult authResult = authContext.AcquireTokenAsync(resourceId, clientId, new UserCredential(crmAdminUserName, crmAdminPassword)).Result;
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
}

Azure AD上有两种客户端,一种是公开的,另一种是机密的,这要求我们在获取令牌时提供机密

要解决此问题,可以在此场景中注册公共客户端(本机客户端应用程序)

是一篇关于将应用程序与Azure active directory集成的有用文档。

假设门户中有,并且您知道客户端id、客户端密钥/应用程序密钥、权限和访问者

然后,这个代码片段将为您获取访问令牌

AuthenticationContext authContext=新的AuthenticationContext(授权);
ClientCredential ClientCredential=新的ClientCredential(clientId,clientkey);
AuthenticationResult AuthenticationResult=等待authContext.AcquireTokenAsync(ResourceUrl,clientCredential)

资源Id/资源Url,例如{azure ad租户名称的占位符}.onmicrosoft.com

AcquireTokenAsync文档可从


AuthenticationContext类文档可从

获得。这是否可以回答您的问题:?问题是该版本的ADAL不正确支持密码授予流。它还必须在通话中发送客户端密码。这就是您收到错误消息的原因。但是我已经在我链接的答案中给出了一个解决方案,所以我不再在这里写了it@juunas:谢谢你的帮助!!。它现在正在工作,但有一个问题是,当发出PostSync呼叫时,对话框提示我不想在后台使用。我将在后端服务中执行这段代码。不需要此提示框。关于此问题的任何解决方法。@amitpatage只想提及您正在使用的ADAL实验库不是推荐或支持的库。如果您使用的是非聚合应用程序(在Azure门户中注册),请坚持使用ADAL。否则,请签出MSAL公共预览库。是否有观众?@dannyrunder我已经编辑了代码段,它是指向Azure AD租户的资源url。请参阅已编辑的文本