401访问Dynamics CRM 2016 Web API时

tsi*_*lar 25 oauth http-status-code-401 adfs3.0 dynamics-crm-2016

我正在努力从控制台应用程序访问Dynamics 2016 CRM OData Web API.

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

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

对于访问Dynamics"pages"的常规用户,身份验证工作正常(重定向到AD FS登录页面),但访问OData API似乎不起作用(例如:https://crm.domain.org/api/发现/ v8.0 /):

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

我尝试过的事情:

  • 如果我完全禁用基于声明的身份验证,HttpClient工作正常,我可以访问OData API
  • 如果我启用基于声明的身份验证,并通过PowerShell 激活OAuthAdd-PSSnapin Microsoft.Crm.PowerShell ; $ClaimsSettings = Get-CrmSetting -SettingType OAuthClaimsSettings; $ClaimsSettings.Enabled = $true ; Set-CrmSetting -Setting $ClaimsSettings ;.

    Windows集成身份验证仍然不起作用,但现在可以使用承载身份验证.我可以使用此代码段检索OAuth端点以生成令牌,并用于AuthenticationContext.AcquireTokenAsync发出令牌,然后在AuthorizationHTTP Header中传递它...但是,无论如何,我都会收到此错误:

    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/

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

Bal*_*zar 7

从动态社区论坛的答案来看,api看起来非常严格,它需要的参数和标题.执行请求时,请确保已设置Cache-Control: no-cacheContent-Type: application/x-www-form-urlencoded标头.

在随后使用检索到的令牌访问api的请求中,您应该AuthorizationBearer: TOKEN(由于许多人实际上认为他们可以直接放置令牌)的形式设置标头OData-Version: 4.0,Cache-Control: no-cache并且Accept: application/json也是.

查看不同的OAuth 端点和之前链接的答案,我不确定授权uri是否正确(例如https://login.windows.net),所以你确定这是正确的.它还声明你应该使用OAuth端点url并使用WWW-Authenticate返回有效端点的标头,即使这条路由将以401响应.我相信你已经看过这个例子了,但是它提供了一个非常全面的概述. auth flow以及如何使用AcquireTokenAsync传递资源和clientID的位置检索令牌.我可能也在查看更新的页面,它与您的情况无关.

您还想检查您指定的资源ID是否正确,有些人报告必须以裸体形式指定https://crm3.domain.org/https://crm4.domain.org/代替裸体,这可能是一回事.


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

一篇有趣的帖子,作者解释说Form Authentication他需要设置AD FS管理控制台才能继续(它是CRM 2013,但可能仍然相关).