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

调用API获取Azure安全组成员时userPrincipalName返回null的问题

解决Graph API调用返回userPrincipalName不一致的问题

可能的原因及排查方案

1. 权限类型与生效状态不匹配

Graph Explorer默认使用委托权限(基于当前登录用户的授权),而Fabric Notebook的Python调用大概率用的是应用权限。即便你添加了权限,也得确认:

  • 应用权限是否完成管理员同意?仅在应用注册里添加权限无效,必须由全局管理员或权限管理员确认授权,权限状态显示“已授予 [租户名] 管理员同意”才算生效。
  • 区分委托/应用权限:如果Notebook用的是用户身份登录(委托权限),要确保登录用户本身有权限查看该组内成员的UPN。

2. 组内包含非用户类型成员

安全组可能混入服务主体、其他组这类非用户对象,它们本身没有userPrincipalName字段。Graph Explorer可能自动过滤了这类结果,而Python调用会返回所有成员。可以在代码里先过滤用户类型:

import requests

group_id = "你的目标组ID"
access_token = "你的访问令牌"
api_url = f"https://graph.microsoft.com/v1.0/groups/{group_id}/members/?$select=id,displayName,userPrincipalName,@odata.type"

headers = {"Authorization": f"Bearer {access_token}"}
response = requests.get(api_url, headers=headers)
all_members = response.json().get("value", [])

# 只保留用户类型的成员
user_members = [member for member in all_members if member.get("@odata.type") == "#microsoft.graph.user"]
for user in user_members:
    print(f"UPN: {user.get('userPrincipalName')}, 名称: {user.get('displayName')}")

3. 访问令牌的权限范围验证

用本地JWT解码工具(别用在线工具,避免泄露敏感信息)检查Python调用获取的令牌:

  • 应用权限看roles字段,确认包含Directory.Read.All或User.Read.All这类能读取用户属性的权限;
  • 委托权限看scp字段,确认包含对应的权限范围。
    如果令牌里没有所需权限,说明身份验证流程有问题,得重新获取正确权限的令牌。

4. 请求参数的细节核对

再仔细比对Python代码里的请求URL:

  • 确认$select参数拼写正确,没有漏写userPrincipalName,也没有用中文符号(比如逗号);
  • 可以直接加过滤条件缩小返回范围:$filter=@odata.type eq '#microsoft.graph.user',只返回用户对象,避免非用户数据干扰。

5. Fabric Notebook的身份验证配置问题

如果Notebook用的是工作区托管身份,要确认托管身份本身被授予了Graph API的对应权限,而不是只在独立的应用注册里配置权限。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 02:36:00