Чи є проблеми із відправленням файлу cookie під час переадресації 302? Наприклад, якщо я створив файл cookie з поверненням до URL-адреси та перенаправив користувача в тій самій відповіді, чи буде будь-який (сучасний) браузер ігнорувати файл cookie?
Чи є проблеми із відправленням файлу cookie під час переадресації 302? Наприклад, якщо я створив файл cookie з поверненням до URL-адреси та перенаправив користувача в тій самій відповіді, чи буде будь-який (сучасний) браузер ігнорувати файл cookie?
Відповіді:
Більшість браузерів приймають файли cookie з 302 переспрямуваннями. Я був у цьому повністю впевнений, але трохи зробив пошук. Не всі сучасні браузери. Інтернет-архів Посилання з видаленого / мертвого / microsoft connect запитання / відповідь на HTTP-стеку клієнта Silverlight ігнорує Set-Cookie на 302 переадресаційних відгуках (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, встановлює файли cookie для переспрямувань. Це справедливо як для перенаправлення 301, так і для 302.
Одне повідомлення (щоб врятувати життя розробника):
IE та Edge ігнорують Set-Cookie у відповіді на переадресацію, коли домен cookie є localhost .
Рішення:
Використовуйте 127.0.0.1 замість localhost .
Ось помилка Chromium для цієї проблеми (Set-cookie ігнорується для відповіді HTTP зі статусом 302).
Це справді з наріканням на підхід, але якщо ви дійсно хочете не покладатися на 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>
Посилання запасний варіант у разі , якщо браузер не виконує оновлення метаданих.
Я просто зіткнувся з цією проблемою як з Firefox, так і з Safari, але не з Chrome. З мого тестування це відбувається лише тоді, коли домен змінюється під час перенаправлення. Це характерно для потоку OAuth2:
З причин, які я ще не з’ясував, деякі файли cookie із запиту 2 ігноруються, а інші - ні. Однак якщо запит 2 повертає HTTP 200 із Refresh
заголовком (перенаправлення "метаоновлення"), файли cookie встановлюються належним чином за запитом 3.
samesite=strict
. Для запиту зворотного дзвінка браузер все ще вважає, що ініціатором є Google (або незалежно від того, якого постачальника послуг автентичності ви використовуєте). Отже, якщо ви встановите в своїй відповіді 302 файл cookie samesite = strict, тоді браузер, ймовірно, вважає "а-а-а! Це міжсайтовий запит, що надходить від Google на ваш сайт", а отже, не надсилає файл cookie при запиті перенаправленої URL-адреси. Виправлення полягає у використанні мета-оновлення, як ви робили, тому ваш запит надходить із вашого власного сайту. Я міг би говорити лайно, але це моє поточне мислення.
Виникла ця проблема під час використання OpenIdConnect / IdentityServer у .Net, де окремий API (інше ім’я хосту) обробляє автентифікацію та перенаправляє назад на основний сайт.
Спочатку (для розробки на localhost) вам потрібно встановити CookieSecure
опцію SameAsRequest
або Never
впоратися з тим, що http://localhost/
не в безпеці. Дивіться відповідь Майкла Фрейдгайма .
По-друге, вам потрібно встановити CookieSameSite
атрибут Lax
, інакше файли cookie взагалі не зберігаються. Strict
тут не працює!
У моєму випадку я встановив CookieOptions.Secure = true, але протестував його на http: // localhost . І браузер приховав файли cookie відповідно до налаштувань.
Щоб уникнути такої проблеми, ви можете зробити захищений файл cookie відповідно до запиту протоколу
new CookieOptions()
{
Path = "/",
HttpOnly = true,
Secure = Request.IsHttps,
Expires = expires
}
Set-Cookie
заголовками на 302 переспрямуваннях.
secure=request.is_secure
в колбі.