我在尝试从控制台应用程序中访问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/
我漏掉了什么吗?那可能是配置问题吗?