Azure B2C:首次注册时API返回的持久化自定义声明不显示,后续登录正常
问题描述
我基于Azure B2C编写了自定义策略,流程如下:收集用户信息 → 调用自研API完成验证 → 将API返回值存储为声明 → 把用户输入的所有信息及API返回的声明持久化到用户对象中。
测试时发现一个问题:用户注册完成后立即返回的令牌中不包含API返回的声明,但同一用户后续登录时该声明会出现在令牌里。通过Graph API查询用户对象数据发现,API返回的声明需要约5-10秒才会被填充到用户对象中——用户刚创建时调用Graph API,用户输入的声明已存在,但API返回的声明缺失;等待约5秒后再次查询,该声明才会显示。
请问是否有办法让Azure B2C等待API返回的声明完全填充到用户对象后,再继续用户旅程并返回令牌?
解决方案
1. 直接复用API返回的声明(最优方案)
Azure B2C自定义策略中,调用API后可以直接将返回的声明保留在当前用户旅程的上下文里,无需依赖用户对象的异步持久化。具体操作:
- 在调用自研API的验证技术配置文件中,通过
<OutputClaim>节点将API返回的字段映射为策略声明。 - 在后续颁发令牌的步骤中,直接引用这个声明,而非从用户对象中读取。
- 这种方式下,声明会直接从当前旅程上下文写入令牌,完全避开用户对象的异步同步延迟。
2. 添加延迟重试的声明检查步骤
如果业务逻辑必须依赖用户对象中的声明,可以在API调用和令牌颁发之间添加延迟重试的检查环节:
- 开发一个辅助REST API(或Azure Function),该API调用Graph API查询目标用户的指定声明是否存在。
- 在用户旅程中新增验证技术配置文件,调用这个辅助API,并配置重试规则:
- 通过
<Metadata>节点设置RetryIntervalSeconds(比如2秒)和NumberOfRetries(比如5次)。 - 辅助API返回声明已存在的信号后,继续执行后续旅程;如果重试次数耗尽仍未查询到声明,可根据需求抛出错误或继续流程。
- 通过
3. 显式触发用户对象同步更新
默认情况下,Azure B2C部分用户数据的持久化是异步执行的。可以在API调用后,显式添加用户对象写入步骤,强制同步完成声明持久化:
- 在API调用步骤之后,添加
AAD-UserWriteUsingAlternativeSecurityId或AAD-UserWriteProfileUsingObjectId技术配置文件(根据注册类型选择)。 - 在该技术配置文件中,将API返回的声明配置为
<PersistedClaim>,确保声明被同步写入用户对象,减少延迟。
注意事项
- 方法1是性能和可靠性最高的方案,建议优先采用。
- 方法2会增加用户旅程的耗时,需要在业务需求和用户体验之间做权衡。
- 方法3需要确保用户写入步骤的配置正确,避免意外覆盖用户的其他数据。
内容的提问来源于stack exchange,提问作者Andrew Wiebe
相关产品推荐
相关产品推荐

