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

React + .NET Core 6跨域问题:AWS IIS部署后出现CORS报错

ASP.NET Core + React 部署至AWS IIS后CORS问题排查

问题概述

后端为ASP.NET Core Web/API,前端使用React.js,本地环境跨域请求正常,但部署到AWS IIS后,当https://xyz123.com调用https://abc123.com的API时触发CORS错误,同域名/vanity url调用则无异常。报错信息:

Access to fetch at 'https://abc123.com/api/home/getLoggedInUser/' from origin 'https://xyz123.com' 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 an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

用户已配置ASP.NET Core CORS策略,但问题未解决,尝试过多数Stack Overflow方案无效。


相关代码

后端Program.cs CORS配置

builder.Services.AddCors(options =>
{
    options.AddPolicy("CorsPolicy",
        builder => builder.WithOrigins("http://localhost:3000"
        , "https://abc123.COM"
        , "https://abc123.com"
        , "https://abc123com"
        , "https://abc123.com"
        , "https://xyz123.com"
        , "https://xyz123.com"
        , "https://xyz123.com"
        , "https://xyz123.com")
        .AllowAnyMethod()
        .AllowAnyHeader()
        .AllowCredentials());
});
builder.Services.AddHttpContextAccessor();
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddAuthentication(IISDefaults.AuthenticationScheme);
var app = builder.Build();
app.UseCors("CorsPolicy");
// Configure the HTTP request pipeline.
if (app.Environment.IsEnvironment("Local"))    
{
   app.UseSwagger();
   app.UseSwaggerUI();
}

app.UseHttpsRedirection();
app.UseDefaultFiles();
app.UseAuthentication();
app.UseAuthorization();   
app.MapControllers();
app.Run();

前端React请求代码

useEffect(() => {
    fetch(url + "home/getLoggedInUser/"+window.TestingUser, {
       credentials: "include",
       mode: 'cors',
       headers: {
          "accepts": "application/json"
           }
      })
      .then(res => res.json())
      .then(result =>console.log(result)) 

}, [])

排查与解决方案

1. IIS层面CORS拦截

AWS上的IIS可能通过自带模块或配置覆盖ASP.NET Core的CORS响应:

  • 检查IIS是否安装CORS模块,若已安装,需确保其配置和ASP.NET Core策略一致,或直接禁用该模块,让ASP.NET Core全权处理跨域。
  • 检查IIS站点的HTTP响应头设置,若手动添加了Access-Control-Allow-Origin,需删除避免和后端配置冲突。

2. 中间件顺序调整

当前app.UseCors位置基本正确,但需确保在UseHttpsRedirection之前执行,避免重定向导致预请求(OPTIONS)响应头丢失:

var app = builder.Build();
// 先启用CORS,再处理HTTPS重定向
app.UseCors("CorsPolicy");
app.UseHttpsRedirection();
// 其余中间件...

3. 清理无效的CORS域名配置

代码中WithOrigins存在重复域名、格式错误(如https://abc123com缺少点号),这些无效条目可能导致策略解析异常,清理后统一格式:

options.AddPolicy("CorsPolicy",
    builder => builder.WithOrigins(
        "http://localhost:3000",
        "https://abc123.com",
        "https://xyz123.com"
    )
    .AllowAnyMethod()
    .AllowAnyHeader()
    .AllowCredentials());

注意:WithOrigins对域名大小写、协议(http/https)严格匹配,必须和请求的Origin完全一致。

4. 确保OPTIONS请求被正确处理

IIS可能拦截OPTIONS请求,需在Web.config中添加配置,确保请求转发到ASP.NET Core:

<system.webServer>
  <handlers>
    <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
  </handlers>
  <aspNetCore processPath="dotnet" arguments=".\YourApp.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
  <!-- 移除可能冲突的自定义头 -->
  <httpProtocol>
    <customHeaders>
      <remove name="Access-Control-Allow-Origin" />
    </customHeaders>
  </httpProtocol>
</system.webServer>

5. AWS负载均衡/WAF检查

若应用前有AWS ALB或WAF,需确认:

  • ALB是否配置了CORS规则,是否覆盖后端响应头。
  • WAF是否有规则阻止OPTIONS请求或修改响应头。

6. 验证方法

用Postman直接发送OPTIONS请求到目标API,查看响应头是否包含Access-Control-Allow-Origin: https://xyz123.com:

  • 若无该头,说明后端/IIS未正确处理;
  • 若有该头,需排查浏览器缓存或前端请求配置问题。

内容的提问来源于stack exchange,提问作者ayush mishra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 03:58:13