如何在启用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
相关产品推荐
相关产品推荐

