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

用户分配Managed Identity调用MS Graph API返回401未授权问题

Azure ML中使用用户分配托管身份调用MS Graph API返回401未授权

问题描述

我创建了用户分配的托管标识,为其授予MS Graph API的Sites.Read.All权限,在Azure机器学习中创建笔记本实例并分配该托管身份后,运行以下代码返回401未授权错误:

import requests
from azure.identity import ManagedIdentityCredential

CLIENT_ID = "CLIENT_ID_OF_MANAGED_IDENTITY"
SITE_ID = "MY_SHAREPOINT_SITE_ID"
SCOPE = f"https://graph.microsoft.com/.default"

cred = ManagedIdentityCredential(client_id=CLIENT_ID)
token = cred.get_token(SCOPE).token

hdr = {"Authorization": f"Bearer {token}"}
url = f"https://graph.microsoft.com/v1.0/sites/{SITE_ID}"

response = requests.get(url, headers=hdr)
print(response.status_code)
print(response.json())

返回错误结果:

{
  "error": {
    "code": "unauthenticated",
    "message": "Request is allowed in this context.",
    "innerError": {
      "date": "2025-11-19T08:23:57",
      "request-id": "03478006-41c9-4b5f-9742-14c3b5338004",
      "client-request-id": "03478006-41c9-4b5f-9742-14c3b5338004"
    }
  }
}

已知信息:

  • 使用个人凭据通过ManagedIdentityCredential或DefaultAzureCredential可正常运行
  • 生产环境需在Azure ML集群上运行,无法使用用户凭据
  • 已验证token包含正确的aud=https://graph.microsoft.com和Sites.Read.All角色
  • 组织政策未拦截MS Graph API流量
  • 机器学习工作区已分配同一托管身份
  • 环境:Python 3.10、azure.identity 1.21.0、Azure机器学习Standard_NC4as_T4_v3虚拟机

排查与解决方案

1. 确认权限类型为应用权限

用户分配的托管标识属于应用身份,只能使用MS Graph的应用权限,而非委派权限:

  • 进入Azure AD → 应用注册 → 找到该托管标识 → 权限 → 确认Sites.Read.All的类型是“应用权限”
  • 确保已完成管理员同意(应用权限需要全局管理员或对应角色的管理员审批)

2. 验证Azure ML计算资源的托管身份配置

仅在工作区分配托管标识不够,需确认计算实例/集群已启用该用户分配的托管身份:

  • 进入Azure ML工作区 → 计算 → 目标计算实例/集群 → 编辑 → 身份 → 用户分配的托管标识 → 确认已添加目标标识并处于启用状态
  • 若刚添加配置,需重启计算实例/集群使设置生效

3. 解码token确认角色声明

虽然已验证token包含Sites.Read.All,需确认该权限存在于roles字段(应用权限标识)而非scp字段(委派权限标识):

  • 用Python解码token(需先安装pyjwt):
    import jwt
    decoded = jwt.decode(token, options={"verify_signature": False})
    print(decoded.get("roles"))
    
  • 若roles中无Sites.Read.All,说明权限未正确授予,需重新配置并等待15-30分钟让权限同步

4. 检查SharePoint站点ID格式

站点ID需符合{租户域名},{站点集ID},{站点ID}格式(例如contoso.sharepoint.com,12345678-1234-1234-1234-1234567890ab,abcdef12-3456-7890-abcd-ef1234567890):

  • 可通过调用GET https://graph.microsoft.com/v1.0/sites/{租户域名}:/sites/{站点名称}获取正确的站点ID
  • 格式错误可能触发401未授权错误

5. 确认计算资源的网络访问权限

即使组织政策未拦截,需检查Azure ML计算资源的网络配置:

  • 若计算资源在虚拟网络中,确认NSG出站规则允许访问https://graph.microsoft.com(端口443)
  • 若使用Azure防火墙,需添加Graph API的服务标签到允许列表

6. 更新azure.identity库版本

旧版本的azure-identity可能存在托管身份认证的已知问题,升级到最新稳定版:

pip install --upgrade azure-identity

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 00:47:02