You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure托管标识与Dynamics 365 CRM(C#)权限问题排查

问题:Azure函数部署后调用Dynamics 365 CRM返回400错误(0x80040216)

环境信息

  • 开发语言:C# .NET6
  • 目标系统:Dynamics 365 CRM(云版)
  • 集成方式:Azure Timer函数
  • 请求方式:HttpClientFactory发起请求
  • 认证方式:MSAL托管标识(使用DefaultAzureCredential)

问题描述

通过Azure Timer函数实现Dynamics 365 CRM与SharePoint文档库的集成,Azure函数已配置托管标识并拥有系统管理员权限。本地Visual Studio调试时可正常完成查询案例、查询文档位置/文档、上传文档至案例等操作,但部署到Azure后,请求返回Http 400错误。

错误信息如下:

{
"error": {
"code": "0x80040216",
"message": "At least 1 Claim must not be NULL, current claims are : nameid=;nii=urn:federation:microsoftonline "
}
}

补充测试情况:

  • 本地Visual Studio托管标识生成的token在Postman中执行相同请求可成功
  • 尝试使用现有SharePoint集成应用注册,通过Azure函数标识token仍出现相同错误
  • 尝试使用个人Azure AD账号因MFA验证失败,无法完成测试

已尝试的操作

  • 使用Azure函数托管标识(失败)
  • 使用Visual Studio标识运行函数(成功)
  • 使用其他SharePoint集成应用注册(失败)
  • 尝试个人Azure AD账号(因MFA失败)

解决思路建议

  1. 对比token声明差异:用JWT解析工具分别解析本地VS生成的token和Azure函数生成的token,重点检查nameid等核心声明是否存在。Azure函数的token出现nameid=空值,说明认证流程没有正确获取到标识的唯一ID声明。
  2. 确认CRM应用用户配置:托管标识需要在Dynamics 365 CRM中被创建为应用用户,并关联系统管理员等对应安全角色。仅在Azure侧配置权限不足以让CRM识别该标识。
  3. 检查API权限类型:确保Azure函数托管标识在Azure AD中对Dynamics 365 CRM的API权限(如DynamicsCRM.ReadWrite.All)是应用权限而非委托权限,且已完成管理员同意。委托权限仅适用于交互式场景,不适合Azure函数这种服务端身份。
  4. 显式指定托管标识认证:在代码中显式使用ManagedIdentityCredential替代DefaultAzureCredential,排除本地凭据(如VS开发标识)对部署后认证流程的干扰,确保仅使用Azure函数的托管标识获取token。
  5. 验证SharePoint权限配置:确认托管标识在目标SharePoint站点/文档库中拥有足够权限(如站点所有者、文档库编辑权限),同时检查CRM的文档管理设置是否允许该标识执行文档上传/查询操作。
  6. 排查CRM身份验证规则:检查Dynamics 365 CRM的身份验证设置,确认是否允许服务主体(托管标识)进行非交互式认证,是否存在强制要求nameid等声明非空的配置规则。

内容的提问来源于stack exchange,提问作者shotdejager

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 23:55:23