Azure AD B2C登录时如何为REST API claims exchange配置额外输入声明
问题根因
注册流程能正常传递自定义属性,登录时却只传objectId,本质是两个流程的声明加载逻辑存在差异:
- 新用户注册环节,自定义属性一般是注册表单的采集字段,值会直接写入用户目录对象,同时同步进入当前请求的声明上下文,所以调用REST API时自然能被读取并传递。
- 常规登录流程的默认声明加载链路,只会拉取B2C内置的核心用户属性(比如objectId、邮箱、显示名),不会主动加载自定义的扩展属性,所以调用REST API时,上下文里根本没有
extension_termsOfUseConsentVersion的对应值,自然只会传递已经存在的objectId。
具体实现步骤
- 第一步:补全自定义属性的声明定义
检查主策略和所有依赖项策略的<ClaimsSchema>节点,确保extension_termsOfUseConsentVersion有完整的声明定义:数据类型要和目录里存储的类型匹配,PartnerClaimType要和B2C目录中存的扩展属性名完全一致,不能有拼写错误。注意扩展属性的命名不能省略对应的应用唯一标识前缀,否则会出现值读不到的问题。如果声明定义不完整,就算目录里存了对应的值,登录流程也识别读不出来。 - 第二步:修改用户属性读取的技术配置
找到策略中负责通过objectId拉取用户全量资料的技术配置,一般命名为AAD-UserReadUsingObjectId。在这个技术配置的<OutputClaims>节点中,新增extension_termsOfUseConsentVersion的输出声明,设置Required="false"、DefaultValue=""。
这里要注意:很多人配置时会直接在REST API的技术配置里加这个输入声明,但没有在用户读取的步骤把值捞到声明上下文里,最后传给API的永远是空值。这一步的作用是:当用户登录拿到objectId后,技术配置在从B2C目录读取用户信息时,会主动把这个自定义扩展属性的值捞出来,放到当前请求的声明上下文里,供后续步骤使用。 - 第三步:调整REST API声明交换的输入声明配置
找到你对接REST API的那个claims exchange技术配置,在它的<InputClaims>节点中,除了原有的objectId声明,新增extension_termsOfUseConsentVersion作为输入声明。这样当流程执行到REST调用步骤时,就会把上下文里存的这个自定义属性值,一起作为请求参数传给你的服务。 - 第四步:校验流程编排顺序
一定要确保登录旅程的编排顺序符合以下逻辑:- 验证用户提交的账号密码,拿到用户的objectId
- 调用
AAD-UserReadUsingObjectId从目录读取包含自定义扩展属性在内的全量用户资料,写入声明上下文 - 执行REST API claims exchange
如果顺序颠倒——比如把REST调用放在读取用户属性的步骤之前,上下文里还没有自定义属性的值,就算配置了输入声明也传不出有效值。
- 第五步:排查常见配置误区
- 确认自定义属性已经被持久化到B2C用户目录对象上,而不是只存在于注册流程的临时会话声明里:如果注册环节写入自定义属性时没有调用AAD用户更新接口把值落到目录上,下次登录自然读不到对应的值。
- 检查REST API技术配置的配置项,有没有通过排除规则把自定义属性过滤掉,默认无特殊配置时,上下文里存在的声明会正常传递给API。
内容的提问来源于stack exchange,提问作者mangafaua
相关产品推荐
相关产品推荐

