Invio di cookie del browser durante un reindirizzamento 302


88

Ci sono problemi con la restituzione di un cookie durante un reindirizzamento 302? Ad esempio, se creo un cookie di ritorno all'URL e reindirizzo l'utente nella stessa risposta, un browser (moderno) ignorerà il cookie?


Leggendo un po ', penso che le variabili di sessione sarebbero migliori dei cookie poiché sono lato server e non dipendono dalla prevedibilità del client.
ADTC

Risposte:


41

La maggior parte dei browser accetta i cookie sui reindirizzamenti 302. Ne ero abbastanza sicuro, ma ho fatto una piccola ricerca. Non tutti i browser moderni . Il collegamento all'archivio Internet da una domanda / risposta ora rimossa / morta / microsoft connect sullo stack HTTP del client Silverlight ignora Set-Cookie sulle risposte di reindirizzamento 302 (2010)

Penso che ora abbiamo un sostituto per IE6 e sono i browser Windows Mobile ...


1
La pagina del forum che hai specificato non può essere accessibile con l'URL. Vuoi dire che i browser IE6 e Windows Mobile non lo sono?
Hiroshi

1
il collegamento è stato spostato. Ho impostato un nuovo collegamento con quasi lo stesso contenuto. e volevo dire che le versioni specifiche di IE per dispositivi mobili aggiungono la propria serie di bug
regilero

53

Secondo questo post del blog: http://blog.dubbelboer.com/2012/11/25/302-cookie.html tutti i principali browser, IE (6, 7, 8, 9, 10), FF (17), Safari (6.0.2), Opera (12.11) sia su Windows che su Mac, impostano i cookie sui reindirizzamenti. Questo è vero per i reindirizzamenti 301 e 302.

Come ha notato @Benni:

https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies

L'attributo SameSite di un cookie specifica se il cookie deve essere limitato a un contesto proprietario o dello stesso sito. Sono consentiti diversi valori di SameSite:

  • Un cookie con "SameSite=Strict"verrà inviato solo con una richiesta dallo stesso sito.
  • Un cookie con "SameSite=Lax"verrà inviato con una richiesta dello stesso sito o una navigazione di primo livello tra siti con un metodo HTTP "sicuro".
  • "SameSite=None"Verrà inviato un cookie con richieste sia per lo stesso sito che per più siti.

Purtroppo questo elenco non include Chrome, quindi non possiamo dire esattamente tutti i principali browser ...
MestreLion

3
@MestreLion: sul mio browser Chrome funziona. Quindi .. penso che possiamo dire che finalmente funziona ora, nel 2019.
Michael

1
Dipende dalla politica del sito stesso: con rigoroso ancora non funziona.
Benni

42

Un avviso (per salvare la vita dello sviluppatore):

IE e Edge ignorano Set-Cookie nella risposta di reindirizzamento quando il dominio del cookie è localhost .

Soluzione:

Usa 127.0.0.1 invece di localhost .


12
IE e Edge potrebbero aver "risolto" questo problema in modo da non impostare i cookie per 127.0.0.1. Doh! E si chiedono perché gli sviluppatori non amano tutti IE ... La tua risposta è finita comunque circa 4 ore di grattacapi per me. Grazie!
GlenPeterson

19

Ecco il bug di Chromium per questo problema (set-cookie ignorato per la risposta HTTP con stato 302).


1
Se questo è vero è davvero una brutta notizia :-(
MestreLion

Penso che l'abbiano risolto. La segnalazione di bug dice ancora "WontFix", ma sul mio browser Chrome funziona.
Michael

@Michael nota che Chromium non è Chrome: lifewire.com/chromium-and-chrome-differences-4172101 - ciò significa che mentre potrebbe funzionare in Chrome, ciò non è necessariamente vero per Chromium
Thomas

4

Questo è un approccio davvero disapprovato, ma se davvero non vuoi fare affidamento sul comportamento del browser con set di cookie 30x potresti usare un meta http-equiv="refresh""reindirizzamento" HTML durante l'impostazione del cookie. Ad esempio, in 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>

Il server invierà Set-Cookie con un reindirizzamento 200 invece di un corretto 300x, quindi il browser memorizzerà il cookie e quindi eseguirà il "reindirizzamento". Il <a>collegamento è un fallback nel caso in cui il browser non esegua il meta refresh.


3

Ho appena riscontrato questo problema con Firefox e Safari, ma non con Chrome. Dai miei test, questo accade solo quando il dominio cambia durante il reindirizzamento. Questo è tipico in un flusso OAuth2:

  1. Il provider di ID OAuth2 (GitHub, Twitter, Google) reindirizza il browser alla tua app
  2. L'URL di richiamata della tua app verifica l'autorizzazione e imposta i cookie di accesso, quindi reindirizza nuovamente all'URL di destinazione
  3. Il tuo URL di destinazione viene caricato senza alcun cookie impostato.

Per motivi che non ho ancora capito, alcuni cookie della richiesta 2 vengono ignorati mentre altri no. Tuttavia, se la richiesta 2 restituisce un HTTP 200 con Refreshun'intestazione (il reindirizzamento "meta refresh"), i cookie vengono impostati correttamente dalla richiesta 3.


1
Ho il sospetto che la ragione di questi problemi di callback sia samesite=strict. Per la richiesta di richiamata il browser pensa ancora che l'originatore sia google (o qualsiasi provider oauth che utilizzi). Quindi, se imposti un cookie samesite = strict nella tua risposta 302, il browser probabilmente pensa "ah ah! Questa è una richiesta cross-site proveniente da Google al tuo sito" e quindi non invia il cookie quando richiede l'URL reindirizzato. La soluzione è utilizzare un meta refresh come hai fatto, quindi la tua richiesta proviene dal tuo sito. Potrei parlare di merda, ma questo è il mio pensiero attuale.
Ilan

2

È stato riscontrato questo problema durante l'utilizzo di OpenIdConnect / IdentityServer su .Net, dove un'API separata (nome host diverso) gestisce l'autenticazione e reindirizza al sito principale.

Innanzitutto (per lo sviluppo su localhost) è necessario impostare l' CookieSecureopzione su SameAsRequesto Neverper gestire la http://localhost/non sicurezza. Vedi la risposta di Michael Freidgeim .

Secondo, è necessario impostare l' CookieSameSiteattributo su Lax, altrimenti i cookie non vengono salvati affatto. Strictnon funziona qui!


-1

Nel mio caso ho impostato CookieOptions.Secure = true, ma l'ho testato su http: // localhost ., E il browser nasconde i cookie in base all'impostazione.

Per evitare questo problema, puoi impostare l'opzione Cookie Secure in modo che corrisponda al protocollo Request.IsHttps, ad es

new CookieOptions()
                {
                    Path = "/",
                    HttpOnly = true,
                    Secure = Request.IsHttps,
                    Expires = expires
                }

2
In tal caso non impostare il flag di sicurezza . Il punto centrale del flag è dire al browser di utilizzare il cookie solo quando si connette tramite HTTPS. L'impostazione condizionale del flag cambia in qualche modo la semantica e si perde il cookie durante la transizione da HTTPS -> HTTP, ma non quando si passa da HTTP -> HTTPS. Set-CookieTuttavia, tutto ciò è ortogonale a ciò che fanno i browser con le intestazioni sui reindirizzamenti 302.
Martijn Pieters

1
Quella volta in cui la risposta con -3 voti risolve il problema. Stavo impostando Secure = true, ma ho dimenticato che su localhost sto solo usando http per testarlo. Errore di Noob. Utilizzare secure=request.is_securein fiaschetta.
Eloff
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.