【问题标题】:CORS with IE11+ Access Denied with SSL to localhost带有 IE11+ 的 CORS 使用 SSL 拒绝访问 localhost
【发布时间】:2014-06-05 23:38:34
【问题描述】:

非常简短的版本:是否有人通过 AJAX、在 IE 中、通过 SSL 成功地请求本地资源?我无法解决出现“拒绝访问”错误。


加长版:

我正在使用 AJAX 从运行本地 Web 服务的应用程序中检索 JSON。 Web 服务通道已加密,因此如果通过 HTTPS 为远程站点提供服务,则不会出现“安全页面上的不安全资源”错误。

因此,地址栏中是某种远程站点... mysite.com。它正在接收来自https://localhost/ 的信息。

Web 服务正在为 CORS 设置正确的标头,并且在 Chrome 和 Firefox 中一切正常。在 IE 中,如果我将我的https://localhost 资源放入地址栏中,则会返回并显示正确的资源。但是,当使用 AJAX(不仅仅是地址栏)时,IE 中的安全设置会拒绝访问。这在此处(部分)记录在案:

Access denied in IE 10 and 11 when ajax target is localhost

在一个回复中唯一正确的解决方案是将请求域(在本例中为 mysite.com)添加到受信任的站点。这行得通,但我们宁愿没有用户干预......指向一篇关于如何添加受信任站点的知识库文章并不是一个很好的用户体验。由于与以下相同的原因,对该问题的其他答复无效-->

又摸了摸,我发现了这个:

CORS with IE, XMLHttpRequest and ssl (https)

其中有一个回复,其中包含 IE 中 AJAX 请求的包装器。看起来很有希望,但事实证明,IE11 现在已经弃用了 XDomainRequest API。这对微软来说可能是正确的事情......但是现在向 XDR 对象添加 void onProgress 处理程序的“hack”解决方法显然不是一种选择,曾经有希望的解决方法包装器被渲染为无效。

有没有人遇到过:

a) 一种无需修改 IE 中的受信任站点即可通过这些请求的方法?换句话说,第二个链接中解决方法的更新版本?

b) 作为“次佳”案例:提示用户将站点添加到其受信任区域的方法? “mysite.com 希望添加到您的受信任区域。确认是/否”并完成它,而他们实际上不需要打开他们的本机设置对话框并手动执行?

【问题讨论】:

    标签: javascript ajax internet-explorer ssl cors


    【解决方案1】:

    出于安全原因,Internet Explorer 的 XDomainRequest 对象阻止从 Internet 区域访问 (see #6 here) Intranet 区域。得知这个块被移植到 XMLHTTPRequest 对象的 IE10+ CORS 实现中,我不会感到惊讶。

    可能有帮助的一种方法是简单地从localhost 更改为127.0.0.1,因为后者被视为Internet Zone 而不是Intranet Zone,因此区域交叉是避免。

    但是,您应该知道,当站点在增强保护模式 (EPM) 下运行时,Internet Explorer 10+ 将阻止对本地计算机的所有访问(通过任何地址)——请参阅 this post 中的“环回被阻止” .目前,IE 在 Metro/Immersive 浏览模式(不在桌面)中运行时仅对 Internet 站点使用 EPM,但这可能会在未来发生变化。

    不,没有从 JavaScript 显示区域配置 UI 或自动将站点从一个区域移动到另一个区域的机制。但是,您拥有本地服务器这一事实意味着您已经在客户端上运行代码,这意味着您可以use the appropriate API 来更新客户端上的区域映射。请注意,此类更改要求您首先明确获得用户许可,以免您的安装程序被 Windows Defender 和其他安全产品视为恶意软件。

    因此,总而言之,使用 IP 地址应该是许多但不是所有平台的解决方法。

    【讨论】:

    • 感谢您的详细回复,埃里克。我会将“使用适当的 API”链接传递给桌面应用程序开发人员;我最初的想法是,这正是我们想要做的。没有要求我们通过 JavaScript 或浏览器本身来完成,尽管我可能无意中暗示了这一点。
    • 也就是说,即使我离开了这个答案,我也意识到......桌面应用程序不知道需要添加哪个域。 :( 我仍然看到两个“总比没有好”的选项——使用适当的 API 来允许应用程序自己的对话框(这将比导航 IE 设置的说明更简单)或创建在下载时向安装程序提供域的能力时间(通过脚本甚至某种平面文件)。
    • +1 用于描述 Internet ZoneIntranet Zone。这解决了我的问题,谢谢!
    • Internet vs Intranet 是我的问题。请注意,它会影响 IE 直到版本 11(可用的最新版本)。
    • +1。在 IE11 中确认 AJAX 请求在使用 127.0.0.1 而不是 localhost 时有效。似乎“欺骗”它认为它仍在互联网区域中
    【解决方案2】:

    由于这是两个不同的域,一种解决方案是创建一个应用程序,该应用程序在您想要的方向上代理请求。

    如果您可以控制 example.com 端,并希望支持自带 localhost 服务的用户,这将更加困难,因为您必须为他们带来的内容提供更多要求。

    但是,如果您可以控制在 localhost 中运行的内容,并希望访问 example.com,并让它访问 localhost 服务,在您的首选 Web 服务器中设置重定向,或者使用反向代理。您可以将端点添加到不重叠路径的同一个 localhost 应用程序,例如,将 http://localhost/proxy/%1 路由到 http://%1,而只留下 localhost 的其余部分。或者,在例如上运行代理。 http://localhost:8080 执行类似的重定向,可以从一个路径提供 example.com,从另一个路径提供 API。

    这最终成为一种“胶水”或集成代码,它应该允许您在一定程度上模拟交互。

    【讨论】:

    • 因此,如果我理解正确的话,此模型中的代理应用程序不仅提供数据(正如它已经提供的那样),还提供 Web 内容。这是底线吗?然后,要让地址栏透明地看起来正在访问“example.com”(而不是 localhost),它是通过在 Web 服务器上设置的重定向完成的吗?这是一个很好的想法,我相信它已经在路线图上。对于初始版本,除了提供必要的 UI 组件外,我们无法控制服务器端 Web。
    • 没错。你只能控制你能控制的。我不知道哪种设置最适合您,但如果您需要在 example.com 的页面中嵌入指向 localhost/api/ajaxFunction 的链接,那么您可以在 localhost 上托管代理,例如 localhost/w/example.com 加载示例。 com,localhost/api/ajaxFunction 加载脚本。那么通过localhost代理的example.com页面就不会出现CORS问题了。
    猜你喜欢
    • 2014-07-09
    • 2014-12-21
    • 2016-04-25
    • 2021-09-17
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 2019-04-30
    • 2021-06-27
    相关资源
    最近更新 更多