Сеансовые куки ASP.net потеряны или удалены

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

  • Проблема на 100% повторяема на более старом моем ноутбуке при выполнении IE7 и ноутбука менеджера проектов при выполнении IE7. Проблема никогда не происходит на моем текущем ноутбуке, выполняющем IE7 или любой из этих ноутбуков при выполнении И следующие.
  • Проблема происходит только в производстве - не на разработке, внутренней подготовке или клиенте, подготавливающем. Производство является сбалансированной средой единственной загрузки, но воспроизводимость, отмеченная выше, делает меня выравниванием нагрузки вопроса как фактор.
  • Когда страница, которая устанавливает Сессию ("идентификатор") = 1, передает ответ обратно клиенту, я вижу заголовок "Cookie Набора" во всех случаях, который создает cookie asp Net_Session_Id (и это - HttpOnly).
  • Последующие запросы к серверу отправят тот cookie в заголовке на машинах, которые не показывают проблему, но не на машинах, которые являются, таким образом, или cookie становится удаленным или заголовок "Cookie Набора", игнорируется.
  • Способ войти в систему работы следующие: страница на www.DomainX.com имеет iframe. Источником которого iframe является страницей на login.DomainY.com. Разнообразие страниц, подаваемых из login.DomainY.com, берет пользователя посредством процесса входа в систему/регистра. Заключительный шаг login.DomainY.com должен перенаправить к странице назад на www.DomainX.com, включая идентификатор пользователя в querystring. Эта страница на www.DomainX.com обычно хранит идентификатор на сессии и затем выполняет некоторый JS для перенаправления высокоуровневого документа новой странице, таким образом вынимая пользователя из iframe. Это - процесс, который работал в течение нескольких лет с несколькими значениями DomainX.com. Одна вещь, которая может отличаться здесь, состоит в том, что в этом случае, JS просто уничтожает iframe и немного содержащие отделение.
  • Другое различие, которое я вижу между сценариями, где проблема происходит и где это не делает, находится в 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).
  • Производство является единственной средой, куда login.DomainY.com работает под SSL, таким образом, я думал, что это может быть связано. Но мы временно настраиваем нашу копию подготовки login.DomainY.com для использования SSL, и это не имело никакого эффекта.

Какие-либо идеи, что могло вызвать это?

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

7
задан Joel 5 February 2010 в 17:06
поделиться

3 ответа

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

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

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

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

4
ответ дан 7 December 2019 в 14:32
поделиться

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

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

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

0
ответ дан 7 December 2019 в 14:32
поделиться

Yanking "внешние ссылки" из вспышки может быть так же просто, как, например:

curl -s http://hostname/path/to/file.swf | strings | grep http

Конечно, это не удастся, если автор предпринял какую-либо попытку скрыть URL.

YMMV много. Удачи!

-121--2164245-

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

instance.method ();

совпадает с

Class.method ();

-121--2789836-

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

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

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

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

0
ответ дан 7 December 2019 в 14:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: