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

部署在IIS的ASP.NET Web API启用跨域凭证后仍遭CORS拦截问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 12:50:57