Dynamics CRM是否可对OrganizationData服务实现身份模拟?
Dynamics CRM OrganizationData 服务身份模拟实现方案(规避NTLM)
以下两种方案均可实现需求,无需依赖NTLM协议:
方案1:原生请求头模拟(改动最小,优先选择)
CRM 2011 OrganizationData OData端点原生支持通过请求头传递模拟用户标识,无需依赖Windows身份上下文的模拟能力:
- 调用服务时在请求头中新增
CallerId字段,值为待模拟的CRM用户的GUID,该机制是CRM官方提供的模拟能力,和身份认证协议完全解耦。 - 身份认证层直接对接OAuth2即可:如果是On-Premises部署的CRM可配合ADFS配置OAuth认证,Online版本直接对接Azure AD OAuth,全程不需要用到NTLM协议。
- 如果你使用的是自动生成的WCF Data Services客户端代理,可通过请求拦截逻辑统一注入头信息,示例代码如下:
// 初始化OrganizationData上下文 var orgContext = new OrganizationDataContext(new Uri("https://crm/OnBoarding/XRMServices/2011/OrganizationData.svc/")); // 配置OAuth认证凭证,替代NTLM认证 orgContext.Credentials = /* 你的OAuth访问凭证,可使用客户端凭证流或委托令牌 */; // 统一注入模拟用户头 orgContext.SendingRequest2 += (sender, eventArgs) => { eventArgs.RequestMessage.SetHeader("CallerId", "【替换为待模拟用户的CRM系统GUID】"); };
方案2:用户令牌委托模式
如果需要严格模拟前端登录用户的身份权限,可采用令牌委托的方式:
- 前端层获取当前登录用户的OAuth访问令牌,传递到后端服务
- 后端直接使用该用户令牌调用OrganizationData服务,同时可根据需求决定是否需要额外注入
CallerId头切换模拟身份,全程不需要处理用户密码,也不需要NTLM协议支持。
前置配置要求
- 你用于调用CRM服务的基础服务账号,需要在CRM安全角色中配置
Act on behalf of another user(代表其他用户执行操作)权限,否则模拟请求会返回403错误。 - 如果你的CRM实例版本高于2016,也可以选择将原有代码的OData调用适配到新版Web API端点,但如果要最大限度复用遗留代码,方案1的改动量最小。
内容的提问来源于stack exchange,提问作者Krzysztof
相关产品推荐
相关产品推荐

