Há algum problema com o envio de um cookie durante um redirecionamento 302? Por exemplo, se eu criar um cookie de retorno ao url e redirecionar o usuário na mesma resposta, algum navegador (moderno) ignorará o cookie?
Há algum problema com o envio de um cookie durante um redirecionamento 302? Por exemplo, se eu criar um cookie de retorno ao url e redirecionar o usuário na mesma resposta, algum navegador (moderno) ignorará o cookie?
Respostas:
A maioria dos navegadores está aceitando cookies em redirecionamentos 302. Eu tinha certeza disso, mas fiz uma pequena pesquisa. Nem todos os navegadores modernos . Link de arquivo da Internet de uma Q / A agora removida / morta / microsoft connect na pilha HTTP do cliente Silverlight ignora Set-Cookie em 302 Redirect Respostas (2010)
Acho que agora temos um substituto para o IE6 e seus navegadores Windows Mobile ...
De acordo com esta postagem do blog: http://blog.dubbelboer.com/2012/11/25/302-cookie.html todos os principais navegadores, IE (6, 7, 8, 9, 10), FF (17), Safari (6.0.2), Opera (12.11) no Windows e Mac, define cookies nos redirecionamentos. Isso é verdadeiro para os redirecionamentos 301 e 302.
Um aviso (para salvar a vida do desenvolvedor):
IE e Edge estão ignorando Set-Cookie na resposta de redirecionamento quando o domínio do cookie é localhost .
Solução:
Use 127.0.0.1 em vez de localhost .
Aqui está o bug do Chromium para esse problema (Set-cookie ignorado para resposta HTTP com status 302).
Esta é uma abordagem realmente desaprovada, mas se você realmente deseja não confiar no comportamento do navegador 30x set-cookie, você pode usar um meta http-equiv="refresh"
"redirecionamento" de HTML ao configurar o cookie. Por exemplo, em 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>
O servidor enviará Set-Cookie com um 200 em vez de um redirecionamento 300x adequado, de modo que o navegador armazenará o cookie e executará o "redirecionamento". O <a>
link é um substituto caso o navegador não execute a atualização meta.
Acabei de ter esse problema com o Firefox e o Safari, mas não com o Chrome. Pelo meu teste, isso só acontece quando o domínio muda durante o redirecionamento. Isso é típico em um fluxo OAuth2:
Por motivos que ainda não descobri, alguns cookies da solicitação 2 são ignorados, enquanto outros não. No entanto, se a solicitação 2 retornar um HTTP 200 com um Refresh
cabeçalho (o redirecionamento de "atualização meta"), os cookies serão configurados corretamente pela solicitação 3.
samesite=strict
. Para a solicitação de retorno de chamada, o navegador ainda pensa que o originador é o Google (ou qualquer provedor oauth que você usa). Portanto, se você definir um cookie samesite = strict em sua resposta 302, o navegador provavelmente pensará "ah ha! Esta é uma solicitação de cross-site proveniente do Google para o seu site" e, portanto, não envia o cookie ao solicitar o url redirecionado. A correção é usar uma meta-atualização conforme você fez, de modo que sua solicitação venha do seu próprio site. Eu poderia estar falando merda, mas esse é o meu pensamento atual.
Esse problema foi encontrado ao usar OpenIdConnect / IdentityServer no .Net, onde uma API separada (nome de host diferente) lida com a autenticação e redireciona de volta para o site principal.
Primeiro (para desenvolvimento em localhost) você precisa definir a CookieSecure
opção de SameAsRequest
ou Never
para lidar com a http://localhost/
falta de segurança. Veja a resposta de Michael Freidgeim .
Em segundo lugar, você precisa definir o CookieSameSite
atributo para Lax
, caso contrário, os cookies não serão salvos. Strict
não funciona aqui!
No meu caso, configurei CookieOptions.Secure = true, mas testei em http: // localhost ., E o navegador escondeu os cookies de acordo com a configuração.
Para evitar esse problema, você pode tornar a opção segura do cookie para corresponder ao protocolo Request.IsHttps, por exemplo
new CookieOptions()
{
Path = "/",
HttpOnly = true,
Secure = Request.IsHttps,
Expires = expires
}
Set-Cookie
Porém, tudo isso é ortogonal ao que os navegadores fazem com os cabeçalhos em redirecionamentos 302.
secure=request.is_secure
em frasco.