401访问Dynamics CRM 2016 Web API

时间:2016-05-30 07:38:25

标签: oauth http-status-code-401 dynamics-crm-2016 adfs3.0

我正在努力从控制台应用程序访问 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} }):

  • 在浏览器中我收到Windows登录提示并输入有效凭据总是会导致HTTP 401未经授权的错误
  • 在浏览器中,如果我在登录页面后导航到Web API URL ,那么我可以访问Web API(即必须设置一些cookie并且我已经被隐式授权)
  • 从代码中,使用具有特定有效凭据(或当前凭据)的HttpClient,我也获得了401

我尝试过的事情:

  • 如果我完全禁用基于声明的身份验证,HttpClient工作正常,我可以访问OData API
  • 如果我启用了基于声明的身份验证,并且通过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/

我错过了什么吗?这可能是一个配置问题?

1 个答案:

答案 0 :(得分:7)

来自动态社区论坛的this answer,看起来api对它所需的参数和标题非常严格。执行请求时,请确保设置了Cache-Control: no-cacheContent-Type: application/x-www-form-urlencoded标头。

在随后使用检索到的令牌访问api的请求中,您应该以{{1​​}}的形式设置Authorization标头(值得注意,因为很多人实际上认为他们可以直接放置令牌),Bearer: TOKENOData-Version: 4.0Cache-Control: no-cache也是。

查看不同的OAuth endpoints以及之前关联的答案,我不确定授权uri是否正确(例如Accept: application/json),所以你确定&#39 ;是的。它还声明您应该使用OAuth端点网址并使用返回有效网址的https://login.windows.net标头,即使此路由将以401响应。我确定您已经看到{ {3}},但它提供了一个非常完整的auth流概述以及如何使用传递资源和clientID的WWW-Authenticate来检索令牌。我可能也会查看更新的页面,但它与您的情况无关。

您还想检查您指定的资源ID是否正确,有些人报告必须以AcquireTokenAsynchttps://crm3.domain.org/的形式指定一个而不是裸露的那个,以便可能是一回事。

这也可能是一个配置问题,考虑到@l所说的IP将起作用而不是域名的事实。它很可能是一个证书问题,它没有正确验证或不受信任,因此即使它不是适当的消息也会产生您看到的错误。还要确保允许您的https://crm4.domain.org/端口穿过防火墙。

一个有趣的this example作者解释说,他需要AD FS管理控制台的443设置才能继续(它的CRM 2013,但可能仍然相关)。