在发出 AJAX 跨源请求时,如何防止“与没有 SameSite 属性的跨站点资源集关联的 ”

因此,我有两个站点 http://localhost/ 和 http://3rdPartyLocallyHostedAPI/(不是真实姓名)- 都是本地 Intranet 站点,并且由于同名的性质,必须向它发出3rdPartyLocallyHostedAPICORSlocalhost请求.

这些请求工作正常,数据返回或可以3rdPartyLocallyHostedAPI按预期发布到,但是显示此警告:

与 http://3rdPartyLocallyHostedAPI/ 上的跨站点资源关联的 cookie 设置时没有该SameSite属性。SameSite=NoneChrome 的未来版本将仅在设置了和的情况下为跨站点请求提供 cookie Secure。您可以在应用程序>存储>Cookie 下的开发人员工具中查看 cookie,并在https://www.chromestatus.com/feature/5088147346030592https://www.chromestatus.com/feature/5633521622188032查看更多详细信息。

现在,我查看了多个答案,例如这个这个这个说明需要在服务器上设置 SameSite 属性的答案,这没有任何意义,因为它所使用的两个 cookie 有问题 (ss -pid 和 ss-id) 在请求中设置,没有在响应中返回?这让我感到困惑,因为我不知道如何或在何处进行更改以确保将这些 cookie 上的 SameSite 策略设置为nonesecure

我认为是执行 AJAX 请求的 jQuery 出了问题:

// trimType and queryValue are determined elsewhere by some jQuery selections, their values are not important to the question being asked.

$.ajax({

    url: 'http://3rdPartyLocallyHostedAPI?q=' + trimType + '?q=' + queryValue + '&resultsOnly=true',

    data: {

        properties: (trimType === 'Record') ? 'Title,Number,RecordRecordType' : 'NameString'

    },

    xhrFields: {

        withCredentials: true

    },

    dataType: 'json'

}).done(function (data) {

    if (data.Results.length > 0) {

        $resultsPane.html('');

        for (var i = 0; i < data.Results.length; i++) {

            // Not relevant to the question being asked so removed, only some jQuery in here to display results on page.

        }

    } else {

        $resultsPane.html('<p class="py-1 pl-1 list-group-item text-muted">No Results found.</p>');

    }

}).fail(function () {

    $resultsPane.html('<p class="py-1 pl-1 list-group-item text-muted">No Results found.</p>');

});


翻翻过去那场雪
浏览 89回答 1
1回答

哈士奇WWW

好吧,我想我已经做了足够的研究来弄清楚我面临的问题,所以我会回答我自己的问题。因此,真正帮助我真正理解 SameSite 是关于什么的一页是这一页,所以对于任何对 SameSite 有疑问的人,请阅读一下,以便您了解其背后的原因及其工作原理。阅读了一些文章并看到了对另一篇文章的回答,这帮助我把这些点联系起来。我将我正在处理的网站部署到实际的网络服务器上,发现以下是响应标头:HTTP/1.1 200 OKCache-Control: private,no-cacheContent-Type: application/json; charset=utf-8Vary: AcceptServer: Microsoft-IIS/10.0X-Content-Type-Options: nosniffX-Powered-By: ServiceStack/4.512 NET45 Win32NT/.NETX-AspNet-Version: 4.0.30319Set-Cookie: ss-pid=0QyVIKf4edkAKd2h4be5; expires=Fri, 27-Jul-2040 09:58:39 GMT; path=/; HttpOnlySet-Cookie: ss-id=fmM1WQsDxXGfR8q9GL6e; path=/; HttpOnlyAccess-Control-Allow-Origin: http://serverAccess-Control-Allow-Credentials: trueAccess-Control-Allow-Methods: POST,GET,OPTIONSAccess-Control-Allow-Headers: Content-Type, AuthorizationPersistent-Auth: trueWWW-Authenticate: Negotiate oYG2MIGzoAMKAQChCwYJKoZIgvcSAQICooGeBIGbYIGYBgkqhkiG9xIBAgICAG+BiDCBhaADAgEFoQMCAQ+ieTB3oAMCARKicARusah2q1K2ACHwoq1n6DCNq5rx/HFdbK5sU9EohnxrRSpzmelskTTa9xmW8wgeUdwRNQCqMsD/dZ/pUjhdl2CVWjmFZZAfnKl6JEker+s79E9uFXThZZKnqfpqEgSvvqSYpp1KMkaYBYd1uf5mRyE=Date: Mon, 27 Jul 2020 09:58:40 GMTContent-Length: 1597Set-Cookie服务器发出两个标头来存储ss-id和的值ss-pid。这些 cookie显然代表 permanant session ID 和 session ID,并且由 ASP.NET 发布用于跟踪会话。浏览器不接受和设置这两个 cookie,因为它们缺少SameSite=none设置和Secure设置 - 这些是我在上面的帖子中提到的两个 cookie。因此,要解决此问题,首先我需要切换到对 API(可能还有网站本身)使用 https - 我已经完成了,并以某种方式弄清楚如何让第 3 方 API 在其会话中设置 SameSite 属性相关的 cookie。因此,对于希望完全控制您的 API 等的其他人,只要您在响应中创建/发送 cookie 时,您就应该能够设置这些属性,因此通过设置 和 将 cookie 从站点发送到其他SameSite=None域Secure。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript