访问Dynamics CRM 2016 Web API时出现401错误

24

我在尝试从控制台应用程序中访问Dynamics 2016 CRM OData Web APIs时遇到了困难。

我们安装了Dynamics CRM 2016,配置了基于声明的身份验证,并使用AD FS v3.0。

我理解的是,控制台应用程序(或Web应用程序)应该能够使用Windows集成身份验证(即NTML或Kerberos)访问Web API,而无需任何特殊处理...或者启用后,OAuth流程应该可以正常工作。

对于访问Dynamics“页面”的普通用户,身份验证运行良好(重定向到AD FS登录页面),但似乎无法访问OData APIs(例如:https://crm.domain.org/api/discovery/v8.0/):

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

我尝试过的事情:

  • 如果完全禁用基于声明的身份验证,HttpClient运行良好,我可以访问OData APIs
  • 如果启用基于声明的身份验证,并通过PowerShell Add-PSSnapin Microsoft.Crm.PowerShell ; $ClaimsSettings = Get-CrmSetting -SettingType OAuthClaimsSettings; $ClaimsSettings.Enabled = $true ; Set-CrmSetting -Setting $ClaimsSettings ;激活OAuth

Windows的集成身份验证仍然无法工作,但现在可以使用Bearer身份验证。我可以使用这段代码来检索生成令牌的OAuth终结点,并使用AuthenticationContext.AcquireTokenAsync来发出令牌,然后将其传递到 Authorization HTTP标头中...但是,无论如何,我仍然遇到以下错误:

Bearer error = invalid_token,error_description = 在验证令牌期间出错!,authorization_uri = https://our.adfs.domain.org/adfs/oauth2/authorize,resource_id = https://crm.domain.org/

我漏掉了什么吗?那可能是配置问题吗?


我还在Dynamics CRM社区论坛上发布了这个问题,以防万一https://community.dynamics.com/crm/f/117/t/201151 - tsimbalar
你已经解决了这个问题吗? - Alex Gordon
1
我们最终放弃了那条路,而是使用了“即将过时”的Dynamics SDK,而不是“推荐的”Web APIs... - tsimbalar
2
你尝试使用机构的IP而不是URL了吗?这就是我们所做的,它解决了我们的问题。 - Alex Gordon
我还没有尝试过,但公平地说,我们连接到Dynamics的项目现在已经完成,我怀疑我们不会花时间去调查这个问题。不过还是谢谢你的提示! :) - tsimbalar
1个回答

7
从动态社区论坛的此答案来看,API对所需参数和标头非常严格。在进行请求时,请确保设置了Cache-Control: no-cacheContent-Type: application/x-www-form-urlencoded标头。

在使用检索到的令牌访问API的后续请求中,应以Bearer:TOKEN的形式设置Authorization标头(值得注意的是,许多人实际上认为他们可以直接放置令牌),也需要设置OData-Version: 4.0Cache-Control: no-cacheAccept: application/json标头。

查看不同的OAuth端点和先前链接的答案,我不确定授权URI是否正确(例如https://login.windows.net),所以请确保它正确。还指出,您应该使用OAuth端点URL并使用返回有效URL的WWW-Authenticate标头,即使此路由将响应401。我确定您已经看过这个示例,但它提供了一个完整的认证流程概述以及如何使用AcquireTokenAsync检索令牌,其中您需要传递资源和客户端ID。我还可能在查看更新后的页面,它可能与您无关。

您还需要检查指定的资源ID是否正确,一些人报告必须以https://crm3.domain.org/https://crm4.domain.org/的形式指定一个资源ID,而不是裸露的ID,因此这可能是一个问题。


也可能是配置问题,考虑到@l所说的IP将有效,而不是域名。这很可能是证书问题,其中未正确验证或不受信任,从而创建您看到的错误,即使它不是适当的消息。同时确保您的443端口通过了防火墙。

有趣的帖子,其中作者解释说他需要在AD FS Management控制台的表单身份验证设置才能继续进行(这是CRM 2013,但仍然可能相关)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接