使用Microsoft Graph API Python SDK获取AAD用户数据遇权限不足
问题原因及解决方案
核心问题1:SDK与API权限不匹配
你当前使用的azure.graphrbac是针对Azure AD Graph API(旧版终结点https://graph.windows.net)的SDK,但你的应用注册里配置的权限大概率是针对Microsoft Graph API(新版终结点https://graph.microsoft.com)的,两者属于不同的API体系,权限不通用,直接导致权限校验失败。
核心问题2:权限配置的潜在问题
即使权限对应正确的API,还需要确认两点:
- 必须配置应用权限(而非委派权限):服务主体(后台运行的应用)无法使用委派权限,需添加
User.Read.All或Directory.Read.All这类应用权限 - 权限必须经过管理员授予同意:应用权限需要全局管理员或对应权限的管理员点击"授予管理员同意",否则权限不会实际生效
正确解决方案:迁移到Microsoft Graph Python SDK
步骤1:安装新版SDK
pip install msgraph-sdk pip install azure-identity
步骤2:更新应用权限
在Azure AD应用注册中,添加Microsoft Graph的应用权限:
- 搜索并添加
User.Read.All(仅读取用户基础信息)或Directory.Read.All(读取目录内所有数据,包含用户) - 点击"授予管理员同意",确保权限生效
步骤3:修改代码
使用新版SDK和Azure Identity获取凭证,调用Microsoft Graph API:
from azure.identity import ClientSecretCredential from msgraph import GraphServiceClient # 配置参数 tenant_id = "你的租户ID" client_id = "你的应用客户端ID" client_secret = "你的应用客户端密钥" # 获取服务主体凭证 credential = ClientSecretCredential( tenant_id=tenant_id, client_id=client_id, client_secret=client_secret ) # 初始化Graph客户端 graph_client = GraphServiceClient(credential) # 获取指定用户详情 user = graph_client.users.by_user_id("目标用户ObjectId").get() print(user.display_name, user.mail)
额外说明
- 旧版Azure AD Graph API已被Microsoft弃用,建议全面迁移到Microsoft Graph API以获得持续支持
- 如果因特殊需求必须使用旧版Azure AD Graph,需要在应用注册中添加Azure AD Graph的应用权限并授予同意,但不推荐这种做法
内容的提问来源于stack exchange,提问作者1gentlemann
相关产品推荐
相关产品推荐

