IE 8 и 9 не отправляет cookie при следующем запросе. Он работает в Chrome 14 и FF 6.
В моем случае у меня работает веб-приложение ASP.NET 3.5, которое использует файлы cookie для аутентификации. Если cookie отсутствует, пользователь перенаправляется на страницу входа.
Инфраструктура следующая. Родительское приложение встраивает мою страницу ASP.NET в iframe. Приложение ASP.NET нацелено не напрямую, а через балансировщик нагрузки. Между родительской страницей и балансировщиком нагрузки используется HTTPS-соединение. Балансировщик нагрузки сам переходит через другой прокси-сервер IIS к фактическому приложению ASP.NET, но это соединение выполняется через стандартный HTTP. Родительское приложение и приложение ASP.NET не работают в одном домене.
Файл cookie помечен как «Только HTTP». Джефф Этвуд хорошо Сообщение блога о файлах cookie «только HTTP», но все же не говорится, отправляются ли файлы cookie через HTTP.
После входа на страницу ASP.NET ответ будет содержать файл cookie и перенаправление. Когда браузер выполняет перенаправление, cookie не включается в запрос. Вот почему приложение ASP.NET принимает нового пользователя и снова перенаправляет на страницу входа.
Итак, мой вопрос здесь, я думаю, почему IE не отправляет cookie. Это потому, что файл cookie помечен как «только HTTP»? Если это так, может ли кто-нибудь сказать мне, как отключить эту функцию ASP.NET? в форумы это сказано, что вы не можете выключить это. Но я нашел своего рода неуклюжий способ отключить его, которого я бы по возможности избегал.
Кстати, он отлично работает, если я добавлю URL-адрес ASP.NET к надежным сайтам. Мне нужно избегать этого любым способом.
ОБНОВЛЕНИЕ 1: Достаточно интересно, если я перейду прямо к балансировщику нагрузки через HTTPS, который находится перед страницей ASP.NET, cookie будет правильно отправлен в балансировщик нагрузки. Файлы cookie не отправляются, только если сайт находится в iframe на родительской странице, который содержит недопустимый сертификат.
ОБНОВЛЕНИЕ 2: Чтобы проиллюстрировать сценарий, я добавил 2 картинки с описанием архитектуры. Первый объясняет среду, а второй показывает процесс двух запросов, сделанных IFrame. Ответ на первый запрос содержит 2 куки. Следующий запрос к тому же приложению не включает файлы cookie. Однако файлы cookie будут отправлены, если я либо а) добавлю балансировщик нагрузки (и приложение ASP.NET в конце) к доверенным сайтам, либо б) перейду прямо к балансировщику нагрузки (и приложению ASP.NET в конце) в браузере, а не через родительскую страницу, на которой размещен IFrame. Извините, я хотел бы добавить фотографии, но у меня нет 10 повторений, поэтому Serverfault не позволяет мне ...
ОБНОВЛЕНИЕ 3: Родительская страница и страница ASP.NET размещаются в разных доменах. Пример: - Родительская страница yourapp.com - Страница ASP.NET, размещенная в iframe: myapp.com
Оказывается, IE не отправляет cookie в междоменном сценарии через HTTPS.
Чтобы решить эту проблему, мне пришлось добавить собственный заголовок P3P. У Скотта Хансельмана есть интересный статья по этой теме.
В сценарии ASP.NET вы можете добавить настраиваемый заголовок через IIS или в свое приложение в Global.asax. Вот это объяснение.
Это потому, что cookie помечен только как HTTP. IE предполагает, что файл cookie только для HTTP должен быть отправлен обратно точно в тот источник, из которого он пришел. Он не считает источники HTTPS и HTTP эквивалентами. Возможно, это более логично - если я получил файл cookie только HTTP через безопасное соединение, зачем мне отправлять его через небезопасное соединение?
Есть обходной путь - не устанавливайте куки HTTP только на странице HTTPS. Вместо этого на перенаправленной HTTP-странице снова установите cookie, но на этот раз только HTTP. Это должно решить проблему.
(Просто для усмешки дважды проверьте, что URL ссылается на точный то же имя хоста. Не перенаправлять www.mydomain.com
к mydomain.com
например.)