预检请求成功后仍出现CORS错误的技术求助
问题
从前端(Angular)发送POST请求时,.NET后端对预检OPTIONS请求返回200状态码,但后续POST请求仍触发CORS错误,已尝试多种方法未解决。
后端CORS配置代码
builder.Services.AddCors(options => { options.AddDefaultPolicy( policy => { policy.SetIsOriginAllowed(_ => true).AllowAnyHeader().AllowAnyMethod(); }); }); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.UseRouting(); app.Use((context, next) => { if (!context.Request.Headers.Any(k => k.Key.Contains("Origin")) || context.Request.Method != "OPTIONS") { return next.Invoke(); } context.Response.StatusCode = 200; return context.Response.WriteAsync("handled"); }); app.UseAuthentication(); app.UseCors(); app.UseMvcWithDefaultRoute(); app.UseAuthorization(); app.MapControllers(); app.Run();
环境信息
- 浏览器:Brave、Chrome(均复现问题)
- .NET版本:net6.0
已尝试的解决方法
- 开启所有源、请求头和方法的CORS权限
- 显式启用特定源(不含末尾斜杠)
- 在对应控制器上使用
[EnableCors]特性 - 使用
SetIsOriginAllowed(_ => true)替代AllowAnyOrigin() - 重启服务器
- 删除
obj和bin目录后重新构建运行 - 重启电脑
- 在Brave中设置安全浏览为“无保护”
- 调整中间件添加顺序
- 移除
UseHttpsRedirection()改用HTTP协议 - 修改发送的负载格式
问题根源与解决方案
问题出在自定义的OPTIONS请求处理中间件:手动拦截OPTIONS请求返回200,但未添加浏览器验证CORS所需的响应头(如Access-Control-Allow-Origin、Access-Control-Allow-Headers等),导致预检请求状态码正常但授权信息缺失,后续POST请求被浏览器拦截。
修复步骤:
删除自定义OPTIONS拦截中间件
移除这段手动处理OPTIONS请求的代码,.NET原生UseCors中间件会自动完成预检请求的正确处理:app.Use((context, next) => { if (!context.Request.Headers.Any(k => k.Key.Contains("Origin")) || context.Request.Method != "OPTIONS") { return next.Invoke(); } context.Response.StatusCode = 200; return context.Response.WriteAsync("handled"); });调整中间件顺序
确保UseCors位于UseRouting之后,UseAuthentication、UseAuthorization、UseMvcWithDefaultRoute和MapControllers之前,正确顺序示例:app.UseRouting(); app.UseCors(); app.UseAuthentication(); app.UseAuthorization(); app.UseMvcWithDefaultRoute(); app.MapControllers();验证响应头
重启后端后,检查OPTIONS请求的响应头,确认包含Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Headers等必要字段。
内容的提问来源于stack exchange,提问作者user13998592
相关产品推荐
相关产品推荐

