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)调整
- 修正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配置,避免每个请求重复编写。
验证步骤
- 重启后端服务,清空浏览器中localhost域名下的所有缓存Cookie
- 前端重新发起登录请求,确认登录接口正常返回
- 再访问受保护的待办接口,即可正常拿到当前用户的待办数据,不会再出现跳转到登录页的错误。
内容的提问来源于stack exchange,提问作者Xyloto
相关产品推荐
相关产品推荐

