มีปัญหาในการส่งคุกกี้กลับระหว่างการเปลี่ยนเส้นทาง 302 หรือไม่? ตัวอย่างเช่นหากฉันสร้างคุกกี้ return-to-url และเปลี่ยนเส้นทางผู้ใช้ในการตอบกลับเดียวกันเบราว์เซอร์ (สมัยใหม่) ใด ๆ จะละเว้นคุกกี้หรือไม่
มีปัญหาในการส่งคุกกี้กลับระหว่างการเปลี่ยนเส้นทาง 302 หรือไม่? ตัวอย่างเช่นหากฉันสร้างคุกกี้ return-to-url และเปลี่ยนเส้นทางผู้ใช้ในการตอบกลับเดียวกันเบราว์เซอร์ (สมัยใหม่) ใด ๆ จะละเว้นคุกกี้หรือไม่
คำตอบ:
เบราว์เซอร์ส่วนใหญ่ยอมรับคุกกี้ในการเปลี่ยนเส้นทาง 302 ครั้ง ฉันค่อนข้างแน่ใจในเรื่องนั้น แต่ฉันทำการค้นหาเล็กน้อย ไม่ใช่เบราว์เซอร์ สมัยใหม่ทั้งหมด ลิงก์ที่เก็บถาวรทางอินเทอร์เน็ตจากตอนนี้ที่ถูกลบ / ตาย / microsoft connect Q / A บนSilverlight Client HTTP Stack ละเว้น Set-Cookie บน 302 Redirect Responses (2010)
ฉันคิดว่าตอนนี้เราได้แทนที่ IE6 แล้วและเป็นเบราว์เซอร์ Windows Mobile ...
ตามโพสต์บล็อกนี้: http://blog.dubbelboer.com/2012/11/25/302-cookie.htmlเบราว์เซอร์หลักทั้งหมด IE (6, 7, 8, 9, 10), FF (17), Safari (6.0.2), Opera (12.11) ทั้งบน Windows และ Mac ตั้งค่าคุกกี้ในการเปลี่ยนเส้นทาง ซึ่งเป็นจริงสำหรับการเปลี่ยนเส้นทางทั้ง 301 และ 302
ดังที่ @Benni กล่าวไว้:
https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies
แอตทริบิวต์ SameSite ของคุกกี้ระบุว่าควร จำกัด คุกกี้ไว้เฉพาะบริบทของบุคคลที่หนึ่งหรือไซต์เดียวกัน อนุญาตหลายค่าของ SameSite:
- คุกกี้ที่มี
"SameSite=Strict"
จะถูกส่งไปพร้อมกับคำขอของไซต์เดียวกันเท่านั้น- คุกกี้ที่มี
"SameSite=Lax"
จะถูกส่งไปพร้อมกับคำขอไซต์เดียวกันหรือการนำทางข้ามไซต์ระดับบนสุดด้วยวิธี HTTP "ปลอดภัย"- คุกกี้ที่มี
"SameSite=None"
จะถูกส่งไปพร้อมกับคำขอทั้งไซต์เดียวกันและข้ามไซต์
ประกาศอย่างหนึ่ง (เพื่อช่วยชีวิตนักพัฒนา):
IE และ Edge กำลังละเว้น Set-Cookie ในการตอบสนองการเปลี่ยนเส้นทางเมื่อโดเมนของคุกกี้เป็นlocalhost localhost
วิธีการแก้:
ใช้127.0.0.1แทนlocalhost
นี่คือข้อบกพร่องของ Chromium สำหรับปัญหานี้ (ไม่สนใจชุดคุกกี้สำหรับการตอบสนอง HTTP ที่มีสถานะ 302)
นี่เป็นแนวทางที่ขมขื่น แต่ถ้าคุณไม่ต้องการพึ่งพาพฤติกรรมเบราว์เซอร์ชุดคุกกี้ 30x คุณสามารถใช้ HTML meta http-equiv="refresh"
"เปลี่ยนเส้นทาง" เมื่อตั้งค่าคุกกี้ ตัวอย่างเช่นใน 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>
เซิร์ฟเวอร์จะส่ง Set-Cookie พร้อมกับ 200 แทนการเปลี่ยนเส้นทาง 300x ที่เหมาะสมดังนั้นเบราว์เซอร์จะจัดเก็บคุกกี้จากนั้นทำการ "เปลี่ยนเส้นทาง" <a>
ลิงค์เป็นทางเลือกในกรณีที่เบราว์เซอร์ไม่ได้ดำเนินการฟื้นฟูเมตา
ฉันเพิ่งพบปัญหานี้กับทั้ง Firefox และ Safari แต่ไม่ใช่ Chrome จากการทดสอบของฉันสิ่งนี้จะเกิดขึ้นเฉพาะเมื่อโดเมนเปลี่ยนไปในระหว่างการเปลี่ยนเส้นทาง ซึ่งเป็นเรื่องปกติในโฟลว์ OAuth2:
ด้วยเหตุผลที่ฉันยังไม่ทราบบางคุกกี้จากคำขอ 2 จะถูกละเว้นในขณะที่คุกกี้อื่น ๆ ไม่ได้ อย่างไรก็ตามหากคำขอ 2 ส่งคืน HTTP 200 พร้อมRefresh
ส่วนหัว (การเปลี่ยนเส้นทาง "เมตารีเฟรช") คุกกี้จะถูกตั้งค่าอย่างถูกต้องตามคำขอ 3
samesite=strict
นี้ปัญหาการเรียกกลับเป็น สำหรับคำขอโทรกลับเบราว์เซอร์ยังคงคิดว่าผู้ริเริ่มคือ Google (หรือผู้ให้บริการ oauth ใดก็ตามที่คุณใช้) ดังนั้นหากคุณตั้งค่า samesite = คุกกี้ที่เข้มงวดในการตอบกลับ 302 ของคุณเบราว์เซอร์อาจคิดว่า "อ๊ะ! นี่คือคำขอข้ามไซต์ที่มาจาก Google ไปยังไซต์ของคุณ" และด้วยเหตุนี้จึงไม่ส่งคุกกี้เมื่อขอ URL ที่เปลี่ยนเส้นทาง การแก้ไขคือใช้การรีเฟรชเมตาตามที่คุณทำดังนั้นคำขอของคุณจึงมาจากไซต์ของคุณเอง ฉันอาจจะพูดไร้สาระ แต่นั่นคือความคิดปัจจุบันของฉัน
พบปัญหานี้ขณะใช้ OpenIdConnect / IdentityServer บน. Net โดยที่ API แยกต่างหาก (ชื่อโฮสต์ที่แตกต่างกัน) จะจัดการการตรวจสอบสิทธิ์และเปลี่ยนเส้นทางกลับไปยังไซต์หลัก
ขั้นแรก (สำหรับการพัฒนาบน localhost) คุณต้องตั้งค่าCookieSecure
ตัวเลือกSameAsRequest
หรือNever
เพื่อจัดการกับความhttp://localhost/
ไม่ปลอดภัย ดูคำตอบของMichael Freidgeim
ประการที่สองคุณต้องตั้งค่าCookieSameSite
แอตทริบิวต์Lax
มิฉะนั้นคุกกี้จะไม่ได้รับการบันทึกเลย Strict
ไม่ทำงานที่นี่!
ในกรณีของฉันฉันตั้งค่าCookieOptions.Secure = true แต่ทดสอบบนhttp: // localhost . และเบราว์เซอร์ซ่อนคุกกี้ตามการตั้งค่า
เพื่อหลีกเลี่ยงปัญหาดังกล่าวคุณสามารถสร้างตัวเลือกการรักษาความปลอดภัยของคุกกี้เพื่อให้ตรงกับคำร้องขอโปรโตคอลได้เช่น
new CookieOptions()
{
Path = "/",
HttpOnly = true,
Secure = Request.IsHttps,
Expires = expires
}
Set-Cookie
ส่วนหัวในการเปลี่ยนเส้นทาง 302
secure=request.is_secure
ในขวด