React + .NET Core 6跨域问题: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

