导读:本期聚焦于小伙伴创作的《C#如何创建IAuthorizationRequirement和Handler实现自定义授权要求》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C#如何创建IAuthorizationRequirement和Handler实现自定义授权要求》有用,将其分享出去将是对创作者最好的鼓励。

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

C#如何创建IAuthorizationRequirement和Handler实现自定义授权要求

理解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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。