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

调用Microsoft Graph API获取自定义用户属性报错:$select参数无效

解决Azure AD B2C自定义属性获取失败的问题

错误核心原因

400报错的本质是自定义属性名称格式不符合Microsoft Graph API要求。Azure AD B2C的自定义属性在Graph中并非直接使用customAttribute1这类名称,而是带有固定前缀的格式;同时原代码的权限范围配置错误,无法正确访问Graph API。

修复步骤

1. 获取正确的自定义属性标识

登录Azure门户进入你的AD B2C租户:

  • 打开应用注册,找到用于调用Graph的应用,复制其应用程序ID(客户端ID)
  • 去掉应用ID里的所有连字符(例:12345678-1234-1234-1234-1234567890ab → 123456781234123412341234567890ab)
  • 自定义属性的完整名称格式为:extension_<无连字符应用ID>_<原自定义属性名>,比如原customAttribute1会变成extension_123456781234123412341234567890ab_customAttribute1

2. 修正权限范围配置

客户端凭证流需要使用Microsoft Graph的应用权限,而非B2C策略权限。将获取令牌的scope替换为:

scopes=['https://graph.microsoft.com/.default']

同时需在Azure门户的应用注册中,为该应用添加User.Read.All或User.ReadWrite.All的应用权限,并完成管理员同意操作。

3. 修改后的完整代码

import msal
import requests

# Azure AD B2C基础配置
tenant_id = 'your-tenant-id'
client_id = 'your-client-id'
client_secret = 'your-client-secret'
authority = f'https://login.microsoftonline.com/{tenant_id}'

# 替换为正确格式的自定义属性名称
custom_attributes = [
    'extension_123456781234123412341234567890ab_customAttribute1',
    'extension_123456781234123412341234567890ab_customAttribute2'
]

# 初始化机密客户端应用
app = msal.ConfidentialClientApplication(
    client_id=client_id,
    client_credential=client_secret,
    authority=authority
)

# 获取Graph API访问令牌
result = app.acquire_token_for_client(scopes=['https://graph.microsoft.com/.default'])
if 'access_token' not in result:
    print("令牌获取失败:", result.get('error'), result.get('error_description'))
    exit()
access_token = result['access_token']

# 调用Graph API获取用户自定义属性
user_id = 'user-object-id'
graph_url = f'https://graph.microsoft.com/v1.0/users/{user_id}?$select={",".join(custom_attributes)}'

response = requests.get(graph_url, headers={'Authorization': f'Bearer {access_token}'})

if response.status_code == 200:
    user_data = response.json()
    print("用户自定义属性:", user_data)
else:
    print("请求错误:", response.status_code, response.text)

4. 关键验证点

  • 确认应用已获得Graph API的应用权限并完成管理员同意
  • 自定义属性名称的前缀必须是无连字符的应用ID
  • 可通过解码令牌验证其受众(audience)是否为https://graph.microsoft.com

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 17:13:21