ASP.NET Core 2.0及IIS中,Windows身份验证前拦截HTTP OPTIONS请求
在ASP.NET Core 2.0和IIS中拦截Windows身份验证前的HTTP OPTIONS请求
这个问题我之前帮不少开发者解决过——CORS预检的OPTIONS请求被Windows身份验证拦截确实是个常见坑,尤其是在ASP.NET Core 2.0搭配IIS的场景下。核心问题在于:OPTIONS预检请求默认不带身份凭证,但Windows身份验证会强制要求认证,导致请求直接返回401,预检失败。下面分两部分给你讲清楚怎么解决:
一、ASP.NET Core 2.0层面:提前注册OPTIONS处理中间件
你已经写了中间件,但大概率是注册顺序不对——中间件是按管道顺序执行的,必须让OPTIONS处理逻辑跑在身份验证中间件之前,才能跳过认证环节。
1. 完善你的中间件代码
先把中间件补全,确保覆盖必要的CORS头:
public class CorsPreflightMiddleware { private readonly RequestDelegate _next; public CorsPreflightMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context) { // 匹配OPTIONS请求,忽略大小写 if (context.Request.Method.Equals("OPTIONS", StringComparison.OrdinalIgnoreCase)) { context.Response.StatusCode = 204; // No Content,符合预检要求 // 配置你的允许源、凭证、方法和头 context.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "http://cwfr003320:9393" }); context.Response.Headers.Add("Access-Control-Allow-Credentials", new[] { "true" }); context.Response.Headers.Add("Access-Control-Allow-Methods", new[] { "GET, POST, PUT, DELETE, OPTIONS" }); context.Response.Headers.Add("Access-Control-Allow-Headers", new[] { "Content-Type, Authorization" }); return; // 直接返回,不进入后续中间件(包括身份验证) } // 非OPTIONS请求,继续走管道 await _next(context); } } // 写个扩展方法方便注册 public static class CorsPreflightMiddlewareExtensions { public static IApplicationBuilder UseCorsPreflight(this IApplicationBuilder builder) { return builder.UseMiddleware<CorsPreflightMiddleware>(); } }
2. 调整中间件注册顺序
在Startup.cs的Configure方法里,必须把这个中间件放在最前面,至少要在UseAuthentication之前:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { // 第一步就注册OPTIONS拦截中间件 app.UseCorsPreflight(); // 然后才是身份验证等其他中间件 app.UseAuthentication(); // 其他中间件(比如MVC) app.UseMvc(); }
二、IIS层面:让IIS跳过OPTIONS请求的身份验证
即使ASP.NET Core配置好了,IIS的Windows身份验证模块可能会在请求到达.NET管道之前就拦截OPTIONS请求,直接返回401。这时候需要修改web.config来配置授权规则:
在web.config的<system.webServer>节点下添加以下配置:
<security> <authentication> <windowsAuthentication enabled="true" /> </authentication> <authorization> <!-- 允许所有OPTIONS请求跳过身份验证 --> <add accessType="Allow" users="*" verbs="OPTIONS" /> <!-- 其他所有请求都需要身份验证(拒绝匿名) --> <add accessType="Deny" users="?" /> </authorization> </security>
这个配置告诉IIS:所有OPTIONS请求不管是谁都允许访问,不需要走Windows身份验证;其他请求则必须经过认证才能进入.NET管道。
最后验证
部署后,用浏览器开发者工具看网络请求:OPTIONS请求应该返回204,且带有你设置的CORS头,不会触发401认证。后续的业务请求(比如GET/POST)则会正常走Windows身份验证流程。
内容的提问来源于stack exchange,提问作者FRZ7
相关产品推荐
相关产品推荐

