.Net Core配置JWT认证后控制器[Authorize]属性失效问题咨询
问题原因排查及修复方案
核心问题1:中间件执行顺序错误
ASP.NET Core 中间件严格按照注册的先后顺序执行,你当前Configure方法中的中间件顺序存在严重错误:
- 开头就调用了
app.UseMvc(),请求会直接进入MVC处理流程,后续注册的UseAuthentication、UseAuthorization完全不会被触发,自然[Authorize]属性不会生效 - 认证、授权中间件必须放置在
UseRouting之后,端点/ MVC 处理中间件之前才能正常工作
核心问题2:路由配置冲突
你在ConfigureServices中通过services.AddMvc(option => option.EnableEndpointRouting = false)关闭了终结点路由模式,但在Configure中同时使用了app.UseMvc()和app.UseEndpoints()两种路由处理方式,二者冲突导致权限校验逻辑未生效。
修复步骤
1. 修正ConfigureServices中的重复配置
删除重复的AddMvc注册,统一配置:
// 删掉原来的两处AddMvc注册,替换为下面的代码 services.AddControllersWithViews() .SetCompatibilityVersion(CompatibilityVersion.Version_2_1); // 如果你要使用终结点路由就不用加EnableEndpointRouting=false,用传统MVC路由才需要加
2. 修正Configure方法的中间件顺序
调整后正确的中间件顺序如下:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseSpaStaticFiles(); app.UseRouting(); // 认证、授权必须放在UseRouting之后,UseEndpoints之前 app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapHub<CoreHub>("/corehub"); endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}"); }); // SPA中间件放在最后 app.UseSpa(spa => { spa.Options.SourcePath = "ClientApp"; if (env.IsDevelopment()) { spa.UseProxyToSpaDevelopmentServer("http://localhost:4200"); } }); }
3. 额外校验项
- 确认你的控制器类没有标记
[AllowAnonymous]属性覆盖了方法上的[Authorize] - 确认
appsettings.json中的JwtSettings配置节点下的validIssuer、validAudience、securityKey值都不为空 - 如果你仍然要使用传统MVC路由模式,删除
app.UseRouting()和app.UseEndpoints(),把app.UseMvc()放在app.UseAuthorization()之后即可。
内容的提问来源于stack exchange,提问作者techno
相关产品推荐
相关产品推荐

