NET8 Microsoft.AspNetCore.Mvc.Filters.IAuthorizationFilter 实现自定义认证
时间: 2024-10-02 11:04:10 浏览: 46
在.NET 8(实际上是.NET Core 3.x及以上版本)中,`Microsoft.AspNetCore.Mvc.Filters.IAuthorizationFilter` 是一个用于在Action Filter级别实现自定义身份验证和授权控制的接口。它让你可以在处理HTTP请求之前检查用户的权限,比如检查他们是否已经登录,是否有特定的访问权限等。
当你实现了 `IAuthorizationFilter`,你需要覆盖 `OnAuthorization` 方法,这是核心部分,其中包含认证和授权的逻辑。下面是一个简单的示例:
```csharp
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Authorization;
public class CustomAuthenticationFilter : IAuthorizationFilter
{
public async Task OnAuthorization(AuthorizationFilterContext context)
{
// 获取用户信息,这里假设使用了JWT认证
var user = await context.HttpContext.User.AuthenticateAsync("Bearer");
if (user == null)
{
// 用户未登录或认证失败,设置未授权响应
context.Result = Challenge(new AuthenticationProperties { RedirectUri = "/" }, "Bearer");
return;
}
// 根据用户信息进一步检查权限,例如:
var userRoles = user.Claims.Where(x => x.Type == ClaimTypes.Role).Select(x => x.Value).ToList();
foreach (var role in userRoles)
{
if (!IsUserAuthorizedForRole(role))
{
// 用户无权访问该资源
context.Result = ForbidAsync(new AuthenticationProperties { RedirectUri = "/" });
return;
}
}
// 用户已通过所有权限检查,继续执行后续操作
await context滤过器链继续执行();
}
private bool IsUserAuthorizedForRole(string role)
{
// 在此处编写根据角色判断用户是否授权的业务逻辑,如数据库查询或配置检查
// 例如:RoleManager.IsInRole(user, role)
throw new NotImplementedException();
}
}
```
在你的API控制器上应用此过滤器,只需将其添加到`Filters`属性列表中:
```csharp
[Authorize(AuthenticationSchemes = "Bearer")] // 使用Bearer作为默认的认证方案
[Route("api/[controller]")]
[ApiController]
public class YourController : ControllerBase
{
[CustomAuthenticationFilter]
[HttpGet("{id}")]
public ActionResult<string> GetById(int id)
{
// 接口具体逻辑
}
}
```
阅读全文