Oauth 401访问Dynamics CRM 2016 Web API时

Oauth 401访问Dynamics CRM 2016 Web API时,oauth,http-status-code-401,dynamics-crm-2016,adfs3.0,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登录页面),但访问OD

我正在努力从控制台应用程序访问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似乎不起作用(例如:):

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

  • 如果我完全禁用基于声明的身份验证,HttpClient工作正常,我可以访问ODataAPI
  • 如果我保持基于声明的身份验证处于启用状态,并通过PowerShell
    在Microsoft.Crm.PowerShell中添加PSSnapin激活OAuth$ClaimsSettings=获取CrmSetting-设置类型OAuthClaimsSettings$ClaimsSettings.Enabled=$true;设置CrmSetting-设置$claimsettings

    Windows集成身份验证仍然不起作用,但现在可以使用承载身份验证。我可以使用来检索OAuth端点以生成令牌,并使用来发出令牌,然后将其传递到
    Authorization
    HTTP头中。。。但是,不管怎样,我得到了这个错误:

    承载错误=无效的\u令牌,错误\u描述
    =令牌验证期间出错!,授权uri=https://our.adfs.domain.org/adfs/oauth2/authorize,资源id=https://crm.domain.org/

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

从dynamics社区论坛上看,api似乎对所需的参数和头非常严格。执行请求时,确保设置了
缓存控制:无缓存
内容类型:application/x-www-form-urlencoded
标题

在使用检索到的令牌访问api的后续请求中,您应该以
承载者:令牌
的形式设置
授权
标题(值得注意的是,许多人实际上认为他们可以直接放置令牌),
OData版本:4.0
缓存控制:无缓存
Accept:application/json
也有

查看不同的OAuth和前面链接的答案,我不确定授权uri是否正确(例如
https://login.windows.net
),所以请确保这是正确的。还指出,您应该使用OAuth端点url并使用返回有效url的
WWW-Authenticate
头,即使此路由将以401响应。我相信您已经看到了,但它提供了一个相当完整的身份验证流概述,以及如何使用
AcquireTokenAsync
检索令牌,您可以在其中传递资源和clientID。我可能也在看一个更新的页面,但它与您的情况无关

您还需要检查您指定的资源id是否正确,一些人报告说必须以
https://crm3.domain.org/
https://crm4.domain.org/
而不是光秃秃的,所以这可能是一回事


这也可能是一个配置问题,因为@l所说的事实是IP可以代替域名工作。这很可能是一个证书问题,没有正确验证或不受信任,因此即使不是适当的消息,也会产生您看到的错误。还要确保允许您的
443
端口通过防火墙


有趣的是,作者解释说,AD FS管理控制台的
表单身份验证设置是他继续工作所必需的(这是CRM 2013,但可能仍然相关)。

我也在Dynamics CRM社区论坛上发布了这个问题,以防万一,你能解决这个问题吗?我们只是放弃了这条路,最终使用了“过时之路”Dynamics SDK而不是“推荐的”Web API…你是否尝试使用IP而不是组织的url?这就是我们所做的,它解决了我们的问题。虽然我还没有尝试过,但公平地说,我们与动力学相关的项目现在已经完成,我怀疑我们是否会花时间来调查这个问题。不过,谢谢你的提示!:)