.NET Core从2.1升级到3.1后出现Blocked by CORS错误如何解决?
问题根因
.NET Core 3.1 对中间件执行顺序的要求比2.1更严格,你的配置存在两个核心问题:
- CORS 中间件放在了认证中间件之后:前端发起跨域请求时会先发送不带任何认证信息的OPTIONS预检请求,会被你的认证中间件直接拦截返回,不会携带CORS响应头,所以前端报跨域错误。Postman不会主动发起预检请求,直接发送带认证信息的正式请求,所以可以正常调用。
- 如果前端请求携带了认证凭证(Cookie、自定义Authorization头等),
AllowAnyOrigin()配置在3.1中默认不生效,会被CORS策略拦截。
解决方案
1. 调整中间件执行顺序
修改Configure方法的中间件顺序,严格按照「路由→CORS→认证」的顺序排列:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.MyRequireTLSOnRemoteConnections(); // 建议先检查该自研中间件是否会拦截OPTIONS请求,不要直接返回响应,要允许后续中间件处理 if (env.EnvironmentName == "Development") { app.UseDeveloperExceptionPage(); } // 必须放在最前面的路由中间件 app.UseRouting(); // CORS中间件必须放在认证中间件之前 app.UseCors("MyCorsPolicy"); // 认证类中间件全部放在CORS之后 app.UseAuthentication(); app.UseReportingAuthentication(); app.UseSwagger(); // ... 其余原有配置保持不变 }
2. 适配带凭证的跨域请求(如果前端请求带凭证)
如果前端请求开启了withCredentials=true,需要修改ConfigureServices中的CORS策略,显式指定允许的前端域名:
services.AddCors(options => { options.AddPolicy("MyCorsPolicy", builder => builder .WithOrigins("https://mainapp.net") // 替换为实际的前端访问域名,多个域名用逗号分隔 .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials()); // 允许携带认证凭证 });
验证排查步骤
- 抓包查看OPTIONS预检请求的响应状态码,如果是401/403,说明认证中间件还在拦截预检请求,确认中间件顺序是否正确
- 临时注释自研的
MyRequireTLSOnRemoteConnections中间件测试,如果恢复正常,说明该中间件提前拦截了OPTIONS请求,需要修改该中间件逻辑,放过OPTIONS请求 - 确认前端是否携带凭证,如果没有携带凭证可以保留
AllowAnyOrigin()配置,无需调整
内容的提问来源于stack exchange,提问作者KVN
相关产品推荐
相关产品推荐

