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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 00:39:03