3

我正在尝试使用过期日期设置 cookie:

response.Cookies.Append("theKey", value, new CookieOptions() { Expires = DateTime.Now.AddMonths(12) });

cookie 存储在浏览器中,但不会在后续的跨站点 Web 请求中发送。

当我尝试设置不带Expires日期的 cookie 时,会发送 cookie,但它仅在浏览器打开时存储在浏览器中(会话 cookie)。

这是一个跨站点请求。调用该函数的 javascript 代码是:

var xmlHttp = new XMLHttpRequest();
xmlHttp.open("GET", url, true);
xmlHttp.withCredentials = true;
xmlHttp.onreadystatechange = function () {
    if (this.readyState == 4 && this.status == 200) {
        //console.log(this.responseText);
    }
};
xmlHttp.send(null);

Expires有没有办法在跨站点请求中发送包含日期的 cookie ?

客户端 Web 应用和函数应用(尝试设置 cookie)都使用 https。

这是设置带有过期日期的 cookie 的 HTTP 响应:

在此处输入图像描述

4

2 回答 2

8

解决办法是设置cookie的SameSite属性。这允许将 cookie 与来自 JavaScript 代码的跨站点请求一起发送。

可能的SameSite属性值(https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite):

  • 严格 - 不为跨站点请求发送 cookie
  • lax(默认)- cookie 仅在用户点击常规链接(例如点击)时发送用于跨站点请求
  • none(以前的默认值)- 为跨站点请求发送 cookie

在 .NET Core 中,cookie 需要使用SameSite属性显式设置,因为默认值为lax

response.Cookies.Append("theCookie", value, new CookieOptions() 
{ 
    Expires = DateTime.Now.AddMonths(12), 
    SameSite = Microsoft.AspNetCore.Http.SameSiteMode.None 
});
于 2019-03-03T10:39:15.350 回答
4

您的服务器需要包含以下 CORS 响应标头:

 Access-Control-Allow-Credentials: true

除了Access-Control-Allow-Origin您已经发送的标头之外。

如果没有 ACAC 标头,浏览器将不会处理Set-Cookie来自源的任何响应标头。我怀疑 cookie 是由不同响应中的 Set-Cookie 响应标头设置的。

于 2019-03-01T20:57:54.423 回答