.NET Core 3.0授权失败出现401/403时无法跳转登录页如何解决
解决方案
1. 修正中间件执行顺序
你当前Startup的Configure方法里中间件顺序错误,.NET Core 3.0要求UseRouting必须放在UseAuthentication和UseAuthorization之前,否则认证授权逻辑无法匹配到路由对应的控制器特性,也无法正常触发跳转逻辑。
修正后的Configure核心顺序示例:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseCors(options => options.AllowAnyOrigin()); app.UseSession(); var options = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>(); app.UseRequestLocalization(options.Value); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseCookiePolicy(); // 正确顺序:先路由,再认证,再授权 app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); // 最后配置端点/路由规则 app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=AdminHome}/{action=Index}/{id?}"); }); }
注意:你原来重复配置了UseMvcWithDefaultRoute和UseMvc,.NET Core 3.0+推荐用UseEndpoints的写法,移除多余的MVC配置避免冲突。
2. 配置Cookie认证的跳转路径
你需要在Startup的ConfigureServices方法中配置Cookie认证选项,指定未登录(401)和无权限(403)的跳转地址,这里的路径指向UI层AccountController的登录动作即可:
public void ConfigureServices(IServiceCollection services) { services.AddAuthentication("CookieAuth") .AddCookie("CookieAuth", options => { // 未认证时跳转的登录页地址 options.LoginPath = "/Account/Login"; // 无权限时跳转的地址,也可以直接指定为登录页 options.AccessDeniedPath = "/Account/Login"; // 如果跨子项目共享登录状态,需要统一配置Cookie的Domain和名称 options.Cookie.Name = "SharedAuthCookie"; // 本地测试如果是不同端口可不用配置Domain,生产环境配置为根域名即可 // options.Cookie.Domain = ".yourdomain.com"; }); // 其他服务配置... services.AddControllersWithViews(); }
注意:所有需要共享登录状态的子项目,都要配置相同的Cookie名称、加密密钥和认证方案,否则登录状态无法跨项目识别。
3. 可选:自定义状态码捕获中间件
如果上述配置仍不生效,可以添加自定义中间件主动捕获401、403状态码并强制跳转:
// 在Configure方法中,UseRouting之前添加该中间件 app.Use(async (context, next) => { await next(); if (context.Response.StatusCode == 401 || context.Response.StatusCode == 403) { context.Response.Redirect("/Account/Login?returnUrl=" + Uri.EscapeDataString(context.Request.Path + context.Request.QueryString)); await context.Response.CompleteAsync(); } });
内容的提问来源于stack exchange,提问作者hkyaaa
相关产品推荐
相关产品推荐

