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

如何在Http.sys服务中禁用CORS预检请求的身份验证?

解决HttpSys服务中CORS预检请求的认证问题

可以做到无需手动添加OPTIONS端点,就能让预检请求跳过HttpSys的身份验证,核心是通过HttpSys的认证方案选择器,针对OPTIONS请求单独跳过认证逻辑,具体实现如下:

修改HttpSys配置

在UseHttpSys的配置中添加AuthenticationSchemeSelector委托,判断请求方法为OPTIONS时,返回null以跳过认证:

builder.WebHost.UseHttpSys(options =>
{
    options.Authentication.Schemes = AuthenticationSchemes.Negotiate;
    options.Authentication.AllowAnonymous = false;
    
    // 针对OPTIONS请求跳过认证
    options.Authentication.AuthenticationSchemeSelector = context =>
    {
        if (string.Equals(context.Request.Method, "OPTIONS", StringComparison.OrdinalIgnoreCase))
        {
            return null; // 不启用任何认证方案,允许匿名访问
        }
        return AuthenticationSchemes.Negotiate.ToString();
    };

    if (prefixes?.Count > 0)
    {
        foreach (var prefix in prefixes)
        {
            options.UrlPrefixes.Add(prefix);
        }
    }
});

原理说明

  1. 问题根源:HttpSys的身份验证是在ASP.NET Core管道之前执行的,你之前全局开启了Negotiate认证且不允许匿名,导致OPTIONS预检请求还没到达CORS中间件就被拦截,返回401,自然无法带上CORS响应头。
  2. 解决方案的作用:通过AuthenticationSchemeSelector,让HttpSys对OPTIONS请求跳过认证,允许其进入ASP.NET Core管道,此时CORS中间件会处理该请求并返回必要的Access-Control-Allow-Origin等响应头,解决浏览器的CORS错误。
  3. 无需手动添加OPTIONS端点:ASP.NET Core在配置CORS后,会自动处理OPTIONS预检请求,不需要为每个API端点单独定义OPTIONS方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 17:30:55