IE11+中SSL到本地主机的CORS访问被拒绝

11

简短版本:有人能够在IE上通过SSL成功请求本地资源吗?在使用AJAX时,我遇到了“访问被拒绝”的错误。


详细版本:

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

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

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

当ajax目标是localhost时,在IE 10和11中被拒绝访问

其中一个回复中的唯一正确解决方案是将请求域(在本例中为mysite.com)添加到受信任的站点中。这可以正常工作,但我们希望不需要用户干预...指向有关如何添加受信任站点的知识库文章并不是一个很好的用户体验。该问题的其他回复由于以下原因而无效:

我还发现了以下信息:

IE、XMLHttpRequest和SSL(https)下的CORS

其中包含了IE AJAX请求的包装器回复。它看起来很有前途,但事实证明,IE11已经停用了XDomainRequest API。这可能是微软应该做的正确之举...但现在,将一个void onProgress处理程序添加到XDR对象的“黑客”解决方法显然不是一个选项,曾经充满希望的解决方法包装器变得毫无意义。

有人遇到过以下问题吗:

a) 有没有一种方法可以在不需要修改IE中的受信任站点的情况下处理这些请求?换句话说,第二个链接中的解决方法是否有更新版本的替代方案?

b) 如果没有更好的方法,是否有一种方式可以提示用户将网站添加到其受信任区域?“mysite.com希望被添加到您的受信任区域。确认是/否”,并且可以自动完成,而无需他们手动打开本机设置对话框并进行操作?

2个回答

7
出于安全考虑,Internet Explorer的XDomainRequest对象会阻止从Internet Zone访问Intranet Zone(请参见此处的第6条)。我不会感到惊讶,如果这个阻止被移植到IE10+ CORS实现的XMLHTTPRequest对象中。
一个可能有帮助的方法是将localhost更改为127.0.0.1,因为后者被视为Internet Zone而不是Intranet Zone,从而避免了区域交叉。
然而,需要注意的是当网站在增强保护模式(EPM)下运行时,Internet Explorer 10+将阻止所有对本地计算机(通过任何地址)的访问。请参见this post中的“回环被阻止”。目前,IE仅在Metro/Immersive浏览模式下(而非桌面模式)为互联网站使用EPM,但这可能会在未来发生改变。
不,没有机制可以从JavaScript显示区域配置UI或自动将站点从一个区域移动到另一个区域。但是,您拥有本地服务器的事实意味着您已经在客户端上运行代码,这意味着您可以使用适当的API更新客户端上的区域映射。请注意,此类更改要求您首先明确获得用户许可,否则您的安装程序将被Windows Defender和其他安全产品视为恶意软件。
因此,总之,使用IP地址应该作为许多平台的解决方法,但并非全部。

1
+1 是因为描述了“Internet Zone”和“Intranet Zone”的区别,这解决了我的问题,谢谢! - Brad Cupit
互联网和内部网是我的问题。提醒一下,它会影响到IE11(目前最新版本)。 - Erikk Ross
在IE11中,当使用127.0.0.1而不是localhost时,已确认AJAX请求起作用。似乎可以“欺骗”它认为它仍处于互联网区域。 - stonedauwg
@jpaugh - 很抱歉我不明白你所说的“不一致”是什么意思?“localhost”属于内部网络区域,“127.0.0.1”则属于互联网区域。 - EricLaw
尝试了各种方法,直到我偶然发现这篇文章。我正在使用IIS Express运行网站,将服务器更改为绑定到127.0.0.1,然后使用IP而不是localhost解决了问题。现在IE11和Firefox都发送身份验证cookie。谢谢。 - Jim Scott
显示剩余3条评论

0

既然它们是两个不同的域,一个解决方案是创建一个应用程序,代理请求到你想要的方向。

如果你控制了example.com端,并且想要支持使用自己的本地主机服务的用户,则会更加困难,因为你必须提供更多对他们所带内容的要求。

但是,如果你能够控制在localhost上运行什么,并想要访问example.com并使其访问本地主机服务,则可以在首选的Web服务器中设置重定向,或使用反向代理。你可以在同一localhost应用程序中添加一个不重叠路径的端点,例如将http://localhost/proxy/%1路由到http://%1,其余localhost不变。或者,在例如http://localhost:8080上运行代理,执行类似的重定向,并可从某个路径提供example.com和API的另一种服务。

这最终成为一种“粘合”或集成代码,应该允许您模拟交互到一定程度。


所以如果我理解正确,在这个模型中,代理应用程序不仅提供数据(就像它已经做的那样),还提供网络内容。这是底线吗?然后为了使地址栏透明地显示正在访问“example.com”(而不是localhost),需要在Web服务器上设置重定向来完成?这是很好的想法,我相信它已经在路线图上了。对于初始发布,除了提供必要的UI组件之外,我们无法控制服务器端Web。 - Greg Pettit
1
没错。你只能控制你能控制的东西。我不知道什么设置最适合你,但如果你需要在example.com页面中嵌入http://localhost/api/ajaxFunction链接,那么你可以在localhost上托管代理,例如http://localhost/w/example.com加载example.com,而http://localhost/api/ajaxFunction加载脚本。然后通过localhost代理的example.com页面将不会有CORS问题。 - maxwellb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接