You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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校验服务),直接用特性无法实现构造函数注入,推荐拆分标记特性和授权逻辑:

  1. 定义仅做标记用的权限特性:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AuthorizePermissionByCodeAttribute : Attribute
{
    public string Permissions { get; }
    public AuthorizePermissionByCodeAttribute(string permissions)
    {
        Permissions = permissions;
    }
}
  1. 单独实现授权过滤器:
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();
    }
}
  1. 在ConfigureServices中注册过滤器:
services.AddScoped<PermissionAuthorizationFilter>();
  1. 给需要校验的接口加特性:
[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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 04:36:04