问题描述
是的,这是另一个 CORS 问题,我为这个问题搜索了三天多,试图了解发生了什么。
在这个 repo 下找到的示例应用程序 Sample Application
-
我正在使用托管在本地 IIS 中的 ASP.net Core 2.2,启用 Windows 身份验证并禁用匿名身份验证。 配置为允许 CORS。
services.AddCors(options => { options.AddPolicy("AllowOrigin",builder => builder .SetIsOriginAllowed(origin => true) .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials() ); });
-
为了处理预检请求,我创建了自定义中间件
private Task BeginInvoke(HttpContext context) { if (context.Request.Method == "OPTIONS") { if (!string.IsNullOrEmpty( context.Request.Headers["Origin"]) ) context.Response.Headers.Add("Access-Control-Allow-Origin",new[] { (string)context.Request.Headers["Origin"] }); context.Response.Headers.Add("Access-Control-Allow-Headers",new[] { "foo,Access2,Origin,X-Requested-With,Content-Type,Accept,authentication" }); context.Response.Headers.Add("Access-Control-Allow-Methods",new[] { "GET,POST,PUT,DELETE,OPTIONS" }); context.Response.Headers.Add("Access-Control-Allow-Credentials",new[] { "true" }); context.Response.StatusCode = 200; return Task.CompletedTask; //context.Response.WriteAsync("OK"); } return _next.Invoke(context); //complete request pipline }
-
当我尝试发送带有客户标头(预检请求)(请求 A)的复杂请求时
fetch('http://localhost:8050/api/values',{credentials:'include',headers:{'foo':'foo'}}) .then(response => response.json()) .then(data => console.log(data));
这是请求在 fiddler 中的方式,(对于您的信息,此请求未到达 ASP.Net 应用程序而只是点击 IIS)
- => 401
- => 401
- => 200
如 fiddler 所示(它是
- 然后,如果我再次尝试复杂请求(请求 A)(第一次导致错误),它不会出现任何问题,因为两个请求
- 响应为 200(成功)的预检请求(OPTIONS 动词)
- 实际请求(GET 动词),所需响应为 200(成功)
这里是fiddler分析
我的问题
- 为什么在激活 fiddler 时一个简单的 get 请求(来自 chrome)可以解决我的所有问题,并允许我在此之后发出任何复杂的 CORS 请求而不会出现任何错误。
- 我如何能够毫无问题地发出复杂的 CORS 请求(无需提琴手)。
请注意,我在考虑(可能是错误的)fiddler 充当处理 IIS 的代理,并且可以在 IIS 接受任何复杂请求后进行所需的身份验证握手。
在这个 repo 下找到的示例应用程序 Sample Application
解决方法
我找到了解决我的问题的方法:正如 Lex Li 所暗示的,它与 IIS CORS 模块有关
IIS 中的 CORS 部署到 IIS 时,如果服务器未配置为允许匿名访问,则 CORS 必须在 Windows 身份验证之前运行。为了支持这种情况,需要为应用安装和配置 IIS CORS 模块。
通过从 IIS CORS Module 安装 IIS CORS 模块
对于 IIS CORS 模块文档 IIS CORS documentation
感谢 Lex Li的支持