如何为Azure AD B2C访问令牌添加存储在自有数据库的自定义声明?
方案适配性确认
你提到的API连接器令牌 enrichment 方案完全适配你的需求,两种业务目标都可以覆盖:
- 直接向B2C令牌添加自定义声明:可以配置用户流在签发令牌之前触发API连接器调用你自己的服务接口,接口从自有数据库查询对应声明后返回给B2C,B2C会自动把返回的声明嵌入到签发的ID令牌/访问令牌中,不需要额外做令牌兑换操作
- 兑换自有令牌:如果不想修改B2C原生令牌,也可以在你的ASP.NET Core Web API验证B2C令牌合法后,自己生成包含自定义声明的JWT令牌返回给客户端使用,这种场景不需要修改B2C侧配置,只需要在API侧加自有令牌生成逻辑即可。
localhost本地测试步骤
因为Azure AD B2C的API连接器需要调用公网可访问的HTTPS接口,本地localhost服务默认无法被B2C访问,你可以按以下步骤实现本地测试:
- 先开发本地的API接口:接口需要满足B2C API连接器的入参出参规范,请求为POST方式,入参包含用户的objectId等基础标识,出参返回你需要注入的自定义声明键值对
- 用内网穿透工具把本地服务暴露到公网:
- 可以使用ngrok,执行命令
ngrok http https://localhost:你的本地端口号,执行后会得到一个公网可访问的HTTPS域名 - 也可以使用微软官方的Dev Tunnels工具,Visual Studio 2022已经内置支持,直接右键项目选择「启用开发隧道」即可自动生成公网访问地址
- 可以使用ngrok,执行命令
- 到B2C门户的API连接器配置页,把请求地址填成上面得到的公网地址+你的接口路由,保存后关联到对应的用户流的「令牌签发前」步骤即可
- 触发用户流登录后,就可以在B2C返回的令牌里看到你接口返回的自定义声明,本地服务也可以直接打断点调试请求逻辑。
最佳实践
- 优先选择令牌 enrichment 方案注入自定义声明:不需要额外做令牌兑换,减少客户端改造工作量,也可以避免令牌多次分发带来的安全风险
- 给API连接器接口加身份验证:不要使用匿名接口,B2C调用你的接口时会携带Bearer令牌,你可以在本地接口里验证令牌的issuer和audience,确保请求确实来自你自己的B2C租户,避免被恶意调用
- 敏感声明不要放到ID令牌里:只给需要的访问令牌添加对应敏感声明,减少前端暴露风险
- 接口超时控制:B2C调用API连接器的超时时间是2秒,超时后会跳过接口调用继续签发令牌,你的接口查询数据库逻辑要做优化,不要有耗时操作,超时场景建议做好降级处理
- 如果选择自有令牌兑换方案:注意做好B2C令牌的缓存,不要每次请求都兑换一次,自有令牌的过期时间建议设置短于B2C访问令牌的过期时间,避免过期令牌被复用。
内容的提问来源于stack exchange,提问作者Александр Климук
相关产品推荐
相关产品推荐

