C#自定义Authorize权限特性OnAuthorization方法未触发如何解决?
核心原因
ASP.NET Core 默认不会自动激活继承了IAuthorizationFilter的自定义特性,你需要额外配置将过滤器纳入API管道,同时要保证中间件注册顺序正确,否则授权逻辑完全不会触发。
必做配置
1. 调整中间件顺序
你需要在Startup.cs的Configure方法中按如下顺序注册中间件,UseAuthentication必须放在UseAuthorization之前:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 异常处理、静态文件、CORS等中间件放在此处 app.UseRouting(); // 身份验证中间件必须在授权中间件之前注册 app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }
2. 注册自定义授权过滤器(二选一)
方式一:全局注册(所有接口默认生效)
适合需要全局做权限校验的场景,在ConfigureServices中把过滤器加入MVC管道:
services.AddControllers(options => { options.Filters.Add<AuthorizePermissionByCode>(); });
方式二:按需生效(支持依赖注入,推荐)
如果你的授权逻辑需要注入服务(比如数据库上下文、JWT校验服务),直接用特性无法实现构造函数注入,推荐拆分标记特性和授权逻辑:
- 定义仅做标记用的权限特性:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] public class AuthorizePermissionByCodeAttribute : Attribute { public string Permissions { get; } public AuthorizePermissionByCodeAttribute(string permissions) { Permissions = permissions; } }
- 单独实现授权过滤器:
using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Mvc; public class PermissionAuthorizationFilter : IAuthorizationFilter { // 可直接注入你需要的服务,比如数据库上下文、JWT解析服务 private readonly IYourDbContext _dbContext; public PermissionAuthorizationFilter(IYourDbContext dbContext) { _dbContext = dbContext; } public void OnAuthorization(AuthorizationFilterContext context) { // 读取接口上标记的权限码 var permissionAttr = context.ActionDescriptor.EndpointMetadata .OfType<AuthorizePermissionByCodeAttribute>() .FirstOrDefault(); if (permissionAttr == null) return; // 此处编写JWT校验、权限比对、数据库查询逻辑 var requiredPermission = permissionAttr.Permissions; // 校验不通过直接返回401 context.Result = new UnauthorizedResult(); } }
- 在
ConfigureServices中注册过滤器:
services.AddScoped<PermissionAuthorizationFilter>();
- 给需要校验的接口加特性:
[ServiceFilter(typeof(PermissionAuthorizationFilter))] [AuthorizePermissionByCode("fr")] [HttpGet] public int Get() { // 业务逻辑 }
注意事项
请确认你代码中IAuthorizationFilter、AuthorizationFilterContext的命名空间是Microsoft.AspNetCore.Mvc.Filters,不要引用ASP.NET Framework时代的System.Web.Mvc相关类,否则也会出现逻辑不触发的问题。
内容的提问来源于stack exchange,提问作者Marco Rossi
相关产品推荐
相关产品推荐

