部署在IIS的ASP.NET Web API启用跨域凭证后仍遭CORS拦截问题
问题现象
访问部署在IIS上的ASP.NET Web API时触发CORS拦截错误,具体提示:
Access to XMLHttpRequest at 'http://localhost:8001/UserAuth/Login' from origin 'http://localhost:5173' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: The 'Access-Control-Allow-Origin' header contains multiple values 'http://localhost:5173, http://localhost:5173', but only one is allowed.
且仅当控制器访问SQL Server数据库时才会触发该错误。
已做的CORS配置
1. Program.cs中的策略配置
builder.Services.AddCors(options => { options.AddPolicy("AllowCors", policy => { policy.WithOrigins("https://tauri.localhost/", "http://localhost:5173") .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials(); }); });
2. Web.config中的自定义Header配置
<configuration> <location path="." inheritInChildApplications="false"> <system.webServer> <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="*" /> <add name="Access-Control-Allow-Methods" value="GET,POST,OPTIONS" /> <add name="Access-Control-Allow-Headers" value="Content-Type, soapaction" /> </customHeaders> </httpProtocol> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /> </handlers> <aspNetCore processPath="dotnet" arguments=".\server.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" /> </system.webServer> </location> </configuration>
注:曾尝试将Access-Control-Allow-Origin的值改为https://tauri.localhost/, http://localhost:5173,错误依旧。
解决方案
核心原因:重复设置CORS响应头
你同时在ASP.NET Core的CORS中间件和IIS的Web.config自定义Header中配置了CORS规则,导致响应中出现重复的Access-Control-Allow-Origin头,这是错误的根源。
步骤1:移除Web.config中的CORS自定义Header
删除system.webServer/httpProtocol/customHeaders下所有CORS相关的<add>节点,避免IIS与ASP.NET Core重复添加响应头:
<configuration> <location path="." inheritInChildApplications="false"> <system.webServer> <!-- 移除CORS自定义Header配置 --> <!--<httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="*" /> <add name="Access-Control-Allow-Methods" value="GET,POST,OPTIONS" /> <add name="Access-Control-Allow-Headers" value="Content-Type, soapaction" /> </customHeaders> </httpProtocol>--> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /> </handlers> <aspNetCore processPath="dotnet" arguments=".\server.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" /> </system.webServer> </location> </configuration>
步骤2:确保Program.cs中正确启用CORS中间件
添加CORS策略后,必须在请求管道中正确启用中间件,且位置需放在app.UseRouting()之后、app.UseAuthorization()之前:
var builder = WebApplication.CreateBuilder(args); // 注册CORS服务(保留现有配置) builder.Services.AddCors(options => { options.AddPolicy("AllowCors", policy => { policy.WithOrigins("https://tauri.localhost/", "http://localhost:5173") .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials(); }); }); builder.Services.AddControllers(); var app = builder.Build(); app.UseRouting(); // 启用CORS中间件(位置不能错) app.UseCors("AllowCors"); app.UseAuthorization(); app.MapControllers(); app.Run();
步骤3:排查SQL Server访问时的异常影响
访问数据库时触发错误,可能是数据库操作引发未处理异常,导致ASP.NET Core返回错误响应时,额外中间件重复添加CORS头。需确认:
- 数据库连接字符串配置正确,避免抛出未处理异常
- 检查全局异常处理中间件,确保异常响应中不会重复注入CORS头
验证
修改配置后重启IIS站点,重新发起请求,检查响应头中是否仅存在一个Access-Control-Allow-Origin值,且与请求源匹配。
内容的提问来源于stack exchange,提问作者Kroi

