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

无法读取Azure AD B2C自定义用户属性及相关疑问求助

Azure AD B2C自定义用户属性读取问题解答

一、如何正确读取Azure AD B2C的自定义用户属性

要成功读取自定义属性,必须严格遵循以下要求:

  1. 使用正确的扩展属性命名格式
    自定义属性在Graph API中的名称固定为:extension_<清理后的B2C扩展应用ID>_<自定义属性名>
  • 这里的B2C扩展应用ID是指Azure AD B2C租户中内置的b2c-extensions-app应用ID,而非你自己的业务客户端ID
  • 需要将该ID中的所有连字符-移除,例如原ID为12345678-1234-1234-1234-1234567890ab,清理后变为123456781234123412341234567890ab
  1. 确保API权限配置正确
    调用Graph API读取用户属性需配置应用权限:
  • 添加User.Read.All或User.ReadWrite.All权限
  • 必须完成管理员同意操作,否则会触发权限不足错误
  1. 修正Go代码中的请求URL
    将代码中的URL替换为符合规范的格式,示例如下:
import "strings"

func GetExtensionForUserId(userId, clientId, tenantId, extensionName, bearerToken, b2cExtensionsAppId string) (string, error) {
    // 清理扩展应用ID,移除所有连字符
    cleanedAppId := strings.ReplaceAll(b2cExtensionsAppId, "-", "")
    // 构建合规的请求URL
    urlStr := fmt.Sprintf("https://graph.microsoft.com/v1.0/users/%s?$select=userPrincipalName,extension_%s_%s", userId, cleanedAppId, extensionName)
    fmt.Printf("url: %v\n", urlStr)
    
    req, err := http.NewRequest("GET", urlStr, nil)
    req.Header.Add("Authorization", "Bearer "+bearerToken)

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        fmt.Printf("Error:  %v\n", err)
        return "", err
    }
    defer func(Body io.ReadCloser) {
        err := Body.Close()
        if err != nil {
            fmt.Printf("Error from Body.Close(): %v\n", err)
        }
    }(resp.Body)

    if resp.StatusCode != http.StatusOK {
        errStr := fmt.Sprintf("Status: %v", resp.Status)
        fmt.Printf("%v\n", errStr)
        return "", errors.New(errStr)
    }

    bodyBytes, err := io.ReadAll(resp.Body)
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return "", err
    }

    return string(bodyBytes), nil
}

二、为什么userPrincipalName不在用户属性列表却能获取到

userPrincipalName是Azure AD/B2C的内置核心属性,这类属性默认存在于所有用户对象中,无需在B2C的用户属性列表中手动配置即可通过Graph API读取。B2C用户属性列表仅展示自定义添加的属性及部分可选内置属性,并非所有内置属性都会在此列出。

常见错误排查

  • 若仍返回400错误,检查属性名是否完全匹配(扩展属性名严格区分大小写)
  • 确认自定义属性已在B2C租户中创建,且目标用户已被设置过该属性的值
  • 验证请求使用的Bearer Token是否具备足够权限(可通过Graph Explorer工具测试)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 10:52:33