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

使用用户托管身份访问MS Graph遇认证异常求助

解决用户托管身份连接MS Graph时的CredentialUnavailableException错误

你遇到的错误核心原因是:未关联任何Azure资源的用户托管身份,无法直接在本地或非Azure计算环境的客户端代码中使用。ManagedIdentityCredential依赖Azure提供的托管身份元数据端点,这个端点只有当托管身份被绑定到Azure计算资源(如函数应用、VM、App Service等)时,资源的运行环境才会暴露;纯本地客户端环境没有这个端点,自然无法获取令牌。

方案1:将托管身份关联到Azure计算资源后运行代码

  • 在Azure门户找到你的用户托管身份,进入「关联的资源」页面
  • 添加目标Azure计算资源(如函数应用、App Service、VM等)
  • 将代码部署到该关联的资源中运行,此时ManagedIdentityCredential就能通过资源环境提供的端点正常获取令牌

方案2:本地开发用DefaultAzureCredential兼容多环境

如果需要本地开发和Azure部署环境统一代码,无需区分环境,可以改用DefaultAzureCredential,它会自动尝试多种认证方式(本地Azure CLI登录、Visual Studio登录、托管身份等):

var scopes = new[] { "https://graph.microsoft.com/.default" };
var credentialOptions = new DefaultAzureCredentialOptions 
{
    ManagedIdentityClientId = "你的用户托管身份ClientId"
};
var credential = new DefaultAzureCredential(credentialOptions);
GraphServiceClient graphClient = new GraphServiceClient(credential, scopes);
  • 本地开发时:先通过az login登录拥有对应Graph权限的Azure账号,或在Visual Studio中登录Azure账号,DefaultAzureCredential会自动拾取这些凭据
  • 部署到Azure资源时:只要资源已关联该用户托管身份,DefaultAzureCredential会自动切换为托管身份认证

补充说明

用户托管身份本质是Azure资源,必须依附在Azure计算资源上才能被代码调用获取令牌,不存在“无关联资源直接在客户端使用”的场景。你之前找到的“添加到函数应用”的示例,正是因为函数应用提供了托管身份的运行上下文。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 18:22:18