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

ASP.NET Core Web API CORS问题求助:配置后仍报跨域错误

ASP.NET Core Web API CORS 问题排查与解决

可能的原因分析

  • 中间件顺序错误:CORS中间件必须放在路由、认证类中间件之前。如果app.UseCors()在app.UseAuthorization()或app.MapControllers()之后,预检请求会被其他中间件优先拦截,无法返回CORS响应头。
  • 策略配置未正确关联:配置CORS策略时,可能存在默认策略未生效、多策略冲突的情况。比如使用AddCors(options => options.AddPolicy(...))却未指定默认策略,或UseCors()未关联正确的策略名称。
  • 反向代理/负载均衡干扰:若API部署在Nginx、IIS ARR等反向代理后,代理可能修改或剥离CORS响应头;同时如果代理未正确转发Origin请求头,ASP.NET Core的CORS中间件无法识别请求来源,不会返回对应响应头。
  • 凭据配置细节问题:虽然指定了具体源并开启AllowCredentials(),但如果前端请求未携带withCredentials: true(Axios/Fetch场景),浏览器可能不会处理CORS响应头,进而触发错误提示。
  • 认证中间件拦截预检请求:/v1/authenticate这类认证端点的预检请求(OPTIONS方法)不会携带认证信息,若认证中间件拦截了OPTIONS请求,会导致CORS响应头无法返回。

解决方案步骤

1. 修正中间件顺序

确保UseCors()在UseRouting()之后、UseAuthorization()和MapControllers()之前,示例代码如下:

var builder = WebApplication.CreateBuilder(args);

// 注册CORS服务,配置默认策略
builder.Services.AddCors(options =>
{
    options.AddDefaultPolicy(policy =>
    {
        policy.WithOrigins("http://localhost:4200", "https://dev-backoffice.mydomain.com", "https://backoffice.mydomain.com")
              .AllowAnyHeader()
              .AllowAnyMethod()
              .AllowCredentials();
    });
});

builder.Services.AddControllers();

var app = builder.Build();

app.UseHttpsRedirection();
// CORS中间件位置必须正确
app.UseCors();

app.UseRouting();
app.UseAuthorization();

app.MapControllers();

app.Run();

2. 验证CORS策略是否生效

添加测试端点并通过curl发送预检请求,检查响应头:

[HttpGet("test-cors")]
public IActionResult TestCors()
{
    return Ok(new { Message = "CORS test" });
}

执行curl命令:

curl -X OPTIONS https://dev-api.mydomain.com/v1/test-cors \
-H "Origin: https://dev-backoffice.mydomain.com" \
-H "Access-Control-Request-Method: GET" \
-H "Access-Control-Request-Headers: Content-Type"

若响应头中没有Access-Control-Allow-Origin: https://dev-backoffice.mydomain.com,说明策略未正确应用,需检查AddDefaultPolicy与UseCors()的关联逻辑。

3. 调整反向代理配置(若有)

以Nginx为例,确保转发Origin头并允许传递CORS响应头:

location / {
    proxy_pass https://your-api-upstream;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    # 转发Origin请求头
    proxy_set_header Origin $http_origin;
    # 允许传递CORS响应头
    proxy_pass_header Access-Control-Allow-Origin;
    proxy_pass_header Access-Control-Allow-Credentials;
}

4. 确认前端请求配置

Axios场景需开启withCredentials:

const axiosInstance = axios.create({
    baseURL: 'https://dev-api.mydomain.com/v1',
    withCredentials: true
});

Fetch API场景需设置credentials: 'include':

fetch('https://dev-api.mydomain.com/v1/authenticate', {
    method: 'POST',
    credentials: 'include',
    headers: {
        'Content-Type': 'application/json'
    },
    body: JSON.stringify(credentials)
});

5. 避免认证中间件拦截预检请求

在Program.cs中配置,让认证中间件跳过OPTIONS请求:

app.UseWhen(context => context.Request.Method != "OPTIONS", appBuilder =>
{
    appBuilder.UseAuthorization();
});

内容的提问来源于stack exchange,提问作者Dave Lyons

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:24:55