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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:47:30