在302重定向过程中发送回cookie是否有任何问题?例如,如果我创建一个返回URL的cookie并以相同的响应重定向用户,那么任何(现代)浏览器都会忽略该cookie吗?
在302重定向过程中发送回cookie是否有任何问题?例如,如果我创建一个返回URL的cookie并以相同的响应重定向用户,那么任何(现代)浏览器都会忽略该cookie吗?
Answers:
大多数浏览器都接受302重定向上的Cookie。我对此非常确定,但进行了一些搜索。并非所有现代浏览器。 Internet存档来自Silverlight客户端HTTP堆栈上现已删除/已死/微软连接的Q / A的链接忽略了302重定向响应上的Set-Cookie(2010)
我认为我们现在可以替代IE6,它是Windows Mobile浏览器...
根据此博客文章: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重定向均是如此。
一条通知(以挽救开发人员的生命):
当cookie的域为localhost时,IE和Edge会忽略重定向响应中的Set-Cookie 。
解:
使用127.0.0.1代替localhost。
这是此问题的Chromium错误(对于状态为302的HTTP响应,Set-cookie被忽略)。
这确实是一种皱眉,但如果您真的不想依赖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>
链接是备用浏览器,以防浏览器不执行元刷新。
我只是在Firefox和Safari上都遇到了这个问题,但Chrome却没有。根据我的测试,只有在重定向期间域发生更改时,才会发生这种情况。这在OAuth2流中很典型:
由于我尚未弄清楚的原因,来自请求2的某些Cookie被忽略,而其他则未被忽略。但是,如果请求2返回带有Refresh
标头的HTTP 200 (“元刷新”重定向),则请求3会正确设置Cookie。
samesite=strict
。对于回调请求,浏览器仍然认为发起者是google(或您使用的任何oauth提供商)。因此,如果您在302响应中设置了samesite = strict cookie,那么浏览器可能会认为“啊哈!这是从Google到您网站的跨站点请求”,因此在请求重定向的url时不会发送cookie。解决方法是在完成操作后使用元刷新,因此您的请求来自您自己的站点。我可能在胡扯,但这是我目前的想法。
在.Net上使用OpenIdConnect / IdentityServer时遇到此问题,其中一个单独的API(不同的主机名)处理身份验证并重定向回主站点。
首先(对于在localhost上进行开发),您需要将CookieSecure
option设置为SameAsRequest
或Never
处理http://localhost/
不安全。请参阅Michael Freidgeim的答案。
其次,您需要将CookieSameSite
属性设置为Lax
,否则cookie根本不会保存。Strict
在这里不工作!
在我的情况下,我设置了CookieOptions.Secure = true,但在http:// localhost上对其进行了测试,然后浏览器根据该设置隐藏了cookie。
为了避免这种问题,您可以使cookie安全选项匹配协议Request.IsHttps,例如
new CookieOptions()
{
Path = "/",
HttpOnly = true,
Secure = Request.IsHttps,
Expires = expires
}
Set-Cookie
对302重定向上的标头所做的事情是正交的。
secure=request.is_secure
在烧瓶中使用。