【问题标题】:Internet Explorer Cross Domain: Not sending preflightInternet Explorer 跨域:不发送预检
【发布时间】:2015-12-26 15:44:04
【问题描述】:

我发现了几个类似的主题。然而,似乎还没有一个工作。

问题

在我们当前的生态系统中,我们为 http-apis 提供了三台服务器。两个用于测试,一个用于生产。

最近我们一直在发布使用 AngularJS 的客户端 Web 应用程序。由于客户端应用程序是为我们的客户服务的,因此与我们的 api 的通信是跨域的。 Web 应用程序在 Chrome、safari 和 firefox 以及所有 api 中都能正常运行。但是,对于第三个 api,Internet Explorer(11) 拒绝发送 preflight(options) 请求,从而禁用客户端与 api 通信。在另外两个 api 中,web 应用在 IE 中运行良好。

API 如下:

https://api.doma.in/accesstoken -- Works in IE11
https://api2.doma.in/accesstoken -- Works in IE11
https://api3.doma.in/accesstoken -- Does not send preflight in IE11.

需要注意的是,这三台服务器或多或少都是克隆的,因此设置不会有太大差异。

但是,我收到的错误消息中的错误如下:

SEC7118: XMLHttpRequest https://api3.doma.in/accesstoken required CORS (Cross Origin Resource Sharing).
SEC7119: XMLHttpRequest https://api3.doma.in/accesstoken required CORS Preflight.
SCRIPT7002: XMLHttpRequest Network error 0x80070005, Access Denied.

在网络日志中,它只显示预检请求被取消,因此没有请求或响应标头。

【问题讨论】:

    标签: javascript angularjs internet-explorer ssl internet-explorer-11


    【解决方案1】:

    添加更多有关根本原因的详细信息,并节省其他人花费数小时/天的时间。

    在我的实例中,IE 11 遵循正确的规范,并且在发出 CORS 预检请求时未发送客户端证书。 Can read more about that here

    这部分规范在 Chrome 和其他浏览器中被忽略,它们会发送客户端证书。

    在我的例子中,我们使用 Pivotal Cloud Foundry 并且必须进行配置更改以确保连接不会被拒绝。

    要轻松验证这是否是您的问题,请下载并安装 fiddler,将其配置为支持 HTTPS 并再次测试损坏的 CORS, 我的与 Fiddler 一起使用,但在直接连接到远程服务器时没有。

    【讨论】:

      【解决方案2】:

      我能够使用 openssl 识别问题。通过运行$ openssl s_client -connect <url/domain>:443 -state,我发现了一个 ssl 错误。

      Api 1 和 2 在 openssl 的结果中显示如下:

      SSL_connect:SSLv3 read server certificate A
      SSL_connect:SSLv3 read server key exchange A
      SSL_connect:SSLv3 read server done A
      SSL_connect:SSLv3 write client key exchange A
      SSL_connect:SSLv3 write change cipher spec A
      SSL_connect:SSLv3 write finished A
      SSL_connect:SSLv3 flush data
      SSL_connect:SSLv3 read finished A
      

      在 api 3(失败的 api-server)上,结果显示了两个额外的操作:

      SSL_connect:SSLv3 read server certificate A
      SSL_connect:SSLv3 read server key exchange A
      SSL_connect:SSLv3 read server certificate request A //This
      SSL_connect:SSLv3 read server done A
      SSL_connect:SSLv3 write client certificate A //This
      SSL_connect:SSLv3 write client key exchange A
      SSL_connect:SSLv3 write change cipher spec A
      SSL_connect:SSLv3 write finished A
      SSL_connect:SSLv3 flush data
      SSL_connect:SSLv3 read finished A 
      

      但我还没有在服务器上解决这个问题。与此同时,我正在使用 xdomain "hack"(https://github.com/jpillora/xdomain)。它真的很容易设置并且工作正常。

      【讨论】:

        猜你喜欢
        • 2011-06-30
        • 2013-09-17
        • 1970-01-01
        • 1970-01-01
        • 2013-03-23
        • 2012-05-10
        • 2014-07-26
        • 2013-09-10
        • 2011-10-01
        相关资源
        最近更新 更多