无法读取Azure AD B2C自定义用户属性及相关疑问求助
Azure AD B2C自定义用户属性读取问题解答
一、如何正确读取Azure AD B2C的自定义用户属性
要成功读取自定义属性,必须严格遵循以下要求:
- 使用正确的扩展属性命名格式
自定义属性在Graph API中的名称固定为:extension_<清理后的B2C扩展应用ID>_<自定义属性名>
- 这里的B2C扩展应用ID是指Azure AD B2C租户中内置的
b2c-extensions-app应用ID,而非你自己的业务客户端ID - 需要将该ID中的所有连字符
-移除,例如原ID为12345678-1234-1234-1234-1234567890ab,清理后变为123456781234123412341234567890ab
- 确保API权限配置正确
调用Graph API读取用户属性需配置应用权限:
- 添加
User.Read.All或User.ReadWrite.All权限 - 必须完成管理员同意操作,否则会触发权限不足错误
- 修正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
相关产品推荐
相关产品推荐

