在ASP.NET Core的授权体系中,IAuthorizationRequirement用于定义授权的条件,而AuthorizationHandler则负责实现具体的条件验证逻辑,两者配合可以实现各种灵活的自定义授权场景。

理解IAuthorizationRequirement的作用
IAuthorizationRequirement是一个标记接口,本身不包含任何方法,它的作用是作为授权条件的载体。我们可以创建实现该接口的类,在其中定义授权需要的相关参数,比如最小年龄、所需角色、特定权限标识等。
例如我们需要实现一个基于用户等级的授权要求,就可以先定义如下的要求类:
using Microsoft.AspNetCore.Authorization;
// 定义用户等级授权要求,实现IAuthorizationRequirement接口
public class UserLevelRequirement : IAuthorizationRequirement
{
// 要求的最低用户等级
public int MinLevel { get; set; }
public UserLevelRequirement(int minLevel)
{
MinLevel = minLevel;
}
}
创建对应的AuthorizationHandler
AuthorizationHandler是处理授权要求的具体逻辑类,需要继承AuthorizationHandler<TRequirement>,其中TRequirement是我们定义的IAuthorizationRequirement实现类。在重写的处理方法中,我们可以获取用户信息和要求参数,完成验证逻辑。
针对上面的UserLevelRequirement,对应的Handler实现如下:
using Microsoft.AspNetCore.Authorization;
using System.Security.Claims;
using System.Threading.Tasks;
public class UserLevelHandler : AuthorizationHandler<UserLevelRequirement>
{
protected override Task HandleRequirementAsync(
AuthorizationHandlerContext context,
UserLevelRequirement requirement)
{
// 获取用户等级声明,假设用户等级存储在ClaimTypes.Role之外的自定义声明中
var levelClaim = context.User.FindFirst(c => c.Type == "UserLevel");
if (levelClaim == null)
{
// 没有用户等级声明,直接返回未授权
return Task.CompletedTask;
}
// 解析用户等级
if (int.TryParse(levelClaim.Value, out int userLevel))
{
// 判断用户等级是否满足最低要求
if (userLevel >= requirement.MinLevel)
{
// 满足要求,标记授权成功
context.Succeed(requirement);
}
}
return Task.CompletedTask;
}
}
注册自定义授权要求到服务
定义好要求和Handler之后,需要将其注册到ASP.NET Core的依赖注入容器中,同时配置对应的授权策略。
在Program.cs中添加如下配置:
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.DependencyInjection;
var builder = WebApplication.CreateBuilder(args);
// 注册自定义Handler到容器
builder.Services.AddSingleton<IAuthorizationHandler, UserLevelHandler>();
// 配置授权策略,添加自定义要求
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("UserLevel3", policy =>
policy.Requirements.Add(new UserLevelRequirement(3)));
});
// 添加控制器服务
builder.Services.AddControllers();
var app = builder.Build();
app.UseAuthorization();
app.MapControllers();
app.Run();
应用自定义授权策略
注册完成后,就可以在控制器或者接口方法上使用定义好的策略了,使用方式和默认策略一致。
示例控制器代码如下:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/[controller]")]
public class OrderController : ControllerBase
{
// 只有用户等级大于等于3的用户才能访问该接口
[HttpGet]
[Authorize(Policy = "UserLevel3")]
public IActionResult GetOrderList()
{
return Ok(new { message = "获取订单列表成功" });
}
}
多要求组合使用
一个授权策略可以添加多个IAuthorizationRequirement,默认情况下需要满足所有要求才能授权成功。如果需要满足任意一个要求即可,可以自定义策略的评估逻辑。
例如同时添加等级要求和角色要求:
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("Level3OrAdmin", policy =>
{
policy.Requirements.Add(new UserLevelRequirement(3));
// 添加默认的角色要求
policy.RequireRole("Admin");
});
});
如果希望满足等级要求或者管理员角色任意一个即可,可以创建自定义的IAuthorizationPolicyProvider或者调整Handler的逻辑,也可以在Handler中手动处理多个要求的组合关系。
注意事项
- Handler的注册生命周期可以根据需求选择,单例、作用域或者瞬态都可以,根据是否依赖作用域内的服务决定。
- 如果Handler中需要访问数据库或者其他外部服务,注意异步方法的异常处理,避免授权逻辑抛出异常导致请求失败。
- 自定义声明的类型需要和用户登录时写入的声明类型一致,否则会出现无法获取到声明值的问题。
C#IAuthorizationRequirementAuthorizationHandler自定义授权ASP.NET_Core修改时间:2026-07-18 08:45:23