Надсилання файлів cookie браузера під час переспрямування 302


86

Чи є проблеми із відправленням файлу cookie під час переадресації 302? Наприклад, якщо я створив файл cookie з поверненням до URL-адреси та перенаправив користувача в тій самій відповіді, чи буде будь-який (сучасний) браузер ігнорувати файл cookie?


Почитавши трохи, я думаю, що змінні сеансу були б кращими, ніж файли cookie, оскільки вони на стороні сервера і не залежать від передбачуваності клієнта.
ADTC

Відповіді:


40

Більшість браузерів приймають файли cookie з 302 переспрямуваннями. Я був у цьому повністю впевнений, але трохи зробив пошук. Не всі сучасні браузери. Інтернет-архів Посилання з видаленого / мертвого / microsoft connect запитання / відповідь на HTTP-стеку клієнта Silverlight ігнорує Set-Cookie на 302 переадресаційних відгуках (2010)

Я думаю, що зараз у нас є заміна IE6, і це браузери Windows Mobile ...


1
Зазначена вами сторінка форуму не може бути доступною за допомогою URL-адреси. Ви маєте на увазі, що браузери IE6 та Windows Mobile не є?
хіроші

1
посилання переміщено. Я встановив нове посилання з однаковим вмістом. і я мав на увазі, що конкретні версії IE для мобільних пристроїв додають власний набір помилок
regilero

51

Відповідно до цього повідомлення в блозі: 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, встановлює файли cookie для переспрямувань. Це справедливо як для перенаправлення 301, так і для 302.


На жаль, цей список не включає Chrome, тому ми не можемо точно сказати всі основні браузери ...
MestreLion

3
@MestreLion: у моєму браузері Chrome це працює. Отже .. Я думаю, ми можемо сказати, що це нарешті спрацює зараз, у 2019 році.
Майкл,

40

Одне повідомлення (щоб врятувати життя розробника):

IE та Edge ігнорують Set-Cookie у відповіді на переадресацію, коли домен cookie є localhost .

Рішення:

Використовуйте 127.0.0.1 замість localhost .


11
Можливо, IE та Edge це "виправили", тому вони також не встановлюватимуть файли cookie для 127.0.0.1. Дох! І вони дивуються, чому розробники не всі люблять IE ... Ваша відповідь все-таки закінчилася приблизно 4 години для мене. Дякую!
GlenPeterson

18

Ось помилка Chromium для цієї проблеми (Set-cookie ігнорується для відповіді HTTP зі статусом 302).


1
Якщо це правда, це справді погані новини :-(
MestreLion

Думаю, це виправили. У звіті про помилку все ще написано "WontFix", але в моєму браузері Chrome це працює.
Майкл

@Michael зауважте, що Chromium - це не Chrome: lifewire.com/chromium-and-chrome-differences-4172101 - це означає, що хоча це може працювати в Chrome, що не обов'язково стосується Chromium
Томас

3

Це справді з наріканням на підхід, але якщо ви дійсно хочете не покладатися на 30-кратну поведінку браузера set-cookie, ви можете використовувати HTML- meta http-equiv="refresh"перенаправлення при встановленні файлу cookie. Наприклад, у 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, тому браузер збереже cookie, а потім виконає "перенаправлення". <a>Посилання запасний варіант у разі , якщо браузер не виконує оновлення метаданих.


1

Я просто зіткнувся з цією проблемою як з Firefox, так і з Safari, але не з Chrome. З мого тестування це відбувається лише тоді, коли домен змінюється під час перенаправлення. Це характерно для потоку OAuth2:

  1. Постачальник ідентифікаторів OAuth2 (GitHub, Twitter, Google) перенаправляє браузер назад у ваш додаток
  2. URL-адреса зворотного дзвінка вашого додатка підтверджує авторизацію та встановлює файли cookie для входу, а потім знову перенаправляє на цільову URL-адресу
  3. Ваша цільова URL-адреса завантажується без встановлених файлів cookie.

З причин, які я ще не з’ясував, деякі файли cookie із запиту 2 ігноруються, а інші - ні. Однак якщо запит 2 повертає HTTP 200 із Refreshзаголовком (перенаправлення "метаоновлення"), файли cookie встановлюються належним чином за запитом 3.


Я підозрюю, що причина цих проблем із зворотним викликом wrt oauth є samesite=strict. Для запиту зворотного дзвінка браузер все ще вважає, що ініціатором є Google (або незалежно від того, якого постачальника послуг автентичності ви використовуєте). Отже, якщо ви встановите в своїй відповіді 302 файл cookie samesite = strict, тоді браузер, ймовірно, вважає "а-а-а! Це міжсайтовий запит, що надходить від Google на ваш сайт", а отже, не надсилає файл cookie при запиті перенаправленої URL-адреси. Виправлення полягає у використанні мета-оновлення, як ви робили, тому ваш запит надходить із вашого власного сайту. Я міг би говорити лайно, але це моє поточне мислення.
Ілан,

1

Виникла ця проблема під час використання OpenIdConnect / IdentityServer у .Net, де окремий API (інше ім’я хосту) обробляє автентифікацію та перенаправляє назад на основний сайт.

Спочатку (для розробки на localhost) вам потрібно встановити CookieSecureопцію SameAsRequestабо Neverвпоратися з тим, що http://localhost/не в безпеці. Дивіться відповідь Майкла Фрейдгайма .

По-друге, вам потрібно встановити CookieSameSiteатрибут Lax, інакше файли cookie взагалі не зберігаються. Strictтут не працює!


-1

У моєму випадку я встановив CookieOptions.Secure = true, але протестував його на http: // localhost . І браузер приховав файли cookie відповідно до налаштувань.

Щоб уникнути такої проблеми, ви можете зробити захищений файл cookie відповідно до запиту протоколу

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

2
У цьому випадку не встановлюйте захищений прапор . Вся суть прапора полягає в тому, щоб сказати браузеру використовувати файл cookie лише під час підключення через HTTPS. Умовно встановлення прапора дещо змінює семантику, і ви втрачаєте файл cookie, переходячи з HTTPS -> HTTP, але не під час переходу з HTTP -> HTTPS. Все це ортогонально тому, що браузери роблять із Set-Cookieзаголовками на 302 переспрямуваннях.
Мартін Пітерс

1
Той час, коли відповідь -3 голосами вирішує проблему. Я встановлював Secure = true, але забув, що на localhost я просто використовую http для тестування. Помилка нуба. Використовувати secure=request.is_secureв колбі.
Елофф
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.