我正在努力从控制台应用程序访问 Dynamics 2016 CRM OData Web API 。
我们已安装 Dynamics CRM 2016 ,使用基于声明的身份验证进行配置,并使用AD FS v3.0。
我的理解是控制台应用程序(或Web应用程序)应该能够使用Windows集成身份验证(即NTML或Kerberos)访问Web API而无需任何特殊处理......或者OAuth流程在启用时可能会起作用。
对于访问Dynamics"页面"的常规用户,身份验证工作正常(重定向到AD FS登录页面),但访问OData API似乎不起作用(例如:{{3} }):
我尝试过的事情:
如果我启用了基于声明的身份验证,并且通过PowerShell Add-PSSnapin Microsoft.Crm.PowerShell ; $ClaimsSettings = Get-CrmSetting -SettingType OAuthClaimsSettings; $ClaimsSettings.Enabled = $true ; Set-CrmSetting -Setting $ClaimsSettings ;
激活OAuth 。
Windows集成身份验证仍然无效,但现在可以使用承载身份验证。我可以使用https://crm.domain.org/api/discovery/v8.0/检索OAuth端点以生成令牌,并使用this snippet发出令牌,然后将其传递到Authorization
HTTP标头...但是,无论如何什么,我得到这个错误:
Bearer error=invalid_token, error_description
=Error during token validation!, authorization_uri=https://our.adfs.domain.org/adfs/oauth2/authorize, resource_id=https://crm.domain.org/
我错过了什么吗?这可能是一个配置问题?
答案 0 :(得分:7)
来自动态社区论坛的this answer,看起来api对它所需的参数和标题非常严格。执行请求时,请确保设置了Cache-Control: no-cache
和Content-Type: application/x-www-form-urlencoded
标头。
在随后使用检索到的令牌访问api的请求中,您应该以{{1}}的形式设置Authorization
标头(值得注意,因为很多人实际上认为他们可以直接放置令牌),Bearer: TOKEN
,OData-Version: 4.0
和Cache-Control: no-cache
也是。
查看不同的OAuth endpoints以及之前关联的答案,我不确定授权uri是否正确(例如Accept: application/json
),所以你确定&#39 ;是的。它还声明您应该使用OAuth端点网址并使用返回有效网址的https://login.windows.net
标头,即使此路由将以401响应。我确定您已经看到{ {3}},但它提供了一个非常完整的auth流概述以及如何使用传递资源和clientID的WWW-Authenticate
来检索令牌。我可能也会查看更新的页面,但它与您的情况无关。
您还想检查您指定的资源ID是否正确,有些人报告必须以AcquireTokenAsync
或https://crm3.domain.org/
的形式指定一个而不是裸露的那个,以便可能是一回事。
这也可能是一个配置问题,考虑到@l所说的IP将起作用而不是域名的事实。它很可能是一个证书问题,它没有正确验证或不受信任,因此即使它不是适当的消息也会产生您看到的错误。还要确保允许您的https://crm4.domain.org/
端口穿过防火墙。
一个有趣的this example作者解释说,他需要AD FS管理控制台的443
设置才能继续(它的CRM 2013,但可能仍然相关)。