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

时间:2017-04-13 10:23:18

标签: 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创建的ClientAssertionCertificate,以及作为KeyCredential注册到应用程序的计算机证书存储中的x509证书

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

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.

为什么?“客户是公开的”是什么意思?只是工作

1 个答案:

答案 0 :(得分:0)

Hrrrmph!

事实证明,我尝试过的原始情况失败了,现在有效。

  • 使用CRM Online的委派权限进行Web应用程序注册
  • 在客户端计算机上安装客户端证书,并使用New-AzureADApplicationKeyCredential
  • 将相同的证书注册到应用程序
  • 将应用注册链接到为此目的创建的CRM 应用用户(它们与交互式用户根本不同) - n.b.这个屏幕不容易找到
  • 从ADAL致电AcquireTokenAsync()
  • 正常工作

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