You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"
}

我想知道为什么没有返回邮箱字段。

我的用户流的应用声明和用户声明配置如下:
App claims
User attribute

如果这个问题没有正规解决方案,可行的临时方案是新建名为"AutomaticEmail"的自定义字段,在注册时填入用户邮箱,但我认为该方案不合理,因为已经有现成的邮箱字段,且如果后续用户修改邮箱会引发大量问题。


问题原因

这是Azure AD B2C用户流API连接器的默认行为:

  • 手动注册、登录场景下,用户输入的邮箱会临时存储在登录会话上下文里,会被自动带入发送给API连接器的请求参数中
  • SSO静默登录场景下没有用户交互步骤,会话上下文不会默认加载用户目录中存储的邮箱属性,只有默认核心用户属性(objectId、姓名类属性)会被传递给API连接器

正规解决方案

方案1:配置API连接器发送声明(最简便)

直接在用户流的API连接器配置中,强制指定传递邮箱声明即可:

  1. 进入B2C租户,打开对应的用户流配置页
  2. 找到「API连接器」菜单,选择你配置的Before sending the token连接器
  3. 在发送到API的声明配置项中,勾选「电子邮件地址」(对应系统的email声明)
  4. 保存配置后重新测试,静默登录场景下API请求就会携带email字段

方案2:通过ObjectId查询用户最新邮箱

如果无法修改声明传递规则,可以直接用请求自带的objectId字段获取用户邮箱:

  1. 在C#后端申请B2C租户的用户读权限,调用用户查询接口获取用户信息
  2. 从返回结果的mail或signInNames属性中提取用户的最新邮箱
  3. 该方案优势是永远获取用户最新的邮箱信息,不会出现属性同步问题

方案说明

你提到的自定义AutomaticEmail字段的方案不建议使用,会增加后续邮箱变更的同步成本,完全可以通过上述两个原生方案替代。


内容的提问来源于stack exchange,提问作者Antoine Brisebois-Roy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 01:48:04