在302重定向期间发送浏览器Cookie


86

在302重定向过程中发送回cookie是否有任何问题?例如,如果我创建一个返回URL的cookie并以相同的响应重定向用户,那么任何(现代)浏览器都会忽略该cookie吗?


稍微阅读一下,我认为会话变量将比cookie更好,因为它们是服务器端的,并且不依赖于客户端的可预测性。
ADTC '16

Answers:


40

大多数浏览器都接受302重定向上的Cookie。我对此非常确定,但进行了一些搜索。并非所有现代浏览器。 Internet存档来自Silverlight客户端HTTP堆栈上现已删除/已死/微软连接的Q / A的链接忽略了302重定向响应上的Set-Cookie(2010)

我认为我们现在可以替代IE6,它是Windows Mobile浏览器...


1
您指定的论坛页面无法通过URL访问。您是不是说IE6和Windows Mobile浏览器?
hiroshi 2013年

1
链接已移动。我已经设置了一个内容完全相同的新链接。我的意思是针对移动设备的IE特定版本会添加自己的错误集
regilero

51

根据此博客文章:http : //blog.dubbelboer.com/2012/11/25/302-cookie.html所有主要浏览器,IE(6、7、8、9、10),FF(17),Safari (6.0.2),Windows和Mac上的Opera(12.11)都在重定向上设置Cookie。301和302重定向均是如此。


不幸的是,此列表不包括Chrome,因此我们无法确切地说出所有主要的浏览器...
MestreLion

3
@MestreLion:在我的Chrome浏览器中,它可以正常工作。所以..我想我们可以说它终于可以在2019
Michael

40

一条通知(以挽救开发人员的生命):

当cookie的域为localhost时,IE和Edge会忽略重定向响应中的Set-Cookie 。

解:

使用127.0.0.1代替localhost


11
IE和Edge可能已“修复”此问题,因此它们也不会为127.0.0.1设置cookie。h!他们想知道为什么开发人员不都喜欢IE ...对于我来说,您的答案仍然花了大约4个小时才结束。谢谢!
GlenPeterson

18

是此问题的Chromium错误(对于状态为302的HTTP响应,Set-cookie被忽略)。


1
如果这是真的,那确实是个坏消息:-(
MestreLion

我认为他们已经解决了。该错误报告仍然显示“ WontFix”,但在我的Chrome浏览器中可以正常运行。
迈克尔

@Michael请注意,Chromium不是Chrome:lifewire.com/chromium-and-chrome-differences-4172101-这意味着尽管铬可能适用于Chrome,但不一定适用于Chromium
Thomas

3

这确实是一种皱眉,但如果您真的不想依赖30倍set-cookie浏览器行为,则可以meta http-equiv="refresh"在设置cookie时使用HTML “重定向”。例如,在PHP中:

<?php
    ...
    setcookie("cookie", "value", ...);
    url="page.php";
?>
<html>
<head><meta http-equiv="refresh" content=1;url="<?=$url?>"></head>
<body><a href="<?=$url?>">Continue...</a></body>
</html>

服务器将使用200而不是正确的300x重定向发送Set-Cookie,因此浏览器将存储cookie,然后执行“重定向”。该<a>链接是备用浏览器,以防浏览器不执行元刷新。


1

我只是在Firefox和Safari上都遇到了这个问题,但Chrome却没有。根据我的测试,只有在重定向期间域发生更改时,才会发生这种情况。这在OAuth2流中很典型:

  1. OAuth2 ID提供程序(GitHub,Twitter,Google)将浏览器重定向回您的应用
  2. 您应用的回调URL会验证授权并设置登录cookie,然后再次重定向到目标URL
  3. 您的目标网址加载时未设置任何Cookie。

由于我尚未弄清楚的原因,来自请求2的某些Cookie被忽略,而其他则未被忽略。但是,如果请求2返回带有Refresh标头的HTTP 200 (“元刷新”重定向),则请求3会正确设置Cookie。


我怀疑此wrt oauth回调问题的原因是samesite=strict。对于回调请求,浏览器仍然认为发起者是google(或您使用的任何oauth提供商)。因此,如果您在302响应中设置了samesite = strict cookie,那么浏览器可能会认为“啊哈!这是从Google到您网站的跨站点请求”,因此在请求重定向的url时不会发送cookie。解决方法是在完成操作后使用元刷新,因此您的请求来自您自己的站点。我可能在胡扯,但这是我目前的想法。
宜兰

1

在.Net上使用OpenIdConnect / IdentityServer时遇到此问题,其中一个单独的API(不同的主机名)处理身份验证并重定向回主站点。

首先(对于在localhost上进行开发),您需要将CookieSecureoption设置为SameAsRequestNever处理http://localhost/不安全。请参阅Michael Freidgeim的答案。

其次,您需要将CookieSameSite属性设置为Lax,否则cookie根本不会保存。Strict在这里不工作!


-1

在我的情况下,我设置了CookieOptions.Secure = true,但在http:// localhost上对其进行了测试,然后浏览器根据该设置隐藏了cookie。

为了避免这种问题,您可以使cookie安全选项匹配协议Request.IsHttps,例如

new CookieOptions()
                {
                    Path = "/",
                    HttpOnly = true,
                    Secure = Request.IsHttps,
                    Expires = expires
                }

2
在这种情况下,请不要设置安全标志。该标志的全部目的是告诉浏览器仅在通过HTTPS连接时使用cookie。有条件地设置该标志会在某种程度上改变语义,并且您会丢失从HTTPS-> HTTP过渡的cookie,但是从HTTP-> HTTPS过渡时不会丢失。但是,所有这些与浏览器Set-Cookie对302重定向上的标头所做的事情是正交的。
马丁·彼得斯

1
当时-3分的答案解决了这个问题。我设置了Secure = true,但是忘记了在本地主机上我只是使用http进行测试。菜鸟的错误。secure=request.is_secure在烧瓶中使用。
Eloff
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.