0

我有一个休息服务(作为 Azure 函数实现),在 HTTPS 上运行,在域 A 上。

我有一个网站,在域 B 的 HTTPS 上运行。

我为 cors 指定了通配符 *。

在网站上使用 jQuery,我将 Ajax 请求发送到其余服务。这有效,我可以看到我的GET请求由OPTIONS.

在此处输入图像描述

当我开发我的休息服务时,我想在本地托管服务,在 HTTP 上运行,在 localhost 域上。这似乎不起作用。

我必须启用混合内容,但浏览器 (Firefox) 似乎没有发送或预检我的请求 - 网络流量为空。看起来我的请求未能通过 CORS 请求。

这出现在 Firefox 控制台中。

16:42:56.550 Loading mixed (insecure) active content "http://locahost:7071/api/test/get?message=get+hello+world!" on a secure page[Learn More] ajax.ts:153:23
16:42:56.558 Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://locahost:7071/api/test/get?message=get+hello+world!. (Reason: CORS request did not succeed).

我可以通过将我的本地 url 设置为来避免混合内容错误//locahost,但是这仍然会导致 CORS 失败。

这是因为我试图从 HTTPS 域到 HTTP localhost 执行 CORS 吗?

4

2 回答 2

2

此页面显示详细原因:默认阻止混合内容。 https://developer.mozilla.org/en-US/docs/Web/Security/Mixed_content/How_to_fix_website_with_mixed_content

如果您没有设置允许的域列表,您还必须启用本地 https,不仅是 Firefox,而且 Chrome 和 IE 也会阻止从 https 到 http 的请求。顺便说一句,您不能在本地主机中使用自分配证书,它也会因另一个错误而被阻止。

于 2018-07-10T15:57:26.410 回答
2

做了一些挖掘,据我所知,这里有一些东西在起作用。

CORS

HTTPS 域到 HTTP localhost 正确地导致 CORS 验证。我相信我已经为我的服务正确配置了 CORS。

但是,我相信浏览器在处理 localhost 时具有特定的行为,这导致了我的问题。

测试

我正在使用HTTPS 上的Rest 测试测试和 HTTP 上的本地托管JSON 服务器来在我的 REST 服务 (Azure Functions) 之外运行测试。

我将这些测试与JSONPlaceholder的 HTTPS 托管版本的 JSON 服务器进行比较。

我正在做两种类型的测试,简单的和预检的,因为它们会引发不同的行为。Preflighted 有一个自定义标头,它会OPTIONSGET.

基础测试

禁用保护的 Localhost 上的浏览​​器行为

TL/DR:简单和预检请求在 Firefox 或 Chrome 上不起作用。

火狐

要允许混合内容(HTTPS 中的 HTTP)保护,必须禁用,否则不会发生任何事情,并且Blocked loading mixed active content控制台中会显示错误。

Firefox 禁用保护

然而,即使禁用了保护,Firefox 也会继续阻止简单和预检请求。对于预检请求,Firefox 不会发出任何请求。有关混合内容和 CORS 的警告显示在控制台中。

Firefox 在 localhost 上测试

铬合金

像 Firefox 保护必须禁用才能允许混合内容。

镀铬保护

与 Firefox 一样,Chrome 不会成功执行任何请求,但会发出 preflight OPTIONS

Chrome 本地主机

启用保护的 127.0.0.1 上的浏览​​器行为

TL/DR:在 Chrome 中,简单的预检请求有效。对于 Firefox,只有简单的请求有效。

看起来FirefoxChrome有一些工作,所以http://127.0.0.1/不被视为混合内容。看起来WebKit/Safari的人群仍在考虑它。

MDN 文档有这个注释

从 Firefox 55 开始,允许在http://127.0.0.1/上加载混合内容 (参见错误 903966)。Chrome 允许在http://127.0.0.1/http://localhost/上混合内容 。Safari 不允许任何混合内容。

根据上面的测试,我不确定 Chrome 上的 localhost 是否正确(至少现在如此)。

火狐

启用保护后,Firefox 适用于简单请求。预检请求仍然失败,但只显示 CORS 警告(这可能是 Firefox 中的错误,我不确定)。

火狐浏览器 127

铬合金

启用保护后,简单的预检请求即可工作。

127 上的镀铬

天蓝色函数

回到作为 Azure Functions 实现的我的休息服务。我以为我可以使用 Chrome 在 127.0.0.1 上测试我的服务。

不幸的是,这也行不通。

Azure Functions 被硬编码localhost,并且似乎不响应 127.0.0.1。例如,我什至无法浏览到我在 127.0.0.1 上的 API,更不用说进行 Web 服务调用了。

需要另一种方法,我尝试为 HTTPS 设置 Azure Functions。如何在 HTTPS 上的 Visual Studio 中本地运行 Azure Function?

于 2018-07-10T22:53:03.247 回答