Есть ли проблемы с отправкой файла cookie во время перенаправления 302? Например, если я создам файл cookie с возвратом к URL-адресу и перенаправлю пользователя в том же ответе, будет ли любой (современный) браузер игнорировать файл cookie?
Отправка файлов cookie браузера во время переадресации 302
Ответы (8)
Большинство браузеров принимают файлы cookie при переадресации 302. Я был в этом совершенно уверен, но немного поискал. Не все современные браузеры. Интернет-архив Ссылка из уже удаленного/мертвого/ microsoft connect Вопросы и ответы по HTTP-стеку клиента Silverlight игнорирует Set-Cookie on 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 редиректов.
Как отметил @Benni:
https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies
Атрибут SameSite файла cookie указывает, должен ли файл cookie быть ограничен собственным контекстом или контекстом того же сайта. Допускается несколько значений SameSite:
- Файл cookie с
"SameSite=Strict"
будет отправлен только с запросом того же сайта.- Файл cookie с
"SameSite=Lax"
будет отправлен с запросом на тот же сайт или с навигацией на верхнем уровне между сайтами с помощью безопасного метода HTTP.- Файл cookie с
"SameSite=None"
будет отправлен как с запросами на одном сайте, так и с запросами между сайтами.
Одно уведомление (для спасения жизни разработчика):
IE и Edge игнорируют Set-Cookie в ответе перенаправления, когда доменом файла cookie является localhost.
Решение:
Используйте 127.0.0.1 вместо localhost.
здесь ошибка Chromium для этой проблемы (Set-cookie игнорируется для ответа HTTP со статусом 302).
Это действительно неодобрительный подход, но если вы действительно не хотите полагаться на поведение браузера с 30-кратным набором файлов 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:
- Поставщик идентификатора OAuth2 (GitHub, Twitter, Google) перенаправляет браузер обратно в ваше приложение.
- URL-адрес обратного вызова вашего приложения проверяет авторизацию и устанавливает файлы cookie для входа, а затем снова перенаправляет на целевой URL-адрес.
- Ваш целевой URL загружается без каких-либо файлов cookie.
По причинам, которые я еще не выяснил, некоторые файлы cookie из запроса 2 игнорируются, а другие нет. Однако, если запрос 2 возвращает HTTP 200 с заголовком Refresh
(перенаправление метаобновления), файлы cookie устанавливаются правильно запросом 3.
samesite=strict
. Для запроса обратного вызова браузер по-прежнему считает, что отправителем является Google (или любой другой провайдер oauth, который вы используете). Следовательно, если вы установите файл cookie samesite=strict в своем ответе 302, браузер, вероятно, подумает: ах-ха! это межсайтовый запрос, поступающий от Google на ваш сайт, и, следовательно, не отправляет файл cookie при запросе перенаправленного URL-адреса. Исправление состоит в том, чтобы использовать мета-обновление, как вы это сделали, чтобы ваш запрос исходил с вашего собственного сайта. Я мог бы говорить чушь, но это мое текущее мышление.
- person Ilan; 20.09.2020
Столкнулся с этой проблемой при использовании OpenIdConnect/IdentityServer в .Net, где отдельный API (другое имя хоста) обрабатывает аутентификацию и перенаправляет обратно на основной сайт.
Сначала (для разработки на локальном хосте) вам нужно установить для параметра CookieSecure
значение SameAsRequest
или Never
, чтобы иметь дело с http://localhost/
небезопасным. См. ответ Майкла Фрейдгейма.
Во-вторых, вам нужно установить для атрибута CookieSameSite
значение Lax
, иначе файлы cookie вообще не будут сохраняться. Strict
здесь не работает!
В моем случае я установил CookieOptions.Secure=true, но протестировано на http://localhost, и браузер скрывает файлы cookie в соответствии с настройка.
Чтобы избежать такой проблемы, вы можете сделать cookie безопасным, чтобы он соответствовал протоколу Request.IsHttps, например.
new CookieOptions()
{
Path = "/",
HttpOnly = true,
Secure = Request.IsHttps,
Expires = expires
}
Set-Cookie
при переадресации 302.
- person Martijn Pieters; 26.01.2019
secure=request.is_secure
в колбе.
- person Eloff; 22.05.2020