JWT 基于Roles的授权
本文主要介绍如何配置使用JWT基于Role的授权配置
Demo演示:
1.Token生成
通过Token进行认证和授权,需要在Claims中配置Role对应的权限项。
假设用户有两个权限:"RoleA"和"RoleB",在生成Token的过程中,添加这两个权限
claims.Add(new Claim(ClaimTypes.Role, "RoleA")); claims.Add(new Claim(ClaimTypes.Role, "RoleB"));
2.StartUp中的配置,添加中间件
注意先认证,再授权,要按顺序执行。
app.UseAuthentication();
app.UseAuthorization();
3.后端代码加权限
即接口权限配置,在控制器层面增加授权标签Authorize
普通的[Authorize]让任何经过认证的用户进入
基于角色的[Authorize(Roles="RoleA")]访问
允许匿名[AllowAnonymous]访问
测试用例:
3-1.单个权限:登录人需要有“RoleA”的权限,进行如下配置:
[HttpPost] [Authorize(Roles = "RoleA")] public ActionResult TestB() { return Ok(DateTime.Now); }
3-2 .组合权限:登录人需要有组合权限“RoleA”和“RoleB”,进行如下配置:
[HttpPost] [Authorize(Roles ="RoleB,RoleA")] public ActionResult TestB() { return Ok(DateTime.Now); }
3-3.取消权限:控制器上添加了权限,但控制器下的某个接口不需要权限验证,添加标签AllowAnonymous,进行如下配置:
1 [ApiController] 2 [Route("api/[controller]/[action]")] 3 [Authorize(Roles = "RoleA")]//可以为整个Controller设置Roles 4 public class RoleAController : Controller 5 { 6 [HttpPost] 7 public ActionResult TestA() 8 { 9 return Ok(DateTime.Now); 10 } 11 [AllowAnonymous] 12 [HttpPost] 13 public ActionResult TestB() 14 { 15 return Ok(DateTime.Now); 16 } 17 }
4.测试结果:
测试环境Swagger
用户有权限“RoleA”和“RoleB”,claims中已添加。
(1).首先获取Token:
(2).绑定Token
4-1.需要有"RoleA"的权限才能访问
1 [Authorize(Roles = "RoleA")]//可以为整个Controller设置Roles 2 public class RoleAController : Controller 3 { 4 [HttpPost] 5 public ActionResult TestA() 6 { 7 return Ok(DateTime.Now); 8 } 9 [AllowAnonymous] 10 [HttpPost] 11 public ActionResult TestB() 12 { 13 return Ok(DateTime.Now); 14 } 15 }
结果:都是200,调用成功
4-2.控制器需要“RoleB"的权限,但TestB方法需要"RoleD"的权限,会显示403
1 [ApiController] 2 [Authorize(Roles = "RoleB")] 3 [Route("api/[controller]/[action]")] 4 public class RoleBController : Controller 5 { 6 [HttpPost] 7 //也可以分别设置 8 public ActionResult TestA() 9 { 10 return Ok(DateTime.Now); 11 } 12 [HttpPost] 13 [Authorize(Roles = "RoleD")] 14 public ActionResult TestB() 15 { 16 return Ok(DateTime.Now); 17 } 18 }
结果如下:
RoleB/TestA,成功
RoleB/TestB,失败,返回403,授权失败