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,授权失败

 

 

posted @ 2023-02-11 11:24  y_w_k  阅读(432)  评论(0编辑  收藏  举报