【发布时间】:2021-07-07 21:24:42
【问题描述】:
是的,这是另一个 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));
我遇到了一个错误
这就是请求在提琴手中的方式,(供您参考,此请求不会到达 ASP.Net 应用程序,只是点击 IIS)
- 激活提琴手然后创建一个简单的从浏览器(chrome)到端点('http://localhost:8050/api/values)的get请求时最有趣的事情,它会产生三次认证握手并成功
- => 401
- => 401
- => 200
- 然后,如果我再次尝试复杂的请求(请求 A)(第一次导致错误),它作为两个请求没有任何问题
- 响应为 200(succeded)的预检请求(OPTIONS 动词)
- 实际请求(GET 动词),所需响应为 200(succeded)
我的问题
- 为什么在激活 fiddler 时一个简单的 get 请求(来自 chrome)解决了我的所有问题,并允许我在此之后发出任何复杂的 CORS 请求而不会出现任何错误。
- 我如何可以毫无问题地发出复杂的 CORS 请求(无需提琴手)。
请注意,我正在考虑(可能是错误的)Fiddler 充当处理 IIS 的代理,并且可以在 IIS 接受任何复杂请求后进行所需的身份验证握手。
在此 repo 下找到的示例应用程序 Sample Application
【问题讨论】:
-
blogs.iis.net/iisteam/getting-started-with-the-iis-cors-module 如果没有该模块,则无需进一步讨论。
-
有没有考虑过chrome浏览器的原因,有没有试过其他浏览器?如果给chrome添加一些cors扩展,或许可以解决这个问题。如果你想在asp.net core中启用cors,可以参考这个链接:Enable Cross-Origin Requests (CORS) in ASP.NET Core.
-
@LexLi 但我想处理 CORS 抛出 ASP.NET 应用程序而不是我的 IIS 服务器?
-
你想要的不切实际。阅读该博客文章中的“使用 Windows 身份验证”以了解更多信息。
标签: asp.net-core iis cors fiddler preflight