在302重定向期间发回cookie是否有任何问题?例如,如果我创建一个return-to-url cookie并在同一个响应中重定向用户,那么任何(现代)浏览器都会忽略cookie吗?
答案 0 :(得分:43)
根据这篇博文:http://blog.dubbelboer.com/2012/11/25/302-cookie.html所有主要浏览器,IE(6,7,8,9,10),FF(17),Safari(6.0.2),Opera(12.11)都在Windows上和Mac,在重定向上设置cookie。 301和302重定向都是如此。
答案 1 :(得分:31)
大多数浏览器都接受302重定向上的Cookie。我很确定,但我做了一点搜索。并非所有现代浏览器。 Internet archive Link from a now removed/dead/ microsoft connect Q/A on Silverlight Client HTTP Stack ignores Set-Cookie on 302 Redirect Responses (2010)
我认为我们现在可以替代IE6和它的Windows Mobile浏览器......
答案 2 :(得分:25)
一次通知(为了节省开发人员的生命):
当Cookie的域名为 localhost 时,IE和Edge会忽略重定向响应中的Set-Cookie。
<强>解决方案:强>
使用 127.0.0.1 代替 localhost 。
答案 3 :(得分:12)
Here是此问题的Chromium错误(对状态为302的HTTP响应忽略了Set-cookie)。
答案 4 :(得分:2)
我只是在Firefox和Safari上都遇到了这个问题,但Chrome却没有。根据我的测试,只有在重定向期间域发生更改时,才会发生这种情况。这在OAuth2流中很典型:
出于我尚未弄清楚的原因,请求2中的某些cookie被忽略,而其他则未被忽略。但是,如果请求2返回带有Refresh
标头的HTTP 200(“元刷新”重定向),则cookie将由请求3正确设置。
答案 5 :(得分:1)
这确实是一种皱眉,但如果您真的不想依赖30倍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>
服务器将向Set-Cookie发送200而不是适当的300x重定向,因此浏览器将存储cookie,然后执行“重定向”。如果浏览器不执行元刷新,则<a>
链接是一个后备。
答案 6 :(得分:1)
在.Net上使用OpenIdConnect / IdentityServer时遇到此问题,其中一个单独的API(不同的主机名)处理身份验证并重定向回主站点。
首先(对于在localhost上进行开发),您需要将CookieSecure
或SameAsRequest
设置为Never
或http://localhost/
来处理CookieSameSite
并不安全的问题。请参阅Michael Freidgeim的答案。
第二,您需要将Lax
属性设置为Strict
,否则cookie根本不会保存。 var ob1 = {
"list": [
"service",
"finance",
"s1.jpg"
],
"info": [
"details",
"mail",
"s2.jpg"
]
}
var ob2 = {
key1: "v1",
key2: "v2"
}
var result1=this.modifyObject(ob1);
var result2=this.modifyObject(ob2);
function modifyObject(ob){
const { field, value, id, ...fields } = ob;
const rest = Object.entries(fields)
.map(([field, value], id) => ({ field, value, id }));
const result = [...rest];
return result;
}
在这里不起作用!
答案 7 :(得分:-3)
在我的情况下,我设置CookieOptions.Secure = true,但在http://localhost上进行了测试。浏览器会根据设置隐藏Cookie。
为避免此类问题,您可以使用Cookie安全选项来匹配协议Request.IsHttps,例如
new CookieOptions()
{
Path = "/",
HttpOnly = true,
Secure = Request.IsHttps,
Expires = expires
}