Сеанс cookie ASP.net потерян или удален - PullRequest
7 голосов
/ 05 февраля 2010

У меня есть сайт ASP.NET 2.0, в котором в сеансе хранится идентификатор пользователя, указывающий, что он вошел в систему. В некоторых ситуациях пользователь не остается в системе. Я отслеживал трафик в Fiddler, и некоторые детали, которые я нашел:

  • Проблема на 100% повторяется на моем старом ноутбуке при работе IE7 и ноутбуке менеджера проекта при работе IE7. Проблема никогда не возникает на моем текущем ноутбуке с IE7 или любом из этих ноутбуков при работе с FF.
  • Проблема возникает только на производстве, а не на стадии разработки, внутренней подготовки или подготовки клиента. Производство является единственной средой с балансировкой нагрузки, но отмеченная выше повторяемость ставит меня под вопрос балансировки нагрузки как фактор.
  • Когда страница, которая устанавливает Session («ID») = 1, отправляет ответ клиенту, во всех случаях я вижу заголовок «Set-Cookie», который создает файл cookie ASP.Net_Session_Id (и это HttpOnly ).
  • Последующие запросы к серверу будут отправлять этот файл cookie в заголовок на компьютерах, на которых проблема не обнаружена, но не на компьютерах, на которых это происходит, поэтому либо файл cookie удаляется, либо заголовок «Set-Cookie» игнорируется.
  • Способ входа в систему работает следующим образом: на странице www.DomainX.com имеется iframe. Источником этого iframe является страница на login.DomainY.com. Разнообразные страницы, обслуживаемые с сайта login.DomainY.com, проводят пользователя через процесс входа в систему / регистрации. Последний шаг login.DomainY.com - перенаправление на страницу назад на www.DomainX.com, включая идентификатор пользователя в строке запроса. Эта страница на www.DomainX.com обычно хранит идентификатор в сеансе, а затем запускает JS, чтобы перенаправить документ верхнего уровня на новую страницу, тем самым выводя пользователя из iframe. Это процесс, который работал в течение нескольких лет, с несколькими значениями DomainX.com. Единственное, что здесь может отличаться, это то, что в этом случае JS просто уничтожает iframe и некоторые содержащие div.
  • Еще одно различие, которое я вижу между сценариями, где возникает проблема, а где нет, заключается в файлах cookie Google Analytics. Существует разница, когда login.DomainY.com/FinalStep.aspx выполняет перенаправление на сайт www.DomainX.com/SaveTheID.aspx внутри iframe. Если проблема не возникает, запрос SaveTheID.aspx включает в себя различные файлы cookie Google Analytics (__utma, __utmz и т. Д.). Когда проблема возникает, этот запрос не включает все файлы cookie GA (в нем отсутствуют __utma, __utmz и __utmb).
  • Production - единственная среда, в которой login.DomainY.com работает по SSL, поэтому я подумал, что это может быть связано. Но мы временно настроили нашу промежуточную копию login.DomainY.com для использования SSL, и это не имело никакого эффекта.

Есть идеи, что может вызвать это?

Редактировать: производственная среда имеет домены www.DomainX.com и DomainX.com. Существует еще одна известная проблема, связанная с тем, что файлы cookie не установлены для обоих этих доменов. Возможно, это связано, но я не смогу протестировать, пока это исправление не перейдет в prod.

Ответы [ 3 ]

4 голосов
/ 06 февраля 2010

Вы захотите взглянуть на своего поставщика состояния сеанса, чтобы увидеть, будет ли он работать на двух серверах / экземплярах приложения .net. Например, если для них установлено значение inProc, вы наверняка столкнетесь с этой проблемой, поскольку каждый сеанс будет привязан к потоку, в котором он был создан. Вместо этого вы хотите абстрагировать это либо в службу состояний asp.net, к которой могут обращаться обе машины, либо, что еще лучше, вы должны использовать решение распределенного кэширования, такое как проект Microsoft Velocity, который будет распределять сеансы между двумя компьютерами в случае отказа одного из них.

Некоторые другие способы решения этой проблемы - использовать липкие сеансы на балансировщике нагрузки (не рекомендуется) или переходить на сеанс без файлов cookie, который будет работать, но может вызвать некоторые головные боли в вашем коде.

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

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

0 голосов
/ 08 февраля 2010

Стреляй, я, должно быть, потерял куки и способность отвечать и редактировать ...

Я немного исследовал балансировщик нагрузки как проблему, изменив файл hosts так, чтобы он указывал прямо на IP-адреса каждого из веб-серверов, и это не имело никакого эффекта. Я думаю, что ИТ-персонал клиента не согласится с просьбой отключить балансировку нагрузки.

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

Как лейкопластырь, я сейчас проверяю другие механизмы персистенции ...

0 голосов
/ 07 февраля 2010

Я думаю, что Middletone прав, за исключением того, что он не объясняет, почему проблему нельзя воспроизвести с помощью Firefox. Балансировщик нагрузки является подозреваемым № 1; Было бы хорошо узнать, есть ли у него алиби, отключив все серверы приложений, кроме одного (если это возможно, и в то время, когда он может справиться с нагрузкой), и посмотреть, существует ли проблема до сих пор. Если это так, это не балансировщик нагрузки, и вы можете начать искать в другом месте. Если нет, то это балансировщик нагрузки.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...