如何在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); } } });
原理说明
- 问题根源:HttpSys的身份验证是在ASP.NET Core管道之前执行的,你之前全局开启了Negotiate认证且不允许匿名,导致OPTIONS预检请求还没到达CORS中间件就被拦截,返回401,自然无法带上CORS响应头。
- 解决方案的作用:通过
AuthenticationSchemeSelector,让HttpSys对OPTIONS请求跳过认证,允许其进入ASP.NET Core管道,此时CORS中间件会处理该请求并返回必要的Access-Control-Allow-Origin等响应头,解决浏览器的CORS错误。 - 无需手动添加OPTIONS端点:ASP.NET Core在配置CORS后,会自动处理OPTIONS预检请求,不需要为每个API端点单独定义OPTIONS方法。
内容的提问来源于stack exchange,提问作者ilitirit
相关产品推荐
相关产品推荐

