【问题标题】:How do I prevent the "cookie associated with a cross-site resource set without SameSite attribute" warning when making AJAX Cross origin requests?发出 AJAX 跨源请求时,如何防止“与没有 SameSite 属性的跨站点资源集关联的 cookie”警告?
【发布时间】:2020-11-16 12:17:34
【问题描述】:

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

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

在 http://3rdPartyLocallyHostedAPI/ 处设置了与跨站点资源关联的 cookie,但未设置 SameSite 属性。如果设置了SameSite=NoneSecure,Chrome 的未来版本将只提供带有跨站点请求的cookie。您可以在开发人员工具中的 Application>Storage>Cookies 下查看 cookie,并在 https://www.chromestatus.com/feature/5088147346030592https://www.chromestatus.com/feature/5633521622188032 查看更多详细信息。

现在,我查看了多个答案,例如 this onethis onethis one,它们声明需要在服务器上设置 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>');
});

当它没有设置withCredentials = true 属性,因此针对API 进行匿名身份验证(仅提供有限的访问权限,因此需要传递Windows 凭据),SameSite 警告不会出现。这是请求标头:

GET /CMServiceAPIAuth/Location?q=%22SDC%20*%22&resultsOnly=true&properties=NameString HTTP/1.1
Host: serverName
Connection: keep-alive
Accept: application/json, text/javascript, */*; q=0.01
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36
Origin: http://localhost:64505
Referer: http://localhost:64505/Home/DisplayRecord
Accept-Encoding: gzip, deflate
Accept-Language: en-GB,en-US;q=0.9,en;q=0.8
Cookie: ss-pid=OQtDrnmok62FvLlZPnZV; ss-id=cIaIcS3j0jmoouAaHHGT

chrome 遇到问题的两个 cookie 是 ss-pidss-id,响应标头没有传回 cookie:

HTTP/1.1 200 OK
Cache-Control: private,no-cache
Content-Type: application/json; charset=utf-8
Vary: Accept
Server: Microsoft-IIS/8.5
X-Content-Type-Options: nosniff
X-Powered-By: ServiceStack/4.512 NET45 Win32NT/.NET
X-AspNet-Version: 4.0.30319
Access-Control-Allow-Origin: http://localhost:64505
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: POST,GET,OPTIONS
Access-Control-Allow-Headers: Content-Type, Authorization
Persistent-Auth: true
X-Powered-By: ASP.NET
Date: Mon, 27 Jul 2020 07:02:06 GMT
Content-Length: 1597

那么,考虑到所有这些,有人可以解释我哪里出错了吗?我是否需要对 jQuery AJAX 进行更改以防止出现此警告(并因此在警告提醒我发生更改时防止将来出现问题) - 或者,我是否真的需要在服务器上设置一个额外的标头,我'我想知道它是否在飞行前的 OPTIONS 请求中尝试找出请求的 SameSite 设置或类似的设置?

通过 IIS 模块,我确实可以向服务器发送的响应添加额外的标头,所以如果需要,我可以这样做 - 我只是不太明白警告是在哪一端由人们提供的任何解释引起的,并希望能提供任何解释。

【问题讨论】:

  • 所以我做了一些更多的试验和错误调查,有趣的是,当请求不是来自本地主机,而是来自测试站点时,警告不会发生,因为它阻止了在标头中发送的 Set-Cookie 标头,例如这个Set-Cookie: ss-pid=esrPZ3xn5TKOUxjGF06H; expires=Fri, 27-Jul-2040 08:24:03 GMT; path=/; HttpOnly 和这个Set-Cookie: ss-id=y7vwnHkOYwtAKqWeF8az; path=/; HttpOnly。所以看起来是服务器设置了这些 cookie 而没有适当的 SameSite 标头。

标签: javascript asp.net cookies cross-domain samesite


【解决方案1】:

好吧,我想我已经做了足够的研究来弄清楚我面临的问题,所以我会回答我自己的问题。

所以,真正帮助我真正了解 SameSite 是什么的一页是 this one,因此对于任何遇到 SameSite 问题的人,请阅读以了解其背后的原因及其工作原理。

阅读并看到这个答案to another post 帮助我把这些点联系起来。我将正在开发的网站部署到实际的 Web 服务器上,发现以下是响应标头:

HTTP/1.1 200 OK
Cache-Control: private,no-cache
Content-Type: application/json; charset=utf-8
Vary: Accept
Server: Microsoft-IIS/10.0
X-Content-Type-Options: nosniff
X-Powered-By: ServiceStack/4.512 NET45 Win32NT/.NET
X-AspNet-Version: 4.0.30319
Set-Cookie: ss-pid=0QyVIKf4edkAKd2h4be5; expires=Fri, 27-Jul-2040 09:58:39 GMT; path=/; HttpOnly
Set-Cookie: ss-id=fmM1WQsDxXGfR8q9GL6e; path=/; HttpOnly
Access-Control-Allow-Origin: http://server
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: POST,GET,OPTIONS
Access-Control-Allow-Headers: Content-Type, Authorization
Persistent-Auth: true
WWW-Authenticate: Negotiate oYG2MIGzoAMKAQChCwYJKoZIgvcSAQICooGeBIGbYIGYBgkqhkiG9xIBAgICAG+BiDCBhaADAgEFoQMCAQ+ieTB3oAMCARKicARusah2q1K2ACHwoq1n6DCNq5rx/HFdbK5sU9EohnxrRSpzmelskTTa9xmW8wgeUdwRNQCqMsD/dZ/pUjhdl2CVWjmFZZAfnKl6JEker+s79E9uFXThZZKnqfpqEgSvvqSYpp1KMkaYBYd1uf5mRyE=
Date: Mon, 27 Jul 2020 09:58:40 GMT
Content-Length: 1597

服务器发出两个Set-Cookie 标头来存储ss-idss-pid 的值。这些 cookie apparently stand for permanant session ID and session ID,由 ASP.NET 发布,用于跟踪会话。浏览器不接受并设置这两个 cookie,因为它们缺少 SameSite=none 设置和 Secure 设置 - 这是我在上面的帖子中提到的两个 cookie。

所以要解决这个问题,首先我需要切换到对 API 使用 https(可能还有网站本身)——我已经这样做了,并以某种方式弄清楚如何让第 3 方 API 设置 SameSite 属性在它的会话相关 cookie 中。

因此,对于希望完全控制您的 API 等的其他人,您应该能够在创建/发送响应中的 cookie 时设置这些属性,因此通过设置 SameSite=None 将 cookie 从站点发送到其他域和Secure

【讨论】:

    猜你喜欢
    • 2020-03-08
    • 2020-05-08
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 2017-04-01
    • 2014-08-31
    相关资源
    最近更新 更多