微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CORS 预检请求在 fiddler 工作之前不会命中 IIS

如何解决CORS 预检请求在 fiddler 工作之前不会命中 IIS

是的,这是另一个 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));
    

我有一个错误

Error from console

这是请求在 fiddler 中的方式,(对于您的信息,此请求未到达 ASP.Net 应用程序而只是点击 IIS)

error from fiddler

  • 激活 fiddler 然后创建一个从浏览器(chrome)到端点('http://localhost:8050/api/values)的简单获取请求时,最有趣的是,它会产生三次认证握手并成功
  1. => 401
  2. => 401
  3. => 200

fiddler 所示(它是

3 request authentication handshake

  • 然后,如果我再次尝试复杂请求(请求 A)(第一次导致错误),它不会出现任何问题,因为两个请求
  1. 响应为 200(成功)的预检请求(OPTIONS 动词)
  2. 实际请求(GET 动词),所需响应为 200(成功

这里是fiddler分析

complex request successed

我的问题

  1. 为什么在激活 fiddler 时一个简单的 get 请求(来自 chrome)可以解决我的所有问题,并允许我在此之后发出任何复杂的 CORS 请求而不会出现任何错误
  2. 我如何能够毫无问题地发出复杂的 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的支持

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?