尝试 Web API Dynamics 365 CRM - 403-禁止错误

Posted

技术标签:

【中文标题】尝试 Web API Dynamics 365 CRM - 403-禁止错误【英文标题】:Trying Web API Dynamics 365 CRM - 403-Forbidden error 【发布时间】:2021-02-19 14:41:40 【问题描述】:

我正在尝试关注一些有关使用 Web API 与 Dynamics 365 CRM 集成的 MS 文档,但由于我的组织使用不易连接的多因素身份验证方法,我遇到了困难。

我已经尝试在代码中使用应用密码,但失败了。 已经在 Azure AD 上注册了应用,授予了权限,修改了清单,生成了密钥。

我基于 MS 文档所做的最后一次尝试是

`使用 Microsoft.IdentityModel.Clients.ActiveDirectory; 使用 System.Net.Http.Headers; 使用 System.Net.Http; 使用 Newtonsoft.Json.Linq; 使用系统; 使用 System.Configuration; 使用 Newtonsoft.Json; 使用静态 System.Console; 命名空间 CRM_WebApi 课堂节目 静态无效主要(字符串 [] 参数) 字符串 serviceUrl = "https://MY-ORG.api.crm.dynamics.com"; string clientId = "f8dea8ad-b993-4161-8743-***********X"; 字符串秘密 = "X*x*x*x*x*_lm2_DUo.0Dj_5_Wvkgu~eAY4"; 字符串 redirectUrl = "http://localhost"; AuthenticationContext authContext = new AuthenticationContext("https://login.microsoftonline.com/MY-ORG/oauth2/authorize"); ClientCredential credential = new ClientCredential(clientId, secret); AuthenticationResult 结果 = authContext.AcquireToken(serviceUrl, credential); //访问令牌 字符串 accessToken = result.AccessToken; 使用(HttpClient 客户端 = 新 HttpClient()) client.BaseAddress = new Uri(serviceUrl); client.Timeout = new TimeSpan(0, 2, 0); //2分钟 client.DefaultRequestHeaders.Add("OData-MaxVersion", "4.0"); client.DefaultRequestHeaders.Add("OData-Version", "4.0"); client.DefaultRequestHeaders.Accept.Add( 新的 MediaTypeWithQualityHeaderValue("application/json")); HttpRequestMessage 请求 = 新的 HttpRequestMessage(HttpMethod.Get, "/api/data/v9.1/WhoAmI"); //设置访问令牌 request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); HttpResponseMessage 响应 = client.SendAsync(request).Result; 如果(响应。IsSuccessStatusCode) //获取响应内容并解析。 JObject body = JObject.Parse(response.Content.ReadAsStringAsync().Result); Guid userId = (Guid)body["UserId"]; Console.WriteLine("您的系统用户 ID 为:0", userId); `

这次我得到了令牌,但得到了响应 403-Forbidden。

StatusCode: 403, ReasonPhrase: 'Forbidden', 版本: 1.1, 内容: System.Net.Http.StreamContent, 标头: x-ms-service-request-id: 51067dc4-670c-4417-84b6-600044745e18 x-ms-service-request-id: 04dd42b7-898d-4935-9c7e-20c1e7028a10 严格的传输安全性:max-age=31536000; includeSubDomains REQ_ID: 04dd42b7-898d-4935-9c7e-20c1e7025b20 AuthActivityId:fb3e62d9-4e1e-405f-846a-711e6ccc5555 X-来源:18921112101886374119914120471128195219221222118018411711623541331812331911702441xxx* X-来源:2441011722446104156421301162318117713035251169236256193231163106232101179236129xxx 公共:OPTIONS、GET、HEAD、POST Timing-Allow-Origin:* 日期:2020 年 11 月 6 日星期五 20:56:25 GMT 设置 Cookie:ARRAffinity=f439e98480c5c889aa462a387e36ac04f192110c01737e1e00da32e45cedxx; 域=MY-ORG.api.crm.dynamics.com;路径=/; 安全的; HttpOnly 内容长度:89 允许:OPTIONS 允许:GET 允许:HEAD 允许:POST

有人遇到过类似的问题吗?你能指导我解决这个问题吗?

【问题讨论】:

嗨,您有机会查看我的答案吗?如果它有帮助,您可以将其标记为已接受。谢谢。 【参考方案1】:

根据您的代码,您指的是 Connect as an app 以获取访问令牌。

请注意文档声明:

在注册应用程序时,您遵循的许多相同步骤在 演练:向 Azure Active Directory 注册应用程序,使用 以下例外情况

您无需授予以组织用户身份访问 Dynamics 365 权限。

此应用程序将绑定到特定的用户帐户。

因此您无需在 Azure AD 应用中添加委派权限。你需要做的是Common Data Service user account bound to the registered app和Manually create a Common Data Service application user。

之后,您可以获得具有足够权限的访问令牌。

【讨论】:

并记住赋予应用程序用户安全角色以访问资源。

以上是关于尝试 Web API Dynamics 365 CRM - 403-禁止错误的主要内容,如果未能解决你的问题,请参考以下文章

Dynamics 365 Web API 与Organization Services的区别及其功能深度分析

Dynamics CRM 2015/2016/365 Web API:级联查询

利用Fiddler修改请求信息通过Web API执行Dynamics 365操作(Action)实例

Dynamics CRM 2015/2016/365 Web API:用户模拟

不借助工具在浏览器中通过Web API执行Dynamics 365操作(Action)实例

Dynamics CRM 2015/2016/365 Web API:级联查询