ASP.NET Core Identity中如何通过角色声明实现JWT身份认证
如何通过用户角色包含的声明实现用户身份认证?
嘿,我看你已经在Startup里搭好了基于声明的授权策略框架,接下来咱们把JWT生成的逻辑补全,这样就能通过角色关联的声明完成身份认证啦!
1. 完善JWT生成逻辑,注入角色关联声明
你在登录控制器里的方法已经开了个头,咱们把它补全——核心是要把用户所属角色的所有声明都塞进JWT里,这样后续授权校验才能识别到这些权限:
private async ValueTask<JwtSecurityToken> GetJwtSecurityToken(ApplicationUser user) { // 第一步:获取当前用户的所有角色 var userRoles = await _userManager.GetRolesAsync(user); // 初始化声明列表,先添加用户自身的基础身份信息 var claims = new List<Claim> { new Claim(ClaimTypes.NameIdentifier, user.Id), new Claim(ClaimTypes.Name, user.UserName), new Claim(JwtRegisteredClaimNames.Email, user.Email) }; // 第二步:遍历每个角色,把角色关联的所有声明加到列表里 foreach (var role in userRoles) { // 根据角色名找到角色对象 var roleEntity = await _roleManager.FindByNameAsync(role); // 获取该角色绑定的所有声明 var roleClaims = await _roleManager.GetClaimsAsync(roleEntity); claims.AddRange(roleClaims); // 可选:把角色本身也作为声明加入,方便后续直接判断用户角色 claims.Add(new Claim(ClaimTypes.Role, role)); } // 第三步:配置JWT的签名密钥、签发方、受众等参数(这些通常存在配置文件里) var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"])); var signingCreds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); // 生成最终的JWT Token return new JwtSecurityToken( issuer: _configuration["Jwt:Issuer"], audience: _configuration["Jwt:Audience"], claims: claims, expires: DateTime.Now.AddHours(3), // 设置Token有效期 signingCredentials: signingCreds); }
2. 在登录接口中返回生成的JWT
把上面的方法集成到登录逻辑里,验证用户密码后返回Token给前端:
[HttpPost("login")] public async Task<IActionResult> Login(LoginModel loginModel) { // 查找用户并验证密码 var user = await _userManager.FindByEmailAsync(loginModel.Email); if (user == null || !await _userManager.CheckPasswordAsync(user, loginModel.Password)) { return Unauthorized("邮箱或密码错误"); } // 生成JWT并返回 var jwtToken = await GetJwtSecurityToken(user); return Ok(new { AccessToken = new JwtSecurityTokenHandler().WriteToken(jwtToken), ExpiresAt = jwtToken.ValidTo }); }
3. 在接口上应用授权策略
你已经在Startup里定义了CanEdit策略,现在只需要在需要权限校验的控制器/Action上标记授权特性即可:
// 整个控制器都需要CanEdit权限 [Authorize(Policy = "CanEdit")] [ApiController] [Route("api/[controller]")] public class EditController : ControllerBase { [HttpPut("update/{id}")] public async Task<IActionResult> UpdateItem(int id, [FromBody] ItemUpdateModel model) { // 你的业务编辑逻辑 return Ok("编辑成功"); } } // 或者单独给某个Action加权限 [ApiController] [Route("api/items")] public class ItemsController : ControllerBase { [HttpGet] public IActionResult GetItems() => Ok("所有用户都能看"); [Authorize(Policy = "CanEdit")] [HttpPost] public IActionResult AddItem([FromBody] ItemAddModel model) => Ok("只有有CanEdit权限的用户能添加"); }
4. 认证授权流程说明
当前端带着JWT请求接口时,ASP.NET Core会自动解析Token里的声明集合,然后检查是否满足CanEdit策略要求的CanEdit声明:
- 如果Token里包含
CanEdit声明,就允许访问接口; - 如果没有该声明,会直接返回403(禁止访问)状态码。
内容的提问来源于stack exchange,提问作者Nick Nick
相关产品推荐
相关产品推荐

