如何不借助B2C登录流实现Entra External ID与Azure B2C联邦对接?
实现方案:Entra External ID独立用户流对接Azure B2C身份源
核心思路
将Azure B2C配置为Entra External ID的外部身份提供者(IdP),让Entra使用自身独立用户流发起认证流程,最终委托B2C完成用户身份验证,同时通过声明映射与自定义扩展实现B2C自定义声明的传递。
具体实现步骤
1. 在Entra External ID中添加Azure B2C作为OIDC身份提供者
- 登录Entra管理中心,进入「外部身份」→「身份提供者」→「添加」→选择「OpenID Connect」类型
- 配置B2C的OIDC元数据地址:
https://<你的B2C租户域名>.b2clogin.com/<你的B2C租户域名>.onmicrosoft.com/<你的B2C用户流ID>/v2.0/.well-known/openid-configuration - 填写客户端ID(在B2C租户中创建的、用于与Entra对接的应用注册ID)和客户端密钥(该B2C应用的客户端密码)
- 设置请求范围:至少包含
openid、profile,若需获取自定义声明,可添加B2C中对应的自定义范围(如有)
2. 创建并配置Entra独立用户流
- 在Entra管理中心进入「外部身份」→「用户流」→「新建用户流」,选择适合移动端的类型(如「注册和登录」)
- 在用户流的「身份提供者」设置中,启用刚添加的Azure B2C IdP,关闭其他不需要的身份源
- 在「用户属性和令牌中的声明」环节,添加需要从B2C获取的自定义声明(需与B2C中声明名称一致),并设置为在令牌中返回
3. 自定义声明映射与扩展
- 若B2C的自定义声明未在默认OIDC响应中返回,需在Entra中创建自定义扩展属性:
- 进入Entra「外部身份」→「用户流」→「自定义属性」,添加与B2C自定义声明对应的属性(如
b2c_user_role) - 返回B2C IdP的配置页面,在「声明映射」中,将B2C返回的自定义声明(通常以
extension_开头,如extension_userRole)映射到刚创建的Entra自定义属性
- 进入Entra「外部身份」→「用户流」→「自定义属性」,添加与B2C自定义声明对应的属性(如
- 确保在用户流的「令牌中的声明」列表中包含该自定义属性,以便API层能获取到对应值
4. 移动端对接Entra用户流
- 移动端使用MSAL SDK(iOS/Android均可),配置Entra租户ID、移动端应用注册ID、以及创建的Entra用户流名称
- 发起认证请求时,指定用户流参数:
?p=<你的Entra用户流名称> - 认证完成后,从ID Token或Access Token中解析出包含B2C自定义声明在内的所有用户信息
关键注意事项
- B2C应用权限配置:在B2C租户的应用注册中,需为Entra对接应用分配读取用户自定义属性的权限,并完成管理员同意
- 声明名称一致性:B2C自定义声明默认带有
extension_前缀,映射到Entra时需准确对应,避免大小写或前缀错误 - 流程验证:使用Entra用户流的「测试」功能,模拟认证流程,检查返回的Token是否包含预期的自定义声明
- 信任维护:定期检查B2C与Entra之间的证书有效性,避免因证书过期导致联邦认证失败
内容的提问来源于stack exchange,提问作者Magnus Backeus
相关产品推荐
相关产品推荐

