IE8 теряет сеансовые куки во всплывающих окнах - PullRequest
35 голосов
/ 24 августа 2009

У нас есть приложение ASP.NET, которое использует Forms Auth. Когда пользователи входят в систему, генерируются файл cookie с идентификатором сеанса и билет проверки подлинности форм (сохраняются в виде файла cookie). Это сеансовые куки, а не постоянные куки. Это преднамеренно и желательно, чтобы, когда браузер закрывался, пользователь эффективно выходил из системы.

Как только пользователь входит в систему, открывается новое окно с помощью window.open('location here');. Открываемая страница фактически является рабочим пространством, в котором пользователь работает в течение оставшейся части сеанса. На этой странице также используются другие всплывающие окна.

В последнее время у нас было несколько клиентов (все использовали последние версии IE8), которые жаловались на то, что при входе в систему первоначальное всплывающее окно возвращает их на экран входа, а не на их домашнюю страницу. Альтернативно, пользователи могут иногда входить в систему, переходить на домашнюю страницу (которая снова находится в новом всплывающем окне), и все это выглядит нормально, пока не будут созданы какие-либо дополнительные всплывающие окна, где он начнет перенаправлять их на экран входа в систему. еще раз.

При попытке решить проблему я использовал старый добрый Fiddler. Когда проблема начинает проявляться, я заметил, что браузер не отправляет cookie-файл сеанса с идентификатором ASP.NET ИЛИ cookie-файл сеанса билета Autms, хотя ответ на вход в систему POST явно сбрасывает эти cookie.

Что еще более странно, если я нажму CTRL + N, чтобы открыть новое окно из всплывающего окна, в котором отсутствуют файлы cookie сеанса, а затем вручную введите URL-адрес домашней страницы, эти файлы волшебным образом появятся снова. Однако последующие вызовы window.open(); будут по-прежнему прерываться, не отправляя файлы cookie сеанса и не выводя пользователя на экран входа.

Важно отметить, что иногда, по-видимому, без веской причины, те же пользователи могут внезапно войти в систему и некоторое время нормально работать, а затем все возвращается в нерабочее состояние.

Теперь я убедился, что в браузере не работают надстройки, плагины, панели инструментов и т. Д. Я добавил наш сайт в качестве надежного сайта и сбросил параметры безопасности на Низкий, изменил политику конфиденциальности файлов cookie, чтобы «принимать все», и даже отключил автоматические параметры политики, заставив его вручную принимать все и включать сеансовые файлы cookie. Ничто не влияет на это.

Также обратите внимание, что веб-приложение находится на одном сервере. Балансировка нагрузки отсутствует, веб-сады, фермы серверов, кластеры и т. Д. Сервер находится за ISA-сервером, но в остальном он довольно прост.

Я искал несколько дней и не нашел ничего действенного. Черт, иногда я даже не могу воспроизвести это надежно. Я нашел несколько ссылок на людей, имеющих такую ​​же проблему, но они, похоже, ссылаются на проблему, которая, как утверждается, была исправлена ​​в бета-версии или выпуске RC (пример: IE8 теряет куки при открытии нового окна после перенаправления ). Это релизные версии IE с последними исправлениями.

Мне известно, что я могу попытаться установить постоянные куки вместо сеансовых куки. Однако это имеет серьезные последствия для безопасности нашего приложения.

Обновление

Кажется, что проблема автоматически исчезает, когда пользователь добавляется в систему в качестве локального администратора. Только время покажет, повлияет ли это изменение навсегда (и положительно) на эту проблему.

Время запустить ProcMon и посмотреть, есть ли проблема с доступом к ресурсам.

Обновление № 2

Кажется, существует множество точек зрения на то, что кажется особой проблемой. Я давно сообщал, что создание пользователя локальным администратором, похоже, помогло. И это было сделано для ряда пользователей. Конечно, это не совсем решение, но оно позволило нам сойти с ума.

Тогда больше пользователей начали сообщать о проблеме, и исправление администратора не помогало. Пользователи, похоже, были в основном Win7, но Vista тоже пострадала. Они также казались в основном 64-битными установками.

Установка TabProcGrowth в 0 или 1 (либо сработало), как предложили некоторые члены ниже, похоже, в значительной степени решает проблему. Итак, я собираюсь переместить мой принятый ответ первому человеку, который предложил это, поскольку он оказал значительно большее влияние.

Это была невероятно неприятная проблема, которую я пытался решить, поскольку ее трудно воспроизвести, и часто это происходит с пользователями, с которыми у меня нет прямой связи, или к тому времени, когда я к ним обращаюсь, это, кажется, за работой. Все, что я могу сказать, это что-то не так с функцией слияния сессий, но у меня нет много данных, чтобы отправить их в Microsoft, чтобы найти постоянное исправление.

Ответы [ 13 ]

0 голосов
/ 06 сентября 2013

Я столкнулся с аналогичной проблемой с использованием переменных сеанса для передачи значений во всплывающее окно. Я просто закончил записывать значения в постоянный файл cookie, а затем читал файл cookie во всплывающем окне. Это может не работать с проблемой, с которой вы столкнулись при проверке подлинности с помощью форм, но если вы просто используете переменные сеанса для передачи некоторых значений окну в IE8, постоянные файлы cookie, похоже, сработали.

изменить: см. Также эту тему

0 голосов
/ 31 мая 2013

Была похожая проблема с PHP5 и IE8. При открытии одного определенного всплывающего окна в Javascript с помощью window.open IE8 терял cookie сеанса и заставлял пользователя войти в систему agan.

Тем временем другие всплывающие окна работали нормально.

Виновником оказался тег изображения. Система шаблонов генерирует image src = values ​​динамически, а отсутствующее изображение приводит к тегу image с пустым предложением src (

Я предполагаю, что это как-то связано с тем, что IE интерпретирует пустой src-тег как небезопасный URL-адрес и изолирует сеанс во всплывающем окне без уведомления пользователя.

0 голосов
/ 26 мая 2010

У меня похожая, хотя и не идентичная проблема. Мы загружаем веб-страницу, которая открывает всплывающее окно с window.open() в элемент управления браузера IE. На машинах с IE6 и IE8 всплывающему окну всегда присваивается новый SessionID по ASP при запуске из элемента управления. Однако при запуске из обычного браузера (IE или Firefox) всплывающее окно получает существующий SessionID.

Я вижу при запуске из элемента управления, что новый процесс iexplore.exe порождается; таким образом, поведение потери сеанса имеет смысл, учитывая то, что было упомянуто о том, что файлы cookie в памяти не переносятся на новый процесс.

Я все еще пытаюсь найти обходной путь сам ...

Обновление

Разобрался с работоспособным исправлением! Можно создать подкласс SessionIDManager и указать, что этот класс следует использовать вместо значения по умолчанию (<sessionState sessionIDManagerType="..."> в Web.config ). Подкласс может искать параметр запроса, содержащий существующий идентификатор сеанса с переопределением CreateSessionID(), и возвращать его, если найден. По сути, это позволяет странице запрашивать «слияние» с существующим сеансом, о котором она знает.

Тогда для вызова window.open() просто необходим параметр запроса, указанный в его URL.

ограда Bin

...