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?
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?
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 ...
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
Atribut SameSite dari sebuah cookie menentukan apakah cookie tersebut harus dibatasi untuk konteks pihak pertama atau situs yang sama. Beberapa nilai SameSite diperbolehkan:
- Cookie dengan
"SameSite=Strict"
hanya akan dikirim dengan permintaan situs yang sama.- Cookie dengan
"SameSite=Lax"
akan dikirim dengan permintaan situs yang sama, atau navigasi tingkat atas lintas situs dengan metode HTTP "aman".- Cookie dengan
"SameSite=None"
akan dikirim dengan permintaan situs yang sama dan lintas situs.
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 .
Berikut adalah bug Chromium untuk masalah ini (Set-cookie diabaikan untuk tanggapan HTTP dengan status 302).
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.
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.
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 ke SameAsRequest
atau Never
untuk menangani http://localhost/
tidak aman. Lihat jawaban Michael Freidgeim .
Kedua, Anda perlu menyetel CookieSameSite
atribut ke Lax
, jika tidak, cookie tidak akan disimpan sama sekali. Strict
tidak bekerja disini!
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
new CookieOptions()
{
Path = "/",
HttpOnly = true,
Secure = Request.IsHttps,
Expires = expires
}
Set-Cookie
header pada 302 pengalihan.
secure=request.is_secure
dalam labu.