Wysyłanie plików cookie przeglądarki podczas przekierowania 302


86

Czy są jakieś problemy z odesłaniem pliku cookie podczas przekierowania 302? Na przykład, jeśli utworzę plik cookie powrotu do adresu URL i przekieruje użytkownika w tej samej odpowiedzi, czy jakakolwiek (nowoczesna) przeglądarka zignoruje plik cookie?


Czytając trochę, myślę, że zmienne sesji byłyby lepsze niż pliki cookie, ponieważ są po stronie serwera i nie są zależne od przewidywalności klienta.
ADTC

Odpowiedzi:


40

Większość przeglądarek akceptuje pliki cookie przy przekierowaniach 302. Byłem tego całkiem pewien, ale trochę poszukałem. Nie wszystkie nowoczesne przeglądarki. Link do archiwum internetowego z już usuniętego / martwego / połączenia Q / A firmy Microsoft Connect na stosie HTTP klienta Silverlight ignoruje plik cookie Set-Cookie w odpowiedziach przekierowania 302 (2010)

Myślę, że mamy teraz zamiennik IE6 i to przeglądarki Windows Mobile ...


1
Podana strona forum nie może być dostępna przy użyciu adresu URL. Czy masz na myśli przeglądarki IE6 i Windows Mobile?
hiroshi

1
link został przeniesiony. Ustawiłem nowy link o tej samej treści. i miałem na myśli, że specyficzne wersje IE dla urządzeń mobilnych dodają swój własny zestaw błędów
regilero

51

Według tego posta na blogu: http://blog.dubbelboer.com/2012/11/25/302-cookie.html wszystkie główne przeglądarki, IE (6, 7, 8, 9, 10), FF (17), Safari (6.0.2), Opera (12.11) zarówno w systemie Windows, jak i Mac, ustawia pliki cookie na przekierowaniach. Dotyczy to zarówno przekierowań 301, jak i 302.


Niestety ta lista nie obejmuje Chrome, więc nie możemy dokładnie powiedzieć wszystkie popularne przeglądarki ...
MestreLion

3
@MestreLion: w mojej przeglądarce Chrome to działa. Więc ... myślę, że możemy powiedzieć, że w końcu działa teraz, w 2019 roku.
Michael

40

Jedna uwaga (aby uratować życie programisty):

IE i Edge ignorują Set-Cookie w odpowiedzi przekierowania, gdy domena pliku cookie to localhost .

Rozwiązanie:

Użyj 127.0.0.1 zamiast localhost .


12
IE i Edge mogły to „naprawić”, więc nie ustawią również plików cookie dla 127.0.0.1. No! I zastanawiają się, dlaczego nie wszyscy programiści kochają IE ... Twoja odpowiedź wciąż kończyła się dla mnie około 4 godzinami drapania się po głowie. Dzięki!
GlenPeterson

18

Oto błąd Chromium dotyczący tego problemu (zignorowano plik cookie Set-cookie w odpowiedzi HTTP ze stanem 302).


1
Jeśli to prawda, to naprawdę zła wiadomość :-(
MestreLion

Myślę, że to naprawili. Raport o błędzie nadal zawiera komunikat „WontFix”, ale w mojej przeglądarce Chrome działa.
Michael

@Michael zauważ, że Chromium to nie Chrome: lifewire.com/chromium-and-chrome-differences-4172101 - oznacza to, że chociaż może działać w Chrome, niekoniecznie jest to prawdą w przypadku Chromium
Thomas

3

Jest to naprawdę źle widziane podejście, ale jeśli naprawdę nie chcesz polegać na 30-krotnym zachowaniu przeglądarki z ustawionymi plikami cookie, możesz użyć meta http-equiv="refresh"„przekierowania” HTML podczas ustawiania pliku cookie. Na przykład w 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>

Serwer wyśle ​​Set-Cookie z 200 zamiast prawidłowego przekierowania 300x, więc przeglądarka zapisze ciasteczko, a następnie wykona "przekierowanie". <a>Ogniwo jest awaryjna w przeglądarce przypadku nie wykonuje odświeżanie meta.


1

Właśnie napotkałem ten problem zarówno z przeglądarką Firefox, jak i Safari, ale nie z Chrome. Z moich testów wynika, że ​​dzieje się tak tylko wtedy, gdy domena zmienia się podczas przekierowania. Jest to typowe w przepływie OAuth2:

  1. Dostawca identyfikatora OAuth2 (GitHub, Twitter, Google) przekierowuje przeglądarkę z powrotem do Twojej aplikacji
  2. URL wywołania zwrotnego Twojej aplikacji weryfikuje autoryzację i ustawia pliki cookie logowania, a następnie ponownie przekierowuje do docelowego adresu URL
  3. Docelowy adres URL wczytuje się bez ustawionych plików cookie.

Z powodów, których jeszcze nie odkryłem, niektóre pliki cookie z żądania 2 są ignorowane, a inne nie. Jeśli jednak żądanie 2 zwraca HTTP 200 z Refreshnagłówkiem (przekierowanie „meta refresh”), pliki cookie są ustawiane prawidłowo przez żądanie 3.


1
Podejrzewam, że przyczyną tych problemów z wywołaniem zwrotnym wrt oauth jest samesite=strict. W przypadku żądania oddzwonienia przeglądarka nadal uważa, że ​​inicjatorem jest Google (lub którykolwiek dostawca OAuth, którego używasz). W związku z tym, jeśli ustawisz samesite = ścisłe ciasteczko w odpowiedzi 302, przeglądarka prawdopodobnie pomyśli „ah ha! To jest żądanie między witrynami przychodzące z Google do Twojej witryny” i dlatego nie wysyła pliku cookie podczas żądania przekierowanego adresu URL. Rozwiązaniem jest użycie metaodświeżania, tak jak to zrobiłeś, więc żądanie pochodzi z Twojej własnej witryny. Mógłbym gadać bzdury, ale to mój obecny pogląd.
Ilan

1

Napotkano ten problem podczas korzystania z OpenIdConnect / IdentityServer na .Net, gdzie oddzielny interfejs API (inna nazwa hosta) obsługuje uwierzytelnianie i przekierowuje z powrotem do strony głównej.

Najpierw (do programowania na hoście lokalnym) musisz ustawić CookieSecureopcję SameAsRequestlub Neverradzić sobie z http://localhost/brakiem bezpieczeństwa. Zobacz odpowiedź Michaela Freidgeima .

Po drugie, musisz ustawić CookieSameSiteatrybut na Lax, w przeciwnym razie pliki cookie nie zostaną w ogóle zapisane. Strictnie działa tutaj!


-1

W moim przypadku ustawiłem CookieOptions.Secure = true, ale przetestowałem to na http: // localhost ., A przeglądarka ukrywa pliki cookie zgodnie z ustawieniem.

Aby uniknąć takiego problemu, możesz ustawić opcję Cookie Secure na zgodność z protokołem Request.IsHttps, np

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

2
W takim przypadku nie ustawiaj flagi bezpiecznej . Celem flagi jest poinformowanie przeglądarki, aby używała pliku cookie tylko podczas łączenia się przez HTTPS. Warunkowe ustawienie flagi zmienia nieco semantykę i tracisz plik cookie przechodząc z HTTPS -> HTTP, ale nie podczas przechodzenia z HTTP -> HTTPS. Wszystko to jest jednak ortogonalne do tego, co przeglądarki robią z Set-Cookienagłówkami w przekierowaniach 302.
Martijn Pieters

1
Ten czas, kiedy odpowiedź -3 głosami rozwiązuje problem. Ustawiałem Secure = true, ale zapomniałem, że na hoście lokalnym używam tylko protokołu HTTP do testowania. Noob błąd. Użyj secure=request.is_securew kolbie.
Eloff
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.