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

.NET Core自定义IAuthorizationFilter的OnAuthorization方法未调用问题求助

问题:自定义IAuthorizationFilter的OnAuthorization方法未被调用

我在.NET Core中尝试使用IAuthorizationFilter创建自定义认证逻辑,编写了如下代码:

public class JwtCookieAuthenticate : AuthorizeAttribute, IAuthorizationFilter
{
    public JwtCookieAuthenticate()
    {
        Console.WriteLine("CookieAuthorizeAttribute created."); // 仅用于调试
    }
    public void OnAuthorization(AuthorizationFilterContext context)
    {
        var testCookieValue = context.HttpContext.Request.Cookies["test"];
        Console.WriteLine($"test cookie value: {testCookieValue}");
        if (!context.HttpContext.Request.Cookies.ContainsKey("test") || context.HttpContext.Request.Cookies["test"] != "yes")
        {
            context.Result = new RedirectToActionResult("Login", "df", null);
        }
    }
}

该类逻辑为检查名为test的Cookie,若不存在或值不为yes则重定向至登录页,但OnAuthorization方法未被调用。我已在Startup.cs中配置全局过滤器:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthorization(options =>
    {
        options.DefaultPolicy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .Build();
    });
    services.AddMvc(options =>
    {
        options.Filters.Add(new JwtCookieAuthenticate());
    });
    services.AddControllers();
    services.AddRazorPages();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if(env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }
    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();
    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
        endpoints.MapRazorPages();
    });
}

并在HomeController上标记该特性:

[JwtCookieAuthenticate]
public class HomeController : Controller

需要排查问题原因及提供解决建议。


问题原因及解决建议

可能的原因

  1. 过滤器注册与端点映射冲突:.NET Core 3.0+中AddMvc()已包含AddControllers()和AddRazorPages()功能,重复注册会导致过滤器无法正确关联到控制器端点。
  2. AuthorizeAttribute内置逻辑干扰:自定义类继承了AuthorizeAttribute,同时全局配置了RequireAuthenticatedUser默认策略,框架会优先执行内置授权逻辑,可能跳过自定义过滤器方法。
  3. 过滤器生命周期问题:使用实例方式注册过滤器(new JwtCookieAuthenticate()),框架无法正确管理其生命周期,可能导致过滤器未被正确注入执行流程。

解决建议

方案1:调整过滤器注册方式

移除services.AddMvc()的过滤器注册,改用针对控制器的专用方法注册,且使用类型注册而非实例:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthorization(options =>
    {
        options.DefaultPolicy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .Build();
    });
    // 改用AddControllersWithViews注册控制器过滤器
    services.AddControllersWithViews(options =>
    {
        options.Filters.Add<JwtCookieAuthenticate>();
    });
    services.AddRazorPages();
}

方案2:移除AuthorizeAttribute继承

如果自定义逻辑不需要依赖AuthorizeAttribute的内置功能,直接实现IAuthorizationFilter即可,避免内置授权逻辑的干扰:

public class JwtCookieAuthenticate : IAuthorizationFilter // 移除AuthorizeAttribute继承
{
    public JwtCookieAuthenticate()
    {
        Console.WriteLine("CookieAuthorizeAttribute created.");
    }
    public void OnAuthorization(AuthorizationFilterContext context)
    {
        var testCookieValue = context.HttpContext.Request.Cookies["test"];
        Console.WriteLine($"test cookie value: {testCookieValue}");
        if (!context.HttpContext.Request.Cookies.ContainsKey("test") || context.HttpContext.Request.Cookies["test"] != "yes")
        {
            context.Result = new RedirectToActionResult("Login", "df", null);
        }
    }
}

控制器上的[JwtCookieAuthenticate]特性标记保留不变。

方案3:验证过滤器注册状态

在ConfigureServices中添加调试代码,确认过滤器是否被正确注册:

var mvcBuilder = services.AddControllersWithViews();
mvcBuilder.Configure(options =>
{
    foreach (var filter in options.Filters)
    {
        Console.WriteLine(filter.GetType().Name); // 输出所有已注册的过滤器类型
    }
});

方案4:检查控制器路由匹配

确保HomeController的路由配置正确,请求能正确匹配到控制器的动作方法,只有请求命中对应控制器时,过滤器才会触发执行。

内容的提问来源于stack exchange,提问作者Yan Soo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 16:53:13