.NET 7升级至.NET 8后出现CORS策略错误,需如何解决?
问题背景
项目从.NET 7升级到.NET 8后,出现CORS拦截错误,前端请求被浏览器阻止。
当前CORS服务配置
services.AddCors(options => { options.AddPolicy(name: "apiCorsPolicy", builder => { builder.SetIsOriginAllowed(origin => true); builder.AllowAnyHeader().WithExposedHeaders("Content-Disposition"); builder.AllowAnyMethod(); builder.AllowCredentials(); }); });
错误信息
Access to XMLHttpRequest at 'https://test.cp.in/api/Auth/authenticate' from origin 'https://cp.in' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
当前中间件配置
if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } else app.UseHsts(); app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseCors("apiCorsPolicy"); app.UseAuthentication(); app.UseAuthorization(); app.UseCookiePolicy(); app.MapControllers();
解决方案
针对.NET 8的特性,从以下几个方向调整配置:
优化CORS策略写法
当同时使用AllowCredentials()和SetIsOriginAllowed(origin => true)时,.NET 8对响应头的处理逻辑有细微调整,建议将策略链式调用整合,避免拆分写法可能导致的配置失效:services.AddCors(options => { options.AddPolicy("apiCorsPolicy", policy => { policy.SetIsOriginAllowed(origin => true) .AllowAnyHeader() .WithExposedHeaders("Content-Disposition") .AllowAnyMethod() .AllowCredentials(); }); });检查反向代理配置
部署在Linux共享服务器上,大概率存在Nginx等反向代理,需要确保代理服务器不会篡改或丢弃CORS相关请求头。在Nginx配置中添加以下规则,保证Origin头正确传递到后端:proxy_set_header Origin $http_origin; proxy_pass_header Access-Control-Allow-Origin;验证HSTS的影响
生产环境启用的UseHsts可能和CORS响应头产生冲突,可临时注释app.UseHsts()测试是否解决问题,若有效则调整HSTS配置,允许CORS相关域名的访问规则。排查预检请求拦截
检查项目中是否存在自定义中间件提前拦截OPTIONS预检请求,.NET 8默认会自动处理OPTIONS请求,若有自定义逻辑终止OPTIONS请求,会直接导致CORS验证失败。
总结
优先排查反向代理的头传递问题,其次调整CORS策略的链式写法,确保配置逻辑在.NET 8中正常生效。若问题仍存在,可开启.NET的详细日志,查看CORS中间件的处理流程,定位具体的头缺失原因。
内容的提问来源于stack exchange,提问作者Lajith

