Azure B2C自定义策略如何基于租户动态显示身份提供商
Azure B2C 基于domain_hint动态展示IdP实现方案
你可以通过服务端自定义策略过滤+前端自定义页面兜底的两层方案实现需求,不需要额外开发复杂组件,基于你已经搭建的HRD Azure Function逻辑改造即可:
方案1:自定义策略原生服务端过滤(推荐,安全性最高)
这个方案在B2C服务端渲染登录页时就直接过滤掉不允许展示的IdP,不会出现前端元素闪缩、被绕过的问题:
- 第一步:接收并透传
domain_hint参数
在Relying Party策略文件的<InputClaims>节点新增声明,将OIDC请求传入的domain_hint参数读入声明上下文:
同时在策略的<InputClaim ClaimTypeReferenceId="domain_hint" DefaultValue="{OIDC:DomainHint}" AlwaysUseDefaultValue="true" />ClaimsSchema节点定义domain_hint为字符串类型、allowedIdps为字符串集合类型。 - 第二步:获取当前域名对应的允许IdP列表
改造你之前实现HRD逻辑的Azure Function,入参保留传入的domain_hint,不再返回直接跳转的目标IdP,而是返回当前域名匹配的、需要展示的所有IdP对应的技术配置文件ID列表,赋值给allowedIdps声明。
如果你的IdP映射规则固定不需要动态调整,也可以直接用自定义策略内置的LookupValue声明转换做静态映射,不需要调用Azure Function。 - 第三步:给每个IdP选项加显示前置条件
在Sign In用户旅程里,每一个对应IdP选择的编排步骤(即ClaimsProviderSelection类型的步骤)都新增前置判断:只有当前步骤对应的IdP ID存在于allowedIdps集合中时,才加载这个步骤,否则直接跳过。
配置完成后,B2C服务端渲染登录页时只会渲染符合条件的IdP选项,其余IdP不会出现在页面源码里。
如果
allowedIdps集合中仅包含1个IdP,你可以额外加一个编排步骤直接触发对应IdP的认证请求,保留原有主域发现自动跳转的体验,不需要用户手动选择。
方案2:自定义HTML页面前端过滤(适合快速迭代场景)
如果你已经在Blob存储托管了自定义UI,可以在前端做一层过滤,注意这个方案必须搭配服务端校验做兜底,不能单独使用:
- 第一步:把
domain_hint参数透传到自定义HTML页面
修改对应内容定义(Content Definition)的LoadUri,拼接查询参数把domain_hint传给托管的HTML页面:https://your-blob-domain/b2c-login.html?domain_hint={OAUTH-KV:domain_hint} - 第二步:写前端过滤逻辑
在自定义HTML的JS代码中,监听B2C官方提供的页面渲染完成回调api.onAfterRender,遍历页面上所有IdP选择按钮(B2C默认渲染的IdP按钮都带有accountButton类名,data-provider属性存储了IdP的唯一标识),根据你提前维护的域名-IdP映射关系,把不在允许列表里的IdP按钮设置为隐藏即可。
注意事项
- 不要仅靠前端CSS/JS隐藏IdP,必须在自定义策略层面加校验,防止恶意用户篡改参数绕过前端限制访问未授权的IdP
- 你之前参考的HRD示例不需要完全重构,只需要把示例里「匹配域名后自动重定向到IdP」的逻辑改成「返回允许展示的IdP列表」即可,原有参数校验、域名匹配的逻辑可以直接复用
内容的提问来源于stack exchange,提问作者Anand Sowmithiran
相关产品推荐
相关产品推荐

