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

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用RoleBasedAuthorization实现基于用户角色的访问权限控制相关的知识,希望对你有一定的参考价值。

本文将介绍如何通过 Sang.AspNetCore.RoleBasedAuthorization[1] 库实现 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

References

[1] Sang.AspNetCore.RoleBasedAuthorization: https://www.nuget.org/packages/Sang.AspNetCore.RoleBasedAuthorization

以上是关于使用RoleBasedAuthorization实现基于用户角色的访问权限控制的主要内容,如果未能解决你的问题,请参考以下文章

Security----Authorization----基于角色的授权

通过中间件添加用户的Claim

使用.NET从零实现基于用户角色的访问权限控制

基于角色的授权:使用 OneLogin 和 Spring Security 的 Oauth

模板与泛型编程——模板实参推断

实模式