在 fiddler 工作之前,CORS 预检请求不会命中 IIS
CORS preflight request doesn't hit IIS until fiddler is working
是的,这是另一个 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
}
当我尝试向客户发送复杂请求时 header(预检请求)(请求 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)
- 最有趣的事情是 激活 fiddler 然后创建一个从浏览器(chrome) 到端点('http://localhost:8050) 的简单获取请求/api/values), 会产生三次认证握手成功
- => 401
- => 401
- => 200
如fiddler中所示(是
- 然后,如果我再次尝试复杂请求(请求 A)(第一次导致错误),它作为两个请求没有任何问题
- 预检请求(OPTIONS 动词),响应为 200(成功)
- 要求响应为 200 的实际请求(GET 动词)(成功)
fiddler分析到这里
我的问题
- 为什么在激活 fiddler 时一个简单的 get 请求(来自 chrome)解决了我所有的问题,并允许我在之后发出任何复杂的 CORS 请求而不会出现任何错误。
- 如何毫无问题地发出复杂的 CORS 请求(不需要 fiddler)。
请注意,我在考虑(可能是错误的)Fiddler 充当处理 IIS 的代理,并且可以在 IIS 接受任何复杂请求后进行所需的身份验证握手。
在此 repo 下找到的示例应用程序
Sample Application
我找到了我的问题的解决方案: Lex Li 建议它与 IIS CORS 模块有关
CORS in IIS
When deploying to IIS, CORS has to run before Windows Authentication if the server isn't configured to allow anonymous access. To support this scenario, the IIS CORS module needs to be installed and configured for the app.
通过从 IIS CORS Module
安装 IIS CORS 模块
IIS CORS 模块文档IIS CORS documentation
感谢 Lex Li的支持
是的,这是另一个 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 }
当我尝试向客户发送复杂请求时 header(预检请求)(请求 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)
- 最有趣的事情是 激活 fiddler 然后创建一个从浏览器(chrome) 到端点('http://localhost:8050) 的简单获取请求/api/values), 会产生三次认证握手成功
- => 401
- => 401
- => 200
如fiddler中所示(是
- 然后,如果我再次尝试复杂请求(请求 A)(第一次导致错误),它作为两个请求没有任何问题
- 预检请求(OPTIONS 动词),响应为 200(成功)
- 要求响应为 200 的实际请求(GET 动词)(成功)
fiddler分析到这里
我的问题
- 为什么在激活 fiddler 时一个简单的 get 请求(来自 chrome)解决了我所有的问题,并允许我在之后发出任何复杂的 CORS 请求而不会出现任何错误。
- 如何毫无问题地发出复杂的 CORS 请求(不需要 fiddler)。
请注意,我在考虑(可能是错误的)Fiddler 充当处理 IIS 的代理,并且可以在 IIS 接受任何复杂请求后进行所需的身份验证握手。
在此 repo 下找到的示例应用程序 Sample Application
我找到了我的问题的解决方案: Lex Li 建议它与 IIS CORS 模块有关
CORS in IIS When deploying to IIS, CORS has to run before Windows Authentication if the server isn't configured to allow anonymous access. To support this scenario, the IIS CORS module needs to be installed and configured for the app.
通过从 IIS CORS Module
安装 IIS CORS 模块IIS CORS 模块文档IIS CORS documentation
感谢 Lex Li的支持