【发布时间】:2020-11-16 12:17:34
【问题描述】:
所以,我有两个站点 http://localhost/ 和 http://3rdPartyLocallyHostedAPI/(不是真实姓名) - 都是本地 Intranet 站点,并且由于 3rdPartyLocallyHostedAPI 的性质是同名的,@987654327 @ 必须向它发出 CORS 请求。
这些请求工作正常,数据已返回或可以按预期发布到3rdPartyLocallyHostedAPI,但显示此警告:
在 http://3rdPartyLocallyHostedAPI/ 处设置了与跨站点资源关联的 cookie,但未设置
SameSite属性。如果设置了SameSite=None和Secure,Chrome 的未来版本将只提供带有跨站点请求的cookie。您可以在开发人员工具中的 Application>Storage>Cookies 下查看 cookie,并在 https://www.chromestatus.com/feature/5088147346030592 和 https://www.chromestatus.com/feature/5633521622188032 查看更多详细信息。
现在,我查看了多个答案,例如 this one、this one 和 this one,它们声明需要在服务器上设置 SameSite 属性,这对于两个 cookie 没有任何意义在请求中设置了(ss-pid 和 ss-id)问题,而不是在响应中返回?这让我很困惑,因为我不知道如何或在哪里进行更改以确保将这些 cookie 上的 SameSite 策略设置为 none 或 secure。
我认为执行 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-pid 和 ss-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