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

如何在启用Windows身份验证的IIS上授权CORS预检请求

解决Windows身份验证下ASP.NET Core API的CORS预检401问题

这个问题的核心原因是IIS的Windows身份验证会先拦截OPTIONS预检请求——这类请求默认不带Windows凭据,所以IIS直接返回401,导致ASP.NET Core的CORS中间件根本没机会处理并返回跨域允许的响应头。下面是分步解决的方案:

1. 配置IIS允许OPTIONS请求匿名访问

因为ASP.NET Core部署在IIS上,需要通过web.config调整IIS的身份验证规则,让OPTIONS请求跳过身份验证:

在项目根目录新建或修改web.config,添加以下配置:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="OPTIONSVerbHandler" path="*" verb="OPTIONS" modules="ProtocolSupportModule" resourceType="Unspecified" requireAccess="None" />
    </handlers>
    <security>
      <authorization>
        <add accessType="Allow" users="*" verbs="OPTIONS" />
      </authorization>
    </security>
  </system.webServer>
</configuration>

这段配置告诉IIS:所有OPTIONS请求都允许匿名访问,不会触发Windows身份验证拦截。

2. 修正ASP.NET Core的CORS配置

你的现有配置顺序是对的(UseCors必须在UseMvc之前),但需要注意几个细节:

  • WithOrigins的URL末尾不要加斜杠(比如用http://theURLofTheFront:8080而非http://theURLofTheFront:8080/)
  • 明确指定允许的请求头,避免潜在冲突

修正后的Startup.cs配置:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
    {
        options.AddPolicy("AllowSpecificOrigin", builder =>
        {
            builder.WithOrigins("http://theURLofTheFront:8080")
                   .AllowAnyMethod()
                   .AllowHeaders("Content-Type") // 明确允许业务需要的请求头
                   .AllowCredentials();
        });
    });
    services.AddMvc();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();
    
    // 必须在UseMvc之前调用UseCors,确保CORS规则先生效
    app.UseCors("AllowSpecificOrigin");
    app.UseMvc();
}

3. 修正前端请求配置

你在前端请求头里添加的Access-Control-Allow-Origin和Access-Control-Allow-Credentials是后端返回的响应头,前端完全不需要设置,添加它们反而会导致请求异常:

修正后的前端代码:

// 只保留必要的业务请求头
private headers = new Headers({ 'Content-Type': 'application/json' });
// 确保开启跨域携带凭据
let options = new RequestOptions({ headers: this.headers, withCredentials: true });
return this.http.get(this.tasksUrl, options).map(res => res.json());

额外验证步骤

  • 确认IIS站点已启用Windows身份验证,同时禁用匿名身份验证(如果你的API需要强制身份验证)
  • 用浏览器开发者工具查看OPTIONS请求的响应:确认返回200状态码,且包含Access-Control-Allow-Origin、Access-Control-Allow-Credentials等响应头
  • 确认前端页面的Origin和你在CORS策略中配置的地址完全一致(包括端口号)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:54:04