【问题标题】:Setting cross domain cookie with AJAX使用 AJAX 设置跨域 cookie
【发布时间】:2017-03-30 02:51:14
【问题描述】:

假设我有域 a.com 和 b.com,并且我拥有这两个域。 b.com 上有一个名为 setcookie.aspx 的页面,在服务器代码中,它在 b.com 域下设置了一个 cookie。

我想从 a.com 向 b.com/setcookie.aspx 发出 HTTP 获取请求(b.com 已经允许来自 a.com 的 CORS 请求),如下所示:

$.get('http://www.b.com/setcookie.aspx');

由于某种原因,cookie 没有被设置。但是,如果我将 URL 放在隐藏的图像标签中:

然后就可以了。知道为什么 AJAX 请求没有设置 cookie 吗?

【问题讨论】:

  • $.get 使用 XMLHttpRequest - 阅读有关 cookie 的文档 here - XmlHttpRequest responses from a different domain cannot set cookie values for their own domain unless withCredentials is set to true before making the request, regardless of Access-Control- header values - 因此,您需要设置与 withCredentials 等效的 jQuery - 注意,您需要 jQuery 1.5.1+ 才能工作 - 你可能无法使用 $.get - 改用 $.ajax
  • @JaromandaX 实际上较新的版本允许将设置对象传递给诸如$.get$.post 之类的速记方法...但同意同样易于使用$.ajax
  • @charlietfl - 我一定在文档中错过了!
  • 将 withCredentials 设置为 true 有效,谢谢 :)

标签: javascript jquery asp.net ajax cookies


【解决方案1】:

您需要进行 2 处更改。

在 a.com 上

正如@Jaromanda X 在 cmets 中指出的那样,您需要在您的 $.get 请求中设置 withCredentials=true。除非您这样做,否则浏览器不允许设置跨域 cookie。阅读此XMLHttpRequest.withCredentials

在 b.com 上

当从服务器端设置一个cookie时,它会发送一个表单的header:

set-cookie: key=val;过期=格林威治标准时间 20 年 1 月 24 日星期五 10:29:58;路径=/;域=example.com;仅http; SameSite=Lax

注意SameSite=Lax 标志。 这可以防止浏览器跨域设置 cookie。

来自Mozilla Set-Cookie docs

断言 cookie 不能与跨域请求一起发送, 提供一些针对跨站点请求伪造攻击的保护

您需要禁用此标志。这将取决于您的后端平台。我使用 Django,对我来说它只是更改了 1 个设置 SESSION_COOKIE_SAMESITE这允许我将会话 ID cookie 设置为通过跨域 AJAX 请求设置。

完成这 2 项更改后,将设置跨域 cookie。 但是,请确保有足够的 CORS 和 CSRF 检查以确保请求来自受信任的来源

【讨论】:

    猜你喜欢
    • 2015-12-21
    • 1970-01-01
    • 2017-10-06
    • 2016-06-19
    • 2020-06-21
    • 1970-01-01
    • 2017-06-09
    • 2021-08-15
    • 2012-06-17
    相关资源
    最近更新 更多