.NET Core自定义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
需要排查问题原因及提供解决建议。
问题原因及解决建议
可能的原因
- 过滤器注册与端点映射冲突:.NET Core 3.0+中
AddMvc()已包含AddControllers()和AddRazorPages()功能,重复注册会导致过滤器无法正确关联到控制器端点。 AuthorizeAttribute内置逻辑干扰:自定义类继承了AuthorizeAttribute,同时全局配置了RequireAuthenticatedUser默认策略,框架会优先执行内置授权逻辑,可能跳过自定义过滤器方法。- 过滤器生命周期问题:使用实例方式注册过滤器(
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
相关产品推荐
相关产品推荐

