Asp.net core CORS飞行前请求不';在fiddler工作之前不要点击IIS

Asp.net core CORS飞行前请求不';在fiddler工作之前不要点击IIS,asp.net-core,iis,cors,fiddler,preflight,Asp.net Core,Iis,Cors,Fiddler,Preflight,是的,这是CORS的另一个问题,我已经为这个问题搜索了三天多,试图了解发生了什么 在此回购协议下找到的示例应用程序 我使用的是本地IIS中托管的ASP.net Core 2.2,启用了Windows身份验证,禁用了匿名身份验证。 配置为允许CORS services.AddCors(options => { options.AddPolicy("AllowOrigin", builder =&

是的,这是CORS的另一个问题,我已经为这个问题搜索了三天多,试图了解发生了什么

在此回购协议下找到的示例应用程序

  • 我使用的是本地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)

我犯了个错误

这是请求在fiddler中的方式(请注意,此请求未到达ASP.Net应用程序,只需点击IIS)

  • 最有趣的事情是激活fiddler然后创建一个从浏览器(chrome)到端点的简单get请求http://localhost:8050/api/values),它将产生三次身份验证握手并成功
  • =>401
  • =>401
  • =>200
  • 如fiddler所示(它是

    • 然后,如果我再次尝试复杂的请求(请求A)(这在第一次时导致了一个错误),那么作为两个请求,它将不会出现任何问题
  • 飞行前请求(选项动词),响应为200(成功)
  • 所需响应为200的实际请求(GET谓词)(成功
  • 这里是fiddler分析

    我的问题

  • 为什么一个简单的get请求(来自chrome)在激活fiddler时解决了我所有的问题,并允许我在激活fiddler后无误地发出任何复杂的CORS请求
  • 我如何能够毫无问题地提出复杂的CORS请求(不需要提琴手)
  • 请注意,我认为(可能是错误的)Fiddler充当代理,处理IIS,并在IIS接受任何复杂请求后进行所需的身份验证握手

    在此回购协议下找到的示例应用程序

    我已经找到了问题的解决方案:我认为这是关于IIS CORS模块的

    IIS中的CORS 部署到IIS时,如果服务器未配置为允许匿名访问,则必须在Windows身份验证之前运行CORS。若要支持此方案,需要为应用安装和配置IIS CORS模块

    通过从安装IIS CORS模块

    用于IIS CORS模块文档


    感谢您的支持

    没有这个模块,没有太多的讨论。您考虑过chrome浏览器的原因吗?您尝试过其他浏览器吗?如果您向chrome添加一些cors扩展,它可能会解决这个问题。如果您想在asp.net core中启用cors,您可以参考以下链接:。@LexLi但我想处理cors抛出的问题e ASP.NET应用程序不是我的IIS服务器?您想要的是不现实的。请阅读该博客文章中的“使用Windows身份验证”以了解更多信息。
    fetch('http://localhost:8050/api/values',{credentials:'include', headers:{'foo':'foo'}})
    .then(response => response.json())
    .then(data => console.log(data));