Gibt es Probleme beim Zurücksenden eines Cookies während einer 302-Umleitung? Wenn ich beispielsweise ein Cookie für die Rückkehr zur URL erstelle und den Benutzer in derselben Antwort umleitung, ignoriert dann ein (moderner) Browser das Cookie?
Gibt es Probleme beim Zurücksenden eines Cookies während einer 302-Umleitung? Wenn ich beispielsweise ein Cookie für die Rückkehr zur URL erstelle und den Benutzer in derselben Antwort umleitung, ignoriert dann ein (moderner) Browser das Cookie?
Antworten:
Die meisten Browser akzeptieren Cookies für 302 Weiterleitungen. Da war ich mir ziemlich sicher, aber ich machte eine kleine Suche. Nicht alle modernen Browser. Internetarchiv Link von einer jetzt entfernten / toten / Microsoft-Verbindung Q / A auf dem Silverlight Client HTTP-Stack ignoriert Set-Cookie bei 302 Redirect Responses (2010)
Ich denke, wir haben jetzt einen Ersatz für IE6 und es sind Windows Mobile-Browser ...
Laut diesem Blog-Beitrag: http://blog.dubbelboer.com/2012/11/25/302-cookie.html alle gängigen Browser, IE (6, 7, 8, 9, 10), FF (17), Safari (6.0.2), Opera (12.11) unter Windows und Mac setzen Cookies für Weiterleitungen. Dies gilt sowohl für 301- als auch für 302-Weiterleitungen.
Ein Hinweis (um Entwicklern das Leben zu retten):
IE und Edge ignorieren Set-Cookie in der Umleitungsantwort, wenn die Domäne des Cookies localhost ist .
Lösung:
Verwenden Sie 127.0.0.1 anstelle von localhost .
Hier ist der Chromium-Fehler für dieses Problem (Set-Cookie für HTTP-Antwort mit Status 302 ignoriert).
Dies ist ein wirklich verpönter Ansatz, aber wenn Sie sich wirklich nicht auf das 30-fache Verhalten des Set-Cookie-Browsers verlassen möchten, können Sie meta http-equiv="refresh"
beim Setzen des Cookies eine HTML- Umleitung verwenden. Zum Beispiel 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>
Der Server sendet ein Set-Cookie mit einer 200 anstelle einer richtigen 300-fachen Umleitung, sodass der Browser das Cookie speichert und dann die "Umleitung" durchführt. Der <a>
Link ist ein Fallback für den Fall, dass der Browser die Metaaktualisierung nicht durchführt.
Ich bin gerade auf dieses Problem mit Firefox und Safari gestoßen, aber nicht mit Chrome. Nach meinen Tests geschieht dies nur, wenn sich die Domäne während der Umleitung ändert. Dies ist typisch für einen OAuth2-Fluss:
Aus Gründen, die ich noch nicht herausgefunden habe, werden einige Cookies aus Anfrage 2 ignoriert, andere nicht. Wenn jedoch Anforderung 2 ein HTTP 200 mit einem Refresh
Header zurückgibt (die "Meta Refresh" -Umleitung), werden Cookies durch Anforderung 3 ordnungsgemäß gesetzt.
Dieses Problem ist bei der Verwendung von OpenIdConnect in .Net aufgetreten, wo eine separate API die Authentifizierung übernimmt und zur Hauptwebsite zurückleitet.
Zunächst müssen Sie die CookieSecure
Option festlegen SameAsRequest
oder Never
damit umgehen, dass Sie http://localhost/
nicht sicher sind. Siehe Michael Freidgeims Antwort.
Zweitens muss auch das CookieSameSite
Attribut auf gesetzt werden Lax
, sonst werden die Cookies nicht gespeichert.
In meinem Fall habe ich CookieOptions.Secure = true gesetzt, es aber auf http: // localhost . Getestet und Cookies entsprechend der Einstellung im Browser ausgeblendet .
Um ein solches Problem zu vermeiden, können Sie die Option Cookie Secure so einstellen, dass sie mit dem Protokoll Request.IsHttps übereinstimmt, z
new CookieOptions()
{
Path = "/",
HttpOnly = true,
Secure = Request.IsHttps,
Expires = expires
}
Set-Cookie
Headern bei 302-Weiterleitungen tun .
secure=request.is_secure
in Kolben.