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

时间:2011-01-14 17:38:51

标签: http cookies http-status-code-302

在302重定向期间发回cookie是否有任何问题?例如,如果我创建一个return-to-url cookie并在同一个响应中重定向用户,那么任何(现代)浏览器都会忽略cookie吗?

8 个答案:

答案 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流中很典型:

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

出于我尚未弄清楚的原因,请求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上进行开发),您需要将CookieSecureSameAsRequest设置为Neverhttp://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
                }