如何统一Blazor Server UI与外部API身份认证,优先采用Azure AD B2C方案
方案2(Azure AD B2C统一认证)落地指导
该方案完全可行,且是适配你场景的最优选择,既符合你把认证能力下沉到B2C的需求,也能同时兼容小型客户用UI、大型客户自行对接API的场景,基础实现步骤如下:
- 先在你的Azure AD B2C租户中注册两个应用,分别对应Blazor Server前端和后端API
- 注册API应用时,暴露自定义API作用域(比如
user_access),后续所有访问API的请求都需要持有该作用域的授权 - 注册Blazor Server应用时,配置合规的重定向、注销地址,同时给该应用授予上述API作用域的委托访问权限
- 注册API应用时,暴露自定义API作用域(比如
- 改造后端API的认证逻辑:替换原有用户名密码换JWT的逻辑,改为验证Azure AD B2C签发的JWT,仅需配置B2C租户域名、API应用客户端ID作为校验受众即可,原有JWT鉴权的业务逻辑不需要修改
- 调整Blazor Server的B2C配置:在现有B2C登录配置基础上,开启访问令牌获取配置,用户完成B2C登录后,可直接从认证上下文拿到B2C签发的、有权限访问API的访问令牌
- 把获取到的访问令牌注入到API请求链路:通过
IHttpContextAccessor从当前用户会话中读取令牌,配合HttpClientFactory或者NSwag提供的请求头重写方法注入到请求的Authorization头即可,不需要自行维护令牌存储、刷新逻辑 - 针对有自研能力的大客户:仅需向其提供B2C租户信息、API作用域、OAuth2.0认证端点,他们可直接通过B2C标准流程获取令牌调用API,不需要调整你侧的API逻辑
替代方案(会话内共享令牌的轻量实现)
如果暂时不打算统一用B2C做API认证,也可以通过Blazor Server原生机制实现会话内令牌共享,实现难度很低:
- 自定义一个Scoped生命周期的令牌存储服务,Blazor Server每个用户会话对应独立的Scoped容器,天然隔离不同用户的令牌
- 用户登录完成、从API拿到Bearer令牌后,将令牌存入上述Scoped服务中
- 后续所有API调用直接从该Scoped服务中读取令牌注入请求头即可
- 若SignalR连接断开重新登录,仅需在认证完成后重新将令牌存入Scoped服务即可,不需要额外做持久化处理
最优方案建议
优先选择Azure AD B2C统一认证方案,优势如下:
- 无需自行维护用户密码存储、令牌签发、过期刷新、安全策略等逻辑,后续要加2FA、社交登录、密码复杂度策略等能力,直接在B2C后台配置即可,不需要修改业务代码
- 一套认证逻辑同时覆盖UI用户和第三方对接场景,不需要做兼容性适配
- 你现有Blazor侧已经完成了B2C的基础配置,改动量极小,API侧仅需替换JWT校验规则,原有业务代码完全不受影响
内容的提问来源于stack exchange,提问作者XOR cyst
相关产品推荐
相关产品推荐

