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

.NET Core ConfigureServices代码顺序异常导致请求跳登录如何修复?

问题根因

你遇到的全局请求自动跳转登录的问题主要来自两处配置错误:

  1. 中间件执行顺序错误:UseCors 放在了 UseAuthentication、UseAuthorization 之后,导致所有请求会先触发身份校验,未登录请求直接跳转登录,不会走CORS逻辑。
  2. 服务注册冗余:AddIdentity 内部已经默认注册了身份认证相关服务,你额外加的services.AddAuthentication() 会覆盖部分默认配置,和后续的 ConfigureApplicationCookie 配置产生冲突。

正确配置方案

1. ConfigureServices服务注册顺序修正

.NET Core服务注册通用优先级:自定义基础服务 -> 数据库上下文 -> 身份相关服务 -> 第三方组件 -> MVC/接口相关服务 -> 辅助服务(CORS、配置项等) -> 身份Cookie配置
修正后代码如下:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDI();//自定义服务注册
    services.AddDbContext<AppDbContext>();
    services.AddIdentity<AppUser, AppRole>(options =>
    {
        options.SignIn.RequireConfirmedEmail = true;
        options.User.RequireUniqueEmail = true;
    }).AddErrorDescriber<CustomIdentityValidator.CustomIdentityValidator>()
      .AddEntityFrameworkStores<AppDbContext>()
      .AddDefaultTokenProviders();

    services.AddAutoMapper(typeof(Startup));
    services.AddControllersWithViews();
    services.AddRazorPages();
    
    // 移除重复的services.AddAuthentication(),AddIdentity已经内置完成注册
    services.Configure<DataProtectionTokenProviderOptions>(options => options.TokenLifespan = TimeSpan.FromHours(5));
    services.Configure<EmailOptions>(Configuration);
    services.AddCors(opt =>
    {
        opt.AddPolicy("global", cors =>
        {
            cors.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();
        });
    });
    // Cookie配置必须放在身份服务注册之后
    services.ConfigureApplicationCookie(options =>
    {
        options.Cookie.Name = "test";
        options.Cookie.SameSite = Microsoft.AspNetCore.Http.SameSiteMode.Strict;
        options.Cookie.HttpOnly = true;
        options.ExpireTimeSpan = TimeSpan.FromDays(20);
        options.Cookie.SecurePolicy = Microsoft.AspNetCore.Http.CookieSecurePolicy.SameAsRequest;
        options.LoginPath = "/Home/SignIn";
        options.AccessDeniedPath = "/Home/AccessDenied";
    });
}

2. Configure中间件配置顺序修正

.NET Core中间件按从上到下的顺序执行,通用优先级:异常处理 -> 静态文件 -> 状态码页 -> CORS -> 路由 -> 身份认证 -> 授权 -> 端点配置
修正后代码如下:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, UserManager<AppUser> userManager, RoleManager<AppRole> roleManager, IWebSiteBussRepository webSiteBussRepository)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

    IdentityInitializer.SeedData(userManager, roleManager).Wait();
    IdentityInitializer.StaticPage(webSiteBussRepository).Wait();

    app.UseStatusCodePagesWithReExecute("/Home/StatusCode", "?code={0}");
    app.UseStaticFiles();
    // CORS必须移到身份校验之前执行
    app.UseCors("global");
    app.UseRouting();
    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
        endpoints.MapControllerRoute(
             name: "areas",
             pattern: "{area}/{controller=Home}/{action=Index}/{id?}"
             );
        endpoints.MapControllerRoute(
           name: "default",
           pattern: "{controller=Home}/{action=Index}/{id?}"
           );
    }); 
}

额外排查点

如果修正后仍存在跳转问题,检查以下配置:

  • 全局是否注册了[Authorize] 过滤器,导致所有接口默认需要登录
  • 登录路径/Home/SignIn 对应的Action是否加了[AllowAnonymous] 特性,否则登录页本身也会触发登录校验,导致无限重定向
  • 确认测试用的用户邮箱已经完成验证,你开启了RequireConfirmedEmail = true,未验证邮箱的用户即使账号密码正确也会被拦截

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 14:57:05