使用RoleBasedAuthorization实现基于用户角色的访问权限控制

本文将介绍如何通过 Sang.AspNetCore.RoleBasedAuthorization 库实现 RBAC 权限管理。

使用介绍

Step 1

添加库 Sang.AspNetCore.RoleBasedAuthorization.

Install-Package Sang.AspNetCore.RoleBasedAuthorization

Step 2

在 Program.cs 中添加

builder.Services.AddSangRoleBasedAuthorization();

Step 3

在需要进行授权检查的接口或 Controller 处添加 ResourceAttribute 标记。

[Resource("资源")][Route("api/[controller]")][ApiController]public class RolesController : ControllerBase{}
/// <summary>/// 删除-数值/// </summary>/// <param name="id"></param>[Resource("删除-数值")] //[Resource("删除", Action = "数值")][HttpDelete("{id}")]public IActionResult Delete(int id){    return Ok("删除-数值");}

这里用于描述访问的角色需要的资源要求

•填写单独的整个资源 “[Resource("资源")]”•或使用 Action 设置资源下的某个操作 “[Resource("资源", Action = "操作")]”•也可以使用形如“[Resource("资源-操作")]”直接设置资源和操作

Step 4

完成以上操作后,授权检查,将检查User.Claims是否存在对应的Permission

需要为用户添加对应的 Claims ,可以在生成 jwt token 时直接包含。

当然也可以使用中间件读取对应的角色,在授权检查前添加,可以自己实现也可以使用该库提供的下一节介绍的功能。

var claims = new List<Claim>{    new Claim(ClaimTypes.NameIdentifier, "uid"),    new Claim(ClaimTypes.Name,"用户名"),    new Claim(ClaimTypes.Email,"test@exp.com"),    new Claim(ClaimTypes.Role, "user"),    new Claim(ResourceClaimTypes.Permission,"查询"),};var token = new JwtSecurityToken(        "Issuer",        "Audience",        claims,        expires: DateTime.UtcNow.AddSeconds(3600),        signingCredentials: credentials    );

注意:如果角色名为SangRBAC_Administrator,将不进行授权检查。

可选中间件

使用提供的添加角色权限中间件,你也可以单独使用该组件。

Step 1

实现IRolePermission,通过角色名获取该角色权限列表

public class MyRolePermission : IRolePermission{    public Task<List<Claim>> GetRolePermissionClaimsByName(string roleName)    {        List<Claim> list = new();        // you code        return Task.FromResult(list);    }}

然后添加服务。

builder.Services.AddRolePermission<MyRolePermission>();

Step 2

app.UseAuthorization();app.UseAuthentication()后启用这个中间件。

app.UseAuthentication();app.UseRolePermission();app.UseAuthorization();

Option

UseRolePermission

1. option.UserAdministratorRoleName:

设置一个自定义角色,使其拥有 SangRBAC_Administrator 一样的系统内置超级管理员权限。

2. option.Always:

是否一直检查并执行添加,默认只有在含有 ResourceAttribute 要进行权限验证时,此次访问中间件才启动添加权限功能。

app.UseRolePermission(opt => {    // 设置系统内置超级管理员的rolename    opt.userAdministratorRoleName = "supadmin";    option.Always = true;});

Demo

•简单示例 https://github.com/sangyuxiaowu/Sang.AspNetCore.RoleBasedAuthorization/tree/main/TestDemo•在 Identity 中使用 https://github.com/sangyuxiaowu/IdentityRBAC