为什么CRM Online在我的方案中返回401未授权?

Tom*_*m W 7 dynamics-crm azure-active-directory

我正在尝试使用Dynamics CRM Online 2016和BizTalk 2013 R2实现服务器到服务器的集成.我使用WebHttpBinding来调用CRM Web API,这需要一个作为http头提供的持有者令牌:

Authorization: Bearer [base64string]

我编写了一个客户端消息检查器,它使用ADAL调用Azure AD来获取访问令牌.这是通过客户端断言证书保护的,该证书已分配给AD租户中的已注册应用程序:

var token = context.AcquireTokenAsync(this.ResourceUri, assertionCert).Result;

  • ResourceUrihttps://[myorganisation].crm4.dynamics.com
  • assertionCert 是使用应用程序注册应用程序ID和机器证书存储区中的x509证书创建的ClientAssertionCertificate,该证书存储区作为KeyCredential注册到应用程序

这"有用",因为它返回一个令牌,我可以解码这个令牌来检查声明 - 其中有相当数量,我无法确定这是否是CRM要求的一组声明.

AD应用程序注册配置了对CRM实例的委派权限.

我已将CRM本地用户中的应用程序ID设置为应用程序注册的应用程序ID.

在调用webAPI并提供此令牌时,CRM会响应401 unauthorized.

我在powershell脚本和PostMan中重复了相同的过程,所有这些过程似乎都表现出相同的行为.

我还应该做些什么来让CRM接受我的访问令牌?

编辑#1:尝试硬编码权限URI https://login.windows.net/[my-tenant-id]/oauth2/token而不是动态获取权限的内容AuthenticationParameters- 这是相同的值,除了以/ authorization而不是/ token结尾.这是零差异.

编辑#2:我正在使用的管理员向我指出,我期望使用的应用程序用户没有分配用户角色 - 这已被修改为具有允许API访问的角色,但这也没有区别.

编辑#3:oauth2AllowImplicitFlow在应用注册的清单中设置为true.这没有任何区别.

编辑#4:通过创建新的应用注册取得了一些进展,这次是作为Native应用而不是Web应用.我设法使用客户端密钥获取令牌,这被接受了 - 但是在将证书分配给应用程序并像以前一样呈现ClientAssertionCertificate时,我从权威机构获得响应:

Error validating credentials. AADSTS50012: Client is public so a client_assertion' should not be presented.

为什么?"客户公开"是什么意思?只是工作!

Tom*_*m W 0

哼哼!

事实证明,我原来尝试过但失败的情况现在可以了。

  • 具有 CRM Online 委派权限的 Web 应用程序注册
  • 在客户端计算机上安装客户端证书,并使用以下命令将相同的证书注册到应用程序New-AzureADApplicationKeyCredential
  • 将应用程序注册链接到为此目的创建的 CRM应用程序用户(它们与交互式用户根本不同) - 注意此屏幕不容易找到
  • AcquireTokenAsync()来自 ADAL 的电话
  • 正常工作

我无法解释为什么这在我第一次尝试时不起作用,因为 CRM 不提供任何有关令牌验证失败原因的信息。