使用介绍
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;
});