Azure B2C SSO场景下API连接器未返回邮箱字段的原因是什么
我有一个配置了API连接器的用户流,我使用before sending the token API连接器从我的数据库中拉取用户角色,之后将其作为extension_Role字段加入返回的令牌中。
正常流程下运行完全无问题,我使用的正常流程为:
- Sign-up(注册)
- Disconnect(登出)
- Sign-in(登录)
该流程运行正常是因为注册和登录步骤我都手动输入了邮箱,这两种场景下我的C#后端API连接器都能收到email claim(邮箱声明)。
问题出在我访问其他使用同个用户流且开启了SSO的站点时:此时不会触发重新输入凭据的步骤,会在后台静默完成登录,这时候我的C#后端依旧会被调用,但请求中没有邮箱字段,收到的JSON如下:
{ "step":"PreTokenIssuance", "client_id":"HIDDEN FOR SECURITY", "ui_locales":"en-US", "objectId":"HIDDEN FOR SECURITY", "surname":"HIDDEN FOR SECURITY", "displayName":"HIDDEN FOR SECURITY", "givenName":"HIDDEN FOR SECURITY" }
我想知道为什么没有返回邮箱字段。
我的用户流的应用声明和用户声明配置如下:

如果这个问题没有正规解决方案,可行的临时方案是新建名为"AutomaticEmail"的自定义字段,在注册时填入用户邮箱,但我认为该方案不合理,因为已经有现成的邮箱字段,且如果后续用户修改邮箱会引发大量问题。
问题原因
这是Azure AD B2C用户流API连接器的默认行为:
- 手动注册、登录场景下,用户输入的邮箱会临时存储在登录会话上下文里,会被自动带入发送给API连接器的请求参数中
- SSO静默登录场景下没有用户交互步骤,会话上下文不会默认加载用户目录中存储的邮箱属性,只有默认核心用户属性(objectId、姓名类属性)会被传递给API连接器
正规解决方案
方案1:配置API连接器发送声明(最简便)
直接在用户流的API连接器配置中,强制指定传递邮箱声明即可:
- 进入B2C租户,打开对应的用户流配置页
- 找到「API连接器」菜单,选择你配置的
Before sending the token连接器 - 在发送到API的声明配置项中,勾选「电子邮件地址」(对应系统的
email声明) - 保存配置后重新测试,静默登录场景下API请求就会携带email字段
方案2:通过ObjectId查询用户最新邮箱
如果无法修改声明传递规则,可以直接用请求自带的objectId字段获取用户邮箱:
- 在C#后端申请B2C租户的用户读权限,调用用户查询接口获取用户信息
- 从返回结果的
mail或signInNames属性中提取用户的最新邮箱 - 该方案优势是永远获取用户最新的邮箱信息,不会出现属性同步问题
方案说明
你提到的自定义AutomaticEmail字段的方案不建议使用,会增加后续邮箱变更的同步成本,完全可以通过上述两个原生方案替代。
内容的提问来源于stack exchange,提问作者Antoine Brisebois-Roy
相关产品推荐
相关产品推荐

