Есть ли проблемы с отправкой файла cookie во время перенаправления 302? Например, если я создаю файл cookie с возвратом к URL и перенаправляю пользователя в том же ответе, будет ли какой-либо (современный) браузер игнорировать этот файл cookie?
http
cookies
http-status-code-302
Абдулла Джибали
источник
источник
Ответы:
Большинство браузеров принимают файлы cookie на 302 редиректах. Я был в этом вполне уверен, но немного поискал. Не все современные браузеры. Интернет-архив Ссылка из теперь удаленного / мертвого / microsoft connect Q / A на Silverlight Client HTTP Stack игнорирует 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).
источник
Это действительно неодобрительный подход, но если вы действительно не хотите полагаться на поведение браузера 30x set-cookie, вы можете использовать
meta http-equiv="refresh"
«перенаправление» HTML при установке 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 (или любой другой поставщик oauth, который вы используете). Следовательно, если вы установите samesite = strict cookie в своем ответе 302, тогда браузер, вероятно, подумает: «Ага! Это межсайтовый запрос, поступающий от Google на ваш сайт», и, следовательно, не отправляет cookie при запросе перенаправленного URL-адреса. Исправление состоит в том, чтобы использовать мета-обновление, как вы это сделали, поэтому ваш запрос поступает с вашего собственного сайта. Я мог бы говорить чушь, но сейчас я так думаю.Обнаружена эта проблема при использовании OpenIdConnect / IdentityServer в .Net, где отдельный API (другое имя хоста) обрабатывает аутентификацию и перенаправляет обратно на основной сайт.
Во-первых (для разработки на localhost) вам нужно установить
CookieSecure
опциюSameAsRequest
илиNever
иметь дело сhttp://localhost/
небезопасным. См. Ответ Майкла Фрейджейма .Во-вторых, вам необходимо установить для
CookieSameSite
атрибута значениеLax
, иначе файлы cookie вообще не сохранятся.Strict
здесь не работает!источник
В моем случае я установил CookieOptions.Secure = true, но протестировал его на http: // localhost ., И браузер скрывает файлы cookie в соответствии с настройкой.
Чтобы избежать такой проблемы, вы можете сделать опцию cookie Secure для соответствия протоколу Request.IsHttps, например
источник
Set-Cookie
заголовками на 302 редиректах.secure=request.is_secure
в колбе.