用户分配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
相关产品推荐
相关产品推荐

