我正在尝试使用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;
ResourceUri
是https://[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.
为什么?“客户是公开的”是什么意思?只是工作!
答案 0 :(得分:0)
Hrrrmph!
事实证明,我尝试过的原始情况失败了,现在有效。
New-AzureADApplicationKeyCredential
AcquireTokenAsync()
我无法解释为什么在我第一次尝试时它没有起作用,因为CRM没有提供任何关于令牌验证失败原因的信息。