NET8 实现 IAuthorizationFilter 自定义认证 :获取用户的角色后,根据角色查询是否有对应的权限
时间: 2024-10-02 13:04:07 浏览: 52
.NET Core 8 中,为了自定义认证并根据用户角色检查权限,通常我们会使用 ASP.NET Core 的 Identity 和 Authorization 系统。IAuthorizationFilter 是一个用于实现授权过滤器的接口,它允许你在请求处理过程中对授权进行检查。
首先,你需要创建一个实现了 IAuthorizationFilter 的类,例如 `CustomAuthorizationFilter`:
```csharp
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Authorization;
public class CustomAuthorizationFilter : IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
// 获取当前用户的 roles 或者 Claims (如果你使用的是 JWT 认证)
var user = context.HttpContext.User;
var roles = user.Claims.FirstOrDefault(c => c.Type == "Role")?.Value?.Split(',');
if (roles != null) // 检查用户是否拥有特定角色
{
foreach (var role in roles)
{
// 假设我们有一个 RolePermissionMap 配置,将角色映射到具体的权限
if (IsUserAuthorizedForRole(role)) // 这里实现根据角色查询权限的方法
{
// 如果有对应权限,则继续处理请求
context WeiterOnAuthSuccess();
}
else
{
// 否则,可以设置错误状态或返回未授权页面
context.Result = ChallengeAsync(context.Options.AuthenticationSchemes);
return;
}
}
}
else
{
// 用户无角色信息,视作未授权
context.Result = ChallengeAsync(context.Options.AuthenticationSchemes);
}
}
private bool IsUserAuthorizedForRole(string role)
{
// 这里你可以从数据库、配置或其他数据源查询角色对应的权限
// 示例:RolePermissionMap.ContainsKey(role) && RolePermissionMap[role];
throw new NotImplementedException();
}
protected virtual Task WeiterOnAuthSuccess()
{
// 如果验证通过,可以继续处理请求
return Task.CompletedTask;
}
}
```
要在控制器中应用这个过滤器,需要注册并在相应操作上标记 `[Authorize]`:
```csharp
[Authorize]
[Route("api/[controller]")]
[ApiController]
public class YourController : ControllerBase
{
[HttpGet("{id}")]
[CustomAuthorizationFilter]
public ActionResult<string> Get(int id)
{
// 请求处理逻辑...
}
}
```
阅读全文