25

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

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

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

对于访问动态“页面”的普通用户,身份验证工作正常(重定向到 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 集成身份验证仍然不起作用,但现在可以使用 Bearer 身份验证。我可以使用此代码段来检索 OAuth 端点以生成令牌,并AuthenticationContext.AcquireTokenAsync用于发出令牌,然后将其传递到AuthorizationHTTP 标头中……但是,无论如何,我都会收到此错误:

    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/

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

4

1 回答 1

7

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

在随后使用检索到的令牌访问 api 的请求中,您应该将Authorization标头设置为Bearer: TOKEN(值得注意,因为很多人实际上认为他们可以直接放置令牌)、theOData-Version: 4.0Cache-Control: no-cacheoneAccept: application/json的形式。

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

您还想检查您指定的资源 id 是否正确,有些人报告说必须以https://crm3.domain.org/https://crm4.domain.org/而不是裸的形式指定一个,所以这可能是一回事。


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

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

于 2017-05-16T04:41:55.143 回答