Microsoft Graph SDK未返回Azure AD B2C用户自定义属性值排查
Azure AD B2C 自定义用户属性经Graph SDK查询无返回的常见诱因
问题前置场景
已完成以下配置:
- 在B2C租户中新增自定义用户属性,且在注册登录用户流的应用声明配置中勾选该属性
- 新用户注册环节为该自定义属性赋值,登录后该属性值可正常从颁发的令牌中读取
- 调用Graph SDK时内置属性可通过
.Select()正常返回,但自定义属性在返回的AdditionalData中无匹配值 - 自定义属性命名遵循
extension_去连字符的客户端ID_自定义属性名规则
已编写的调用代码
ClientCredentialProvider authProvider = new ClientCredentialProvider(confidentialClientApplication); GraphServiceClient graphClient = new GraphServiceClient(authProvider); var customAttribute = $"extension_clientIdWithoutDash_CustomAttributeName"; var result = await graphClient.Users["2d7f1b9d-b57c-4a1a-bf56-fa27a952bacf"] .Request() .Select(customAttribute) .GetAsync(); var customAttributsAreHere = result.AdditionalData;
核心排查方向
- 属性关联的应用ID使用错误(最高发问题)
自定义扩展属性的命名前缀,并不来自用来调用Graph接口的机密客户端应用的ID,而是来自B2C租户中默认存在的b2c-extensions-app应用的客户端ID。该应用是B2C租户专门用于存储所有用户流自定义扩展属性的内置应用,所有用户流中配置的自定义属性,最终都会以这个应用的去连字符ID为前缀存储。如果错把调用方应用的ID当前缀,就算其他拼写完全正确,也无法匹配到对应的存储属性。 - 空值属性的静默过滤规则
Graph API对扩展属性的返回规则为:如果目标用户的对应扩展属性为null(包括从未赋值、被清空的状态),就算请求中明确指定了.Select()该字段,接口也不会在返回体中携带这个键值对。需要确认目标测试用户的属性值是真实持久化到用户目录中的,而不是仅在令牌生成时通过自定义声明临时拼接的。 - SDK版本与API版本不兼容
部分Microsoft Graph SDK版本对B2C场景的扩展属性存在默认拦截逻辑,同时如果调用的是beta版本的Graph接口,可能和B2C目录的扩展属性存储规则不匹配,导致字段被静默过滤。需确认调用时使用的是v1.0稳定版Graph接口,且SDK版本为最近6个月内更新的正式版。 - 应用权限覆盖不足
当前使用ClientCredential(客户端凭据)模式调用的应用,虽然能正常读取内置用户属性,但如果没有被授予应用级的User.Read.All权限,且没有完成租户管理员的管理员同意,Graph会静默过滤掉所有超出权限范围的自定义扩展字段,不会抛出权限错误提示。 - 属性名大小写不匹配
B2C目录中的扩展属性名是大小写敏感的,如果命名时对自定义属性名的大小写拼写和租户中实际存储的不一致,接口也会无返回值。
补充验证方法:可以直接在Graph Explorer中使用相同的权限调用,手动输入正确的
extension_xxx_xxx字段值查询,如果能拿到返回值,就说明是SDK侧的配置问题;如果Graph Explorer中也拿不到值,就需要先核对属性名的前缀是否正确。
内容的提问来源于stack exchange,提问作者Roesmi
相关产品推荐
相关产品推荐

