¿Hay algún problema con el envío de una cookie durante un redireccionamiento 302? Por ejemplo, si creo una cookie de retorno a la URL y redirijo al usuario en la misma respuesta, ¿algún navegador (moderno) ignorará la cookie?
¿Hay algún problema con el envío de una cookie durante un redireccionamiento 302? Por ejemplo, si creo una cookie de retorno a la URL y redirijo al usuario en la misma respuesta, ¿algún navegador (moderno) ignorará la cookie?
Respuestas:
La mayoría de los navegadores aceptan cookies en redireccionamientos 302. Estaba bastante seguro de eso, pero hice una pequeña búsqueda. No todos los navegadores modernos . El enlace de archivo de Internet de una sesión de preguntas y respuestas de Microsoft Connect ahora eliminada / muerta / Microsoft Connect en Silverlight Client HTTP Stack ignora Set-Cookie en 302 Redirect Responses (2010)
Creo que ahora tenemos un reemplazo para IE6 y son los navegadores de Windows Mobile ...
Según esta publicación de blog: http://blog.dubbelboer.com/2012/11/25/302-cookie.html todos los principales navegadores, IE (6, 7, 8, 9, 10), FF (17), Safari (6.0.2), Opera (12.11) tanto en Windows como en Mac, configuran cookies en las redirecciones. Esto es cierto para las redirecciones 301 y 302.
Un aviso (para salvar la vida del desarrollador):
IE y Edge ignoran Set-Cookie en la respuesta de redireccionamiento cuando el dominio de la cookie es localhost .
Solución:
Utilice 127.0.0.1 en lugar de localhost .
Aquí está el error de Chromium para este problema (la cookie de configuración se ignora para la respuesta HTTP con estado 302).
Este es un enfoque realmente desaprobado, pero si realmente no desea confiar en el comportamiento del navegador de cookies configuradas 30x, puede usar un meta http-equiv="refresh"
"redireccionamiento" HTML al configurar la cookie. Por ejemplo, en 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>
El servidor enviará Set-Cookie con un 200 en lugar de un redireccionamiento 300x adecuado, por lo que el navegador almacenará la cookie y luego realizará el "redireccionamiento". El <a>
enlace es un respaldo en caso de que el navegador no realice la meta actualización.
Me acabo de encontrar con este problema con Firefox y Safari, pero no con Chrome. Según mis pruebas, esto solo sucede cuando el dominio cambia durante la redirección. Esto es típico en un flujo de OAuth2:
Por razones que aún no he descubierto, algunas cookies de la solicitud 2 se ignoran y otras no. Sin embargo, si la solicitud 2 devuelve un HTTP 200 con un Refresh
encabezado (la redirección de "meta actualización"), las cookies se configuran correctamente mediante la solicitud 3.
samesite=strict
. Para la solicitud de devolución de llamada, el navegador todavía piensa que el creador es Google (o cualquier proveedor de oauth que use). Por lo tanto, si configura un samesite = cookie estricta en su respuesta 302, entonces el navegador probablemente piense "¡ah, ja! Esta es una solicitud entre sitios proveniente de Google a su sitio" y, por lo tanto, no envía la cookie cuando solicita la URL redirigida. La solución es usar una meta-actualización como lo hizo, por lo que su solicitud proviene de su propio sitio. Podría estar hablando tonterías, pero ese es mi pensamiento actual.
Encontré este problema mientras usaba OpenIdConnect / IdentityServer en .Net, donde una API separada (nombre de host diferente) maneja la autenticación y redirige al sitio principal.
Primero (para el desarrollo en localhost) debe establecer la CookieSecure
opción SameAsRequest
o Never
para hacer frente a http://localhost/
no ser seguro. Vea la respuesta de Michael Freidgeim .
En segundo lugar, debe establecer el CookieSameSite
atributo en Lax
; de lo contrario, las cookies no se guardan en absoluto. Strict
no funciona aqui!
En mi caso, configuré CookieOptions.Secure = true, pero lo probé en http: // localhost ., Y el navegador oculta las cookies de acuerdo con la configuración.
Para evitar este problema, puede hacer que la opción de cookies sea segura para que coincida con la solicitud del protocolo.
new CookieOptions()
{
Path = "/",
HttpOnly = true,
Secure = Request.IsHttps,
Expires = expires
}
Set-Cookie
Sin embargo, todo esto es ortogonal a lo que hacen los navegadores con los encabezados en las redirecciones 302.
secure=request.is_secure
en matraz.