当前位置:首页 > C# > 正文

掌握 ASP.NET Core 授权策略(手把手教你实现 C# 自定义权限控制)

在现代 Web 应用开发中,权限控制是保障系统安全的核心环节。ASP.NET Core 提供了灵活而强大的授权机制,其中自定义授权策略(Custom Authorization Policy)允许开发者根据业务需求精细控制用户访问权限。本文将从零开始,带你一步步实现一个基于角色和声明(Claims)的自定义授权策略,即使你是初学者也能轻松上手。

掌握 ASP.NET Core 授权策略(手把手教你实现 C# 自定义权限控制) Core授权策略 自定义授权策略 C#权限控制 Core安全认证 第1张

什么是 ASP.NET Core 授权策略?

在 ASP.NET Core 中,授权(Authorization)用于决定已认证用户是否有权访问特定资源。除了内置的 [Authorize(Roles = "Admin")] 等简单方式外,框架还支持通过策略(Policy)来封装复杂的授权逻辑。

通过自定义授权策略,你可以:

  • 结合多个角色或声明进行判断
  • 访问数据库验证动态权限
  • 实现基于时间、IP 或其他上下文的访问控制

第一步:创建自定义授权处理程序

首先,我们需要创建一个类继承 AuthorizationHandler<TRequirement>,并重写 HandleRequirementAsync 方法。

using Microsoft.AspNetCore.Authorization;using Microsoft.AspNetCore.Http;using System.Threading.Tasks;public class MinimumAgeRequirement : IAuthorizationRequirement{    public int MinimumAge { get; }    public MinimumAgeRequirement(int minimumAge)    {        MinimumAge = minimumAge;    }}public class MinimumAgeHandler : AuthorizationHandler<MinimumAgeRequirement>{    private readonly IHttpContextAccessor _httpContextAccessor;    public MinimumAgeHandler(IHttpContextAccessor httpContextAccessor)    {        _httpContextAccessor = httpContextAccessor;    }    protected override Task HandleRequirementAsync(        AuthorizationHandlerContext context,        MinimumAgeRequirement requirement)    {        // 获取用户的出生日期声明        var dateOfBirthClaim = context.User.FindFirst(c => c.Type == "DateOfBirth");        if (dateOfBirthClaim != null)        {            var dateOfBirth = Convert.ToDateTime(dateOfBirthClaim.Value);            var age = DateTime.Today.Year - dateOfBirth.Year;            if (dateOfBirth > DateTime.Today.AddYears(-age))                age--;            if (age >= requirement.MinimumAge)            {                context.Succeed(requirement);            }        }        return Task.CompletedTask;    }}

上面的代码定义了一个 MinimumAgeRequirement(最小年龄要求)和对应的处理程序 MinimumAgeHandler。当用户拥有 DateOfBirth 声明时,系统会计算其年龄,并与策略要求的最小年龄比较。

第二步:在 Program.cs 中注册策略

接下来,在 Program.cs 中配置服务,添加我们的自定义策略:

var builder = WebApplication.CreateBuilder(args);// 添加认证服务(假设你已配置 JWT 或 Cookie 认证)builder.Services.AddAuthentication(/* ... */);// 添加授权服务builder.Services.AddAuthorization(options =>{    options.AddPolicy("AtLeast18", policy =>        policy.Requirements.Add(new MinimumAgeRequirement(18)));});// 注册自定义处理程序builder.Services.AddSingleton<IAuthorizationHandler, MinimumAgeHandler>();builder.Services.AddHttpContextAccessor(); // 用于获取 HttpContextvar app = builder.Build();app.UseAuthentication();app.UseAuthorization();app.MapControllers();app.Run();

第三步:在控制器或 Action 上使用策略

现在,你可以在任何需要限制访问的 API 或页面上使用该策略:

[ApiController][Route("[controller]")]public class AdultContentController : ControllerBase{    [HttpGet]    [Authorize(Policy = "AtLeast18")]    public IActionResult Get()    {        return Ok("欢迎访问成人内容区域!");    }}

只要用户满足“年满18岁”的条件,就能成功访问;否则将收到 403 Forbidden 响应。

高级技巧:结合数据库动态验证

在真实项目中,权限可能存储在数据库中。你可以在 Handler 中注入 DbContext 或服务,实现更复杂的逻辑:

public class PermissionHandler : AuthorizationHandler<PermissionRequirement>{    private readonly AppDbContext _dbContext;    public PermissionHandler(AppDbContext dbContext)    {        _dbContext = dbContext;    }    protected override async Task HandleRequirementAsync(        AuthorizationHandlerContext context,        PermissionRequirement requirement)    {        var userId = context.User.FindFirstValue(ClaimTypes.NameIdentifier);        var hasPermission = await _dbContext.UserPermissions            .AnyAsync(p => p.UserId == userId && p.PermissionName == requirement.PermissionName);        if (hasPermission)        {            context.Succeed(requirement);        }    }}

总结

通过本文,你已经掌握了如何在 ASP.NET Core 中实现 C# 自定义授权策略。这种机制不仅提升了应用的 安全认证 能力,也让权限管理更加灵活和可维护。无论是基于年龄、角色还是数据库权限,你都可以通过策略模式优雅地实现。

记住:良好的权限设计是构建安全 Web 应用的第一道防线。合理使用 ASP.NET Core 授权策略自定义授权策略,让你的应用既安全又易于扩展。