NET8 实现 AuthorizeAttribute 自定义认证
时间: 2024-10-02 22:04:01 浏览: 48
在.NET Core 3.x版本中,如果你想要实现一个自定义的`AuthorizeAttribute`,通常会继承`Microsoft.AspNetCore.Authorization.AuthorizeAttribute`并覆盖其中的一些方法来满足特定的认证需求。下面是一个简单的示例,展示如何创建一个只允许拥有特定权限的自定义授权属性:
```csharp
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.Filters;
using System.Collections.Generic;
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
private readonly List<string> _requiredPermissions;
public CustomAuthorizeAttribute(params string[] permissions)
{
_requiredPermissions = new List<string>(permissions);
}
protected override async Task OnAuthorizationAsync(AuthorizationFilterContext filterContext)
{
if (_requiredPermissions.Count > 0)
{
var user = await filterContext.HttpContext.User.AuthenticateAsync(); // 获取当前用户的权限信息
if (!user.Claims.Any(c => _requiredPermissions.Contains(c.Value))) // 检查用户是否具有所有所需的权限
{
// 如果缺少权限,抛出未经授权异常
await filterContext.FailureAsync(new ForbidResult());
}
}
// 如果用户已通过权限检查,继续执行授权过程
await base.OnAuthorizationAsync(filterContext);
}
}
// 使用自定义授权属性的示例
[CustomAuthorize(Permissions = "admin", "write")]
public class MyController : ControllerBase
{
// 控制器方法...
}
```
在这个例子中,`_requiredPermissions`列表包含了必需的权限。当方法被授权过滤器拦截时,首先检查用户是否具有所有列出的权限,如果没有,则禁止访问。
阅读全文