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?
http
cookies
http-status-code-302
Abdullah Jibaly
źródło
źródło
Odpowiedzi:
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 ...
źródło
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.
źródło
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 .
źródło
Oto błąd Chromium dotyczący tego problemu (zignorowano plik cookie Set-cookie w odpowiedzi HTTP ze stanem 302).
źródło
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.źródło
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:
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
Refresh
nagłówkiem (przekierowanie „meta refresh”), pliki cookie są ustawiane prawidłowo przez żądanie 3.źródło
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.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ć
CookieSecure
opcjęSameAsRequest
lubNever
radzić sobie zhttp://localhost/
brakiem bezpieczeństwa. Zobacz odpowiedź Michaela Freidgeima .Po drugie, musisz ustawić
CookieSameSite
atrybut naLax
, w przeciwnym razie pliki cookie nie zostaną w ogóle zapisane.Strict
nie działa tutaj!źródło
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
źródło
Set-Cookie
nagłówkami w przekierowaniach 302.secure=request.is_secure
w kolbie.