Apakah ada masalah dengan pengiriman kembali cookie selama 302 redirect? Misalnya, jika saya membuat kuki return-to-url dan mengalihkan pengguna dalam tanggapan yang sama, apakah peramban (modern) mana pun akan mengabaikan kuki?
http
cookies
http-status-code-302
Abdullah Jibaly
sumber
sumber
Jawaban:
Sebagian besar browser menerima cookie pada 302 pengalihan. Saya cukup yakin akan hal itu, tetapi saya melakukan sedikit pencarian. Tidak semua browser modern . Tautan arsip internet dari Q / A yang sekarang dihapus / mati / microsoft connect pada Tumpukan HTTP Klien Silverlight mengabaikan Set-Cookie pada 302 Redirect Responses (2010)
Saya pikir kami sekarang memiliki pengganti IE6 dan itu adalah browser Windows Mobile ...
sumber
Menurut posting blog ini: http://blog.dubbelboer.com/2012/11/25/302-cookie.html semua browser utama, IE (6, 7, 8, 9, 10), FF (17), Safari (6.0.2), Opera (12.11) baik di Windows dan Mac, mengatur cookie pada pengalihan. Ini berlaku untuk pengalihan 301 dan 302.
Seperti yang dicatat @Benni:
https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies
sumber
Satu pemberitahuan (untuk menyelamatkan hidup pengembang):
IE dan Edge mengabaikan Set-Cookie dalam respons pengalihan ketika domain cookie adalah localhost .
Larutan:
Gunakan 127.0.0.1 sebagai ganti localhost .
sumber
Berikut adalah bug Chromium untuk masalah ini (Set-cookie diabaikan untuk tanggapan HTTP dengan status 302).
sumber
Ini benar-benar pendekatan yang tidak disukai, tetapi jika Anda benar-benar ingin tidak mengandalkan perilaku browser set-cookie 30x, Anda dapat menggunakan
meta http-equiv="refresh"
"pengalihan" HTML saat menyetel cookie. Misalnya, di 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>
Server akan mengirim Set-Cookie dengan 200 bukannya 300x redirect yang tepat, jadi browser akan menyimpan cookie, dan kemudian melakukan "redirect". The
<a>
link adalah fallback dalam kasus browser tidak melakukan penyegaran meta.sumber
Saya baru saja mengalami masalah ini dengan Firefox dan Safari, tetapi tidak dengan Chrome. Dari pengujian saya, ini hanya terjadi ketika domain berubah selama pengalihan. Ini tipikal dalam aliran OAuth2:
Untuk alasan yang belum saya ketahui, beberapa cookie dari permintaan 2 diabaikan sementara yang lainnya tidak. Namun, jika permintaan 2 mengembalikan HTTP 200 dengan
Refresh
tajuk (pengalihan "meta refresh"), cookie disetel dengan benar oleh permintaan 3.sumber
samesite=strict
. Untuk permintaan panggilan balik, browser masih menganggap pembuatnya adalah google (atau penyedia oauth mana pun yang Anda gunakan). Oleh karena itu, jika Anda menyetel samesite = strict cookie dalam respons 302 Anda, maka browser mungkin berpikir "ah ha! Ini adalah permintaan lintas situs yang datang dari Google ke situs Anda" dan karenanya tidak mengirimkan cookie saat meminta url yang diarahkan ulang. Perbaikannya adalah dengan menggunakan meta-refresh seperti yang Anda lakukan, jadi permintaan Anda berasal dari situs Anda sendiri. Saya bisa saja berbicara omong kosong, tapi itulah pemikiran saya saat ini.Mengalami masalah ini saat menggunakan OpenIdConnect / IdentityServer di .Net, di mana API terpisah (nama host berbeda) menangani otentikasi dan pengalihan kembali ke situs utama.
Pertama (untuk pengembangan di localhost) Anda perlu mengatur
CookieSecure
opsi keSameAsRequest
atauNever
untuk menanganihttp://localhost/
tidak aman. Lihat jawaban Michael Freidgeim .Kedua, Anda perlu menyetel
CookieSameSite
atribut keLax
, jika tidak, cookie tidak akan disimpan sama sekali.Strict
tidak bekerja disini!sumber
Dalam kasus saya, saya menetapkan CookieOptions.Secure = true, tetapi mengujinya di http: // localhost ., Dan browser menyembunyikan cookie sesuai dengan pengaturan.
Untuk menghindari masalah seperti itu, Anda dapat membuat opsi Cookie Secure agar sesuai dengan protokol Request.IsHttps, mis
sumber
Set-Cookie
header pada 302 pengalihan.secure=request.is_secure
dalam labu.