Azure AD B2C下Blazor Wasm ASP.NET Core 5应用权限管控方案咨询
可行实现方案
以下三种方案适配不同的技术栈改造成本和业务灵活性需求:
方案1:Azure AD B2C 自定义用户流/IEF 内置校验
该方案把额外注册逻辑完全嵌入B2C的认证流程,应用层仅需做权限判断即可:
- 首先在Azure AD B2C用户属性中扩展两个自定义字段:
IsRegistrationCompleted(布尔型,标记是否完成本地client id绑定)、BoundClientId(字符串型,存储绑定的本地唯一ID) - 配置B2C登录用户流:用户完成标准账号密码/社交登录后,新增一个表单页引导用户输入邮件收到的client id
- 配置B2C调用你ASP.NET Core后端提供的REST校验接口,将Azure返回的用户唯一标识(
objectId、用户邮箱)和用户输入的client id同步传给接口,后端校验该client id存在、未绑定、且绑定的目标邮箱与当前用户邮箱一致后,返回校验通过信号,B2C自动更新对应用户的两个自定义属性 - 后续B2C颁发的JWT令牌会自动包含这两个自定义属性的声明,Blazor前端和ASP.NET Core后端直接读取声明即可拦截未完成注册的用户
- 适用场景:希望登录+注册流程统一收口到Azure侧,减少应用层代码改动
方案2:应用层全链路拦截处理
该方案B2C仅负责基础身份认证,所有额外注册逻辑完全在你自有应用内实现,灵活性最高:
- 用户完成B2C登录后,ASP.NET Core后端首先从Azure返回的声明中拿到用户唯一标识,到本地用户关联表中查询该用户是否已经完成client id绑定
- 新增一个全局授权中间件,对所有需要访问权限的业务接口做校验:如果用户已登录但未完成绑定,且当前请求不是注册相关接口,直接返回403状态码,响应头新增
X-Need-Registration: true标识 - Blazor Wasm前端新增全局路由守卫,检测到接口返回的注册要求标识后,强制跳转到本地开发的注册页面,引导用户输入client id
- 注册提交时,后端将用户输入的client id与当前登录用户的Azure标识做绑定校验,校验通过后存入本地数据库,标记为已完成注册
- 参考代码片段:
// ASP.NET Core 注册状态校验中间件 app.Use(async (context, next) => { if (context.User.Identity.IsAuthenticated) { // 排除注册相关接口和静态资源 var excludePaths = new[] { "/api/registration", "/_content", "/css" }; if (!excludePaths.Any(p => context.Request.Path.StartsWithSegments(p))) { // 从本地库读取用户注册状态,也可以提前把状态存入Claims var userId = context.User.Claims.FirstOrDefault(c => c.Type == "http://schemas.microsoft.com/identity/claims/objectidentifier")?.Value; var isRegCompleted = await _userRegistrationService.CheckRegistrationStatus(userId); if (!isRegCompleted) { context.Response.StatusCode = 403; context.Response.Headers.TryAdd("X-Need-Registration", "true"); return; } } } await next(); });
- 适用场景:注册流程有复杂自定义逻辑,后续迭代频率高,不希望频繁修改B2C配置
方案3:混合模式
该方案整合前两种的优势,B2C负责存储注册状态,应用层负责注册流程实现:
- 同样在B2C中扩展注册状态相关的自定义属性,用户登录后JWT令牌直接携带注册状态声明
- 额外注册页面放在自有应用内实现,完成绑定后调用Microsoft Graph API更新B2C侧用户的自定义属性
- 应用层仅需读取令牌中的声明做拦截,不需要额外查询本地库判断注册状态
- 适用场景:注册流程需要灵活调整,同时希望减少后端每次请求的数据库查询开销
通用注意事项:所有方案都需要做client id的幂等校验,避免同一个ID被多个用户绑定;同时要校验client id预绑定的邮箱与当前Azure登录用户的邮箱一致,防止他人冒领绑定。
内容的提问来源于stack exchange,提问作者Evgenia_Andrik
相关产品推荐
相关产品推荐

