在302重定向时返回cookie是否存在任何问题?例如,如果我创建一个return-to-url cookie并在同一响应中重定向用户,是否会有任何(现代)浏览器忽略该cookie?
在302重定向时返回cookie是否存在任何问题?例如,如果我创建一个return-to-url cookie并在同一响应中重定向用户,是否会有任何(现代)浏览器忽略该cookie?
"SameSite=Strict"
属性的cookie仅随同站点请求发送。"SameSite=Lax"
属性的cookie将与同站点请求一起发送,或者与具有“安全”的HTTP方法的跨站点顶级导航一起发送。"SameSite=None"
属性的cookie将与同站点和跨站点请求一起发送。一条通知(为了拯救开发人员的生命):
当cookie的域名是localhost时,IE和Edge会忽略重定向响应中的Set-Cookie。
解决方案:
使用127.0.0.1代替localhost。
lvh.me
域名代替 127.0.0.1
。它允许您添加子域名,例如 subdomain.lvh.me
。 - Dmitry大多数浏览器都会在302重定向时接受Cookie。我相当确定这一点,但我进行了一些小的搜索。并非所有现代浏览器都是如此。 互联网归档链接指向已删除/失效的微软连接问答(Silverlight客户端HTTP堆栈忽略302重定向响应中的Set-Cookie) (2010)
我认为我们现在有了IE6和Windows Mobile浏览器的替代品...
最近我们遇到了这个问题(2022年3月)——Firefox和Chrome在HTTP 302重定向时都没有立即设置cookies。
详情如下:
我们通过提供带有客户端重定向的HTTP 200来解决了这个问题:
<!DOCTYPE html>
<html>
<head><meta http-equiv="refresh" content="0; url='REDIRECT_URL'"></head>
<body></body>
</html>
这里是关于此问题的Chromium bug报告(HTTP响应的状态码为302时,设置cookie被忽略)。
我刚刚遇到了这个问题,无论是在Firefox还是Safari中都出现了这个问题,但是在Chrome中没有。根据我的测试,这种情况只会发生在重定向期间域名发生变化的情况下。这在OAuth2流程中是很典型的:
出于我还没有弄清楚的原因,有些来自第二个请求的cookie被忽略了,而另一些则没有。但是,如果请求2返回一个带有Refresh
头(“meta refresh”重定向)的HTTP 200,则通过请求3正确设置cookie。
samesite=strict
。对于回调请求,浏览器仍然认为发起者是谷歌(或您使用的任何 OAuth 提供程序)。因此,如果您在 302 响应中设置了一个 samesite=strict 的 cookie,那么浏览器可能会认为“啊哈!这是一个来自谷歌到您网站的跨站请求”,因此在请求重定向的 URL 时不会发送 cookie。解决方法是像您已经做的那样使用 meta-refresh,这样您的请求就来自您自己的站点。我可能说得不好,但这是我的目前想法。 - IlansameSite: 'strict'
更改为'lax'
就解决了问题。感谢提示。 - Kitson这是一种不被推荐的方法,但如果您真的不想依赖于30x set-cookie浏览器行为,您可以在设置cookie时使用HTML meta http-equiv="refresh"
“重定向”。例如,在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>
链接是一种备用方法,以防浏览器不执行元刷新。
首先(为了在本地开发环境中),您需要将CookieSecure
选项设置为SameAsRequest
或Never
以处理http://localhost/
不安全的情况。请参见Michael Freidgeim的答案。
其次,您需要将CookieSameSite
属性设置为Lax
,否则cookie根本不会被保存。Strict
在这里无效!
new CookieOptions()
{
Path = "/",
HttpOnly = true,
Secure = Request.IsHttps,
Expires = expires
}
Set-Cookie
头部无关。 - Martijn Pieterssecure=request.is_secure
。 - Eloff