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

.NET Core从2.1升级到3.1后出现Blocked by CORS错误如何解决?

问题根因

.NET Core 3.1 对中间件执行顺序的要求比2.1更严格,你的配置存在两个核心问题:

  1. CORS 中间件放在了认证中间件之后:前端发起跨域请求时会先发送不带任何认证信息的OPTIONS预检请求,会被你的认证中间件直接拦截返回,不会携带CORS响应头,所以前端报跨域错误。Postman不会主动发起预检请求,直接发送带认证信息的正式请求,所以可以正常调用。
  2. 如果前端请求携带了认证凭证(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:09:02