การส่งคุกกี้ของเบราว์เซอร์ระหว่างการเปลี่ยนเส้นทาง 302


88

มีปัญหาในการส่งคุกกี้กลับระหว่างการเปลี่ยนเส้นทาง 302 หรือไม่? ตัวอย่างเช่นหากฉันสร้างคุกกี้ return-to-url และเปลี่ยนเส้นทางผู้ใช้ในการตอบกลับเดียวกันเบราว์เซอร์ (สมัยใหม่) ใด ๆ จะละเว้นคุกกี้หรือไม่


อ่านสักนิดฉันคิดว่าตัวแปรเซสชันน่าจะดีกว่าคุกกี้เนื่องจากเป็นฝั่งเซิร์ฟเวอร์และไม่ขึ้นอยู่กับความสามารถในการคาดเดาของไคลเอ็นต์
ADTC

คำตอบ:


41

เบราว์เซอร์ส่วนใหญ่ยอมรับคุกกี้ในการเปลี่ยนเส้นทาง 302 ครั้ง ฉันค่อนข้างแน่ใจในเรื่องนั้น แต่ฉันทำการค้นหาเล็กน้อย ไม่ใช่เบราว์เซอร์ สมัยใหม่ทั้งหมด ลิงก์ที่เก็บถาวรทางอินเทอร์เน็ตจากตอนนี้ที่ถูกลบ / ตาย / microsoft connect Q / A บนSilverlight Client HTTP Stack ละเว้น Set-Cookie บน 302 Redirect Responses (2010)

ฉันคิดว่าตอนนี้เราได้แทนที่ IE6 แล้วและเป็นเบราว์เซอร์ Windows Mobile ...


1
หน้าฟอรัมที่คุณระบุไม่สามารถเข้าถึงได้ด้วย URL คุณหมายถึงเบราว์เซอร์ IE6 และ Windows Mobile ไม่ใช่หรือ?
hiroshi

1
ลิงก์ถูกย้าย ฉันตั้งลิงค์ใหม่ที่มีเนื้อหาค่อนข้างเหมือนกัน และฉันหมายถึง IE เวอร์ชันเฉพาะสำหรับมือถือเพิ่มชุดบั๊กของตัวเอง
regilero

53

ตามโพสต์บล็อกนี้: 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"จะถูกส่งไปพร้อมกับคำขอทั้งไซต์เดียวกันและข้ามไซต์

น่าเสียดายที่รายการนี้ไม่รวม Chrome ดังนั้นเราจึงไม่สามารถพูดได้ว่าเบราว์เซอร์หลัก ๆทั้งหมด ...
MestreLion

3
@MestreLion: บนเบราว์เซอร์ Chrome ของฉันมันใช้งานได้ ดังนั้น .. ฉันคิดว่าเราสามารถพูดได้ว่าในที่สุดมันก็ใช้งานได้ในปี 2019
Michael

1
ขึ้นอยู่กับนโยบาย samesite: ด้วยความเข้มงวดก็ยังไม่ได้ผล
Benni

42

ประกาศอย่างหนึ่ง (เพื่อช่วยชีวิตนักพัฒนา):

IE และ Edge กำลังละเว้น Set-Cookie ในการตอบสนองการเปลี่ยนเส้นทางเมื่อโดเมนของคุกกี้เป็นlocalhost localhost

วิธีการแก้:

ใช้127.0.0.1แทนlocalhost


12
IE และ Edge อาจ "แก้ไข" แล้วดังนั้นจึงไม่ตั้งค่าคุกกี้สำหรับ 127.0.0.1 เช่นกัน ดู๊! และพวกเขาสงสัยว่าทำไมนักพัฒนาทุกคนถึงไม่รัก IE ... คำตอบของคุณยังคงจบลงด้วยการเกาหัวสำหรับฉันประมาณ 4 ชั่วโมง ขอบคุณ!
GlenPeterson

19

นี่คือข้อบกพร่องของ Chromium สำหรับปัญหานี้ (ไม่สนใจชุดคุกกี้สำหรับการตอบสนอง HTTP ที่มีสถานะ 302)


1
ถ้าเป็นเรื่องจริงมันก็เป็นข่าวร้ายจริงๆ :-(
MestreLion

ฉันคิดว่าพวกเขาแก้ไขแล้ว รายงานข้อบกพร่องยังคงระบุว่า "WontFix" แต่บนเบราว์เซอร์ Chrome ของฉันใช้งานได้
Michael

@ Michael โปรดทราบว่า Chromium ไม่ใช่ Chrome: lifewire.com/chromium-and-chrome-differences-4172101ซึ่งหมายความว่าในขณะที่อาจใช้งานได้ใน Chrome ซึ่งไม่จำเป็นต้องเป็นจริงสำหรับ Chromium
Thomas

4

นี่เป็นแนวทางที่ขมขื่น แต่ถ้าคุณไม่ต้องการพึ่งพาพฤติกรรมเบราว์เซอร์ชุดคุกกี้ 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>ลิงค์เป็นทางเลือกในกรณีที่เบราว์เซอร์ไม่ได้ดำเนินการฟื้นฟูเมตา


3

ฉันเพิ่งพบปัญหานี้กับทั้ง Firefox และ Safari แต่ไม่ใช่ Chrome จากการทดสอบของฉันสิ่งนี้จะเกิดขึ้นเฉพาะเมื่อโดเมนเปลี่ยนไปในระหว่างการเปลี่ยนเส้นทาง ซึ่งเป็นเรื่องปกติในโฟลว์ OAuth2:

  1. ผู้ให้บริการรหัส OAuth2 (GitHub, Twitter, Google) จะเปลี่ยนเส้นทางเบราว์เซอร์กลับไปที่แอปของคุณ
  2. URL เรียกกลับของแอปของคุณจะยืนยันการอนุญาตและตั้งค่าคุกกี้การเข้าสู่ระบบจากนั้นเปลี่ยนเส้นทางไปยัง URL ปลายทางอีกครั้ง
  3. URL ปลายทางของคุณโหลดโดยไม่ได้ตั้งค่าคุกกี้

ด้วยเหตุผลที่ฉันยังไม่ทราบบางคุกกี้จากคำขอ 2 จะถูกละเว้นในขณะที่คุกกี้อื่น ๆ ไม่ได้ อย่างไรก็ตามหากคำขอ 2 ส่งคืน HTTP 200 พร้อมRefreshส่วนหัว (การเปลี่ยนเส้นทาง "เมตารีเฟรช") คุกกี้จะถูกตั้งค่าอย่างถูกต้องตามคำขอ 3


1
ฉันสงสัยว่าเหตุผลสำหรับ WRT OAuth samesite=strictนี้ปัญหาการเรียกกลับเป็น สำหรับคำขอโทรกลับเบราว์เซอร์ยังคงคิดว่าผู้ริเริ่มคือ Google (หรือผู้ให้บริการ oauth ใดก็ตามที่คุณใช้) ดังนั้นหากคุณตั้งค่า samesite = คุกกี้ที่เข้มงวดในการตอบกลับ 302 ของคุณเบราว์เซอร์อาจคิดว่า "อ๊ะ! นี่คือคำขอข้ามไซต์ที่มาจาก Google ไปยังไซต์ของคุณ" และด้วยเหตุนี้จึงไม่ส่งคุกกี้เมื่อขอ URL ที่เปลี่ยนเส้นทาง การแก้ไขคือใช้การรีเฟรชเมตาตามที่คุณทำดังนั้นคำขอของคุณจึงมาจากไซต์ของคุณเอง ฉันอาจจะพูดไร้สาระ แต่นั่นคือความคิดปัจจุบันของฉัน
Ilan

2

พบปัญหานี้ขณะใช้ OpenIdConnect / IdentityServer บน. Net โดยที่ API แยกต่างหาก (ชื่อโฮสต์ที่แตกต่างกัน) จะจัดการการตรวจสอบสิทธิ์และเปลี่ยนเส้นทางกลับไปยังไซต์หลัก

ขั้นแรก (สำหรับการพัฒนาบน localhost) คุณต้องตั้งค่าCookieSecureตัวเลือกSameAsRequestหรือNeverเพื่อจัดการกับความhttp://localhost/ไม่ปลอดภัย ดูคำตอบของMichael Freidgeim

ประการที่สองคุณต้องตั้งค่าCookieSameSiteแอตทริบิวต์Laxมิฉะนั้นคุกกี้จะไม่ได้รับการบันทึกเลย Strictไม่ทำงานที่นี่!


-1

ในกรณีของฉันฉันตั้งค่าCookieOptions.Secure = true แต่ทดสอบบนhttp: // localhost . และเบราว์เซอร์ซ่อนคุกกี้ตามการตั้งค่า

เพื่อหลีกเลี่ยงปัญหาดังกล่าวคุณสามารถสร้างตัวเลือกการรักษาความปลอดภัยของคุกกี้เพื่อให้ตรงกับคำร้องขอโปรโตคอลได้เช่น

new CookieOptions()
                {
                    Path = "/",
                    HttpOnly = true,
                    Secure = Request.IsHttps,
                    Expires = expires
                }

2
ในกรณีที่ไม่ได้ตั้งธงที่เชื่อถือได้ จุดรวมของการตั้งค่าสถานะคือการบอกให้เบราว์เซอร์ใช้คุกกี้เมื่อเชื่อมต่อผ่าน HTTPS เท่านั้น การตั้งค่าแฟล็กแบบมีเงื่อนไขจะเปลี่ยนความหมายไปบ้างและคุณสูญเสียคุกกี้ที่เปลี่ยนจาก HTTPS -> HTTP แต่ไม่ใช่เมื่อไปจาก HTTP -> HTTPS ทั้งหมดนี้เป็นมุมฉากกับสิ่งที่เบราว์เซอร์ทำกับSet-Cookieส่วนหัวในการเปลี่ยนเส้นทาง 302
Martijn Pieters

1
เวลานั้นเมื่อคำตอบด้วยคะแนนโหวต -3 ช่วยแก้ปัญหาได้ ฉันกำลังตั้งค่า Secure = true แต่ลืมไปว่าบน localhost ฉันแค่ใช้ http เพื่อทดสอบด้วย Noob ผิดพลาด ใช้secure=request.is_secureในขวด
Eloff
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.