.NET5 MVC控制器如何为Microsoft Identity用户新增角色并免登更新Cookie
实现方案
不需要引入ASP.NET Core Identity的UserManager、RoleManager组件,基于你现有Azure AD认证架构,用官方原生扩展点即可实现需求。
1 替换自定义角色注入逻辑为IClaimsTransformation实现
你当前用的自定义中间件注入角色虽然可用,但ASP.NET Core提供了专门的IClaimsTransformation扩展点用于处理认证后声明的修改,适配性更强,也不会和认证管道逻辑冲突:
首先创建转换类:
public class DbRoleClaimsTransformer : IClaimsTransformation { private readonly IUserService _userService; public DbRoleClaimsTransformer(IUserService userService) { _userService = userService; } public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal) { if (!principal.Identity.IsAuthenticated) return principal; if (!_userService.DoesUserExist()) return principal; var role = _userService.GetUser().Role.Type; if (string.IsNullOrEmpty(role)) return principal; var identity = (ClaimsIdentity)principal.Identity; // 避免重复添加相同角色声明 if (!identity.HasClaim(ClaimTypes.Role, role)) { identity.AddClaim(new Claim(ClaimTypes.Role, role)); } return principal; } }
然后在Startup.cs的ConfigureServices方法中注册该服务:
services.AddScoped<IClaimsTransformation, DbRoleClaimsTransformer>();
注册完成后删除你原来编写的注入角色的自定义中间件即可,该转换逻辑会自动在每次认证完成后执行,不管是首次登录还是后续请求,都会自动从数据库拉取最新角色注入到声明中。
2 Create提交后即时刷新认证状态
用户提交补全信息保存到数据库后,只需要重新签发一次认证Cookie即可让角色立刻生效,无需重新登录,修改你的Create Post方法:
[HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Create(UserVM user) { // 先执行原有用户信息保存逻辑,将用户数据写入数据库 // 保存完成后重新签发认证Cookie var authResult = await HttpContext.AuthenticateAsync(OpenIdConnectDefaults.AuthenticationScheme); if (authResult.Succeeded) { await HttpContext.SignInAsync(OpenIdConnectDefaults.AuthenticationScheme, authResult.Principal, authResult.Properties); } return RedirectToAction(nameof(Index), "Bookings"); }
3 后续角色编辑功能适配
该方案天然支持角色修改后的自动生效:
- 高阶用户修改其他用户角色后,被修改用户下次发起请求时,
IClaimsTransformation会自动拉取最新角色更新声明,无需额外操作 - 如果需要修改后立刻生效,可以在修改完成后给对应用户触发重新签发Cookie的逻辑即可。
内容的提问来源于stack exchange,提问作者Steven Shields
相关产品推荐
相关产品推荐

