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

ASP.NET Core Web API登录成功后请求仍重定向至登录页

问题原因

Postman可正常访问、浏览器访问异常是两类环境请求行为差异+配置错误共同导致的:

  • ASP.NET Core Identity默认会将所有未认证请求(无论是否为API接口)重定向到/Identity/Account/Login登录页,而非给API请求返回标准401状态码;同时现有配置未适配跨域Cookie传递规则,后端配置的Cookie策略、中间件顺序存在问题,跨域场景下浏览器无法正常携带身份凭证。
  • Angular HttpClient默认在跨域请求中不会携带Cookie,哪怕登录后后端已经种下身份凭证,请求受保护接口时也不会带上,后端判定用户未登录就会触发重定向。
  • Postman无浏览器同源策略限制,会自动持久化并携带登录接口返回的Cookie,同时不会自动拦截重定向响应,因此可以正常访问接口。
修复方案

后端(ASP.NET Core Web API)调整

  1. 修正Program.cs中的服务注册与中间件顺序,针对API路径关闭登录重定向逻辑,配置跨域Cookie合法规则:
// 替换原有空AddAuthentication调用,保留AddDefaultIdentity配置并补充Cookie规则
builder.Services.AddDefaultIdentity<ApplicationUser>()
    .AddEntityFrameworkStores<ToDoAngularDbContext>();

// 配置Identity Cookie行为
builder.Services.ConfigureApplicationCookie(options =>
{
    options.Events.OnRedirectToLogin = context =>
    {
        // 访问/api路径下的接口时,未认证直接返回401,不跳登录页
        if (context.Request.Path.StartsWithSegments("/api"))
        {
            context.Response.StatusCode = StatusCodes.Status401Unauthorized;
            return Task.CompletedTask;
        }
        // 非API请求保留原有重定向逻辑
        context.Response.Redirect(context.RedirectUri);
        return Task.CompletedTask;
    };
    // 允许跨域场景下Cookie被前端携带
    options.Cookie.SameSite = SameSiteMode.None;
    options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
});

// 其他服务注册(ToDoRepository、ToDoService等)保持不变

var app = builder.Build();

// 调整中间件为正确顺序
if (app.Environment.IsDevelopment())
{
   app.UseSwagger();
   app.UseSwaggerUI();
}

app.UseHttpsRedirection();
// UseCors必须放在UseAuthentication、UseAuthorization之前
app.UseCors(options => options.WithOrigins("https://localhost:44426")
                          .AllowAnyMethod()
                          .AllowAnyHeader()
                          .AllowCredentials());

app.UseAuthentication();
app.UseAuthorization();

// 后续MapControllers等配置保持原有逻辑

注意:ASP.NET Core Identity默认生成的用户主键为字符串类型GUID,你在GetAll接口中用int.TryParse转换用户Id会得到0值,请确认你的ApplicationUser主键类型为int,否则会查询到错误的待办数据。

前端(Angular)调整

所有发往后端的请求需要开启withCredentials配置,允许跨域场景下携带身份Cookie。修改HomeComponent中的请求代码:

ngOnInit(): void {
  const headers: HttpHeaders = new HttpHeaders()
    .set('Content-Type', 'application/json');

  this.http.get<ToDoModel[]>(this.apiUrl, { 
    headers: headers, 
    observe: 'response',
    withCredentials: true // 新增配置,允许请求携带跨域Cookie
  }).subscribe(result => {
    if (result?.status == HttpStatusCode.Ok) {
      this.toDos = result.body;
    }
  },
  error => console.error(error));
}

如果项目中存在多个后端接口请求,建议实现全局HTTP拦截器统一添加withCredentials: true配置,避免每个请求重复编写。

验证步骤
  1. 重启后端服务,清空浏览器中localhost域名下的所有缓存Cookie
  2. 前端重新发起登录请求,确认登录接口正常返回
  3. 再访问受保护的待办接口,即可正常拿到当前用户的待办数据,不会再出现跳转到登录页的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:21:20