Отключение обновления сеанса ASP.NET для конкретного запроса - PullRequest
2 голосов
/ 16 сентября 2011

У нас есть веб-сайт с 20-минутным тайм-аутом, и наши пользователи хотят 10-минутное предупреждение об окончании сеанса. На данный момент мы используем элемент управления, который вроде выполняет свою работу, но он не поддерживает AJAX и всплывает, даже если пользователь что-то делал.

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

Возможно ли это, или я поступаю неправильно?

Ответы [ 6 ]

0 голосов
/ 15 июля 2016

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

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

Создайте веб-службу (.ashx или что-то еще), которая НЕ использует состояние сеанса, но в идеале аутентифицируется с использованием проверки подлинности с помощью форм или какой-либо другой схемы проверки подлинности.Ваш javascript, который отсчитывает время до истечения сеанса, вызовет этот веб-сервис незадолго до истечения сеанса, чтобы узнать, действительно ли истекает срок сеанса.

Я думаю, что веб-сервис должен вернуть что-то простое, например 2, если сессия истекла, 1, если сессия вот-вот истечет, или 0, если нет.Вернуть случайное значение [0,1,2], если служба вызывается пользователем с неизвестным или недействительным файлом cookie SessionId - мы надеемся, что это предотвратит обнаружение действительного sessionId злоумышленником, получившим файл cookie Forms Auth.

Iисследовал декомпиляцию встроенного SessionProvider, чтобы посмотреть, смогу ли я получить доступ к сеансу, чтобы обнаружить истечение срока действия без запуска обновления.Но это зависит от типа используемого поставщика сеансов, поэтому, если вы когда-нибудь перейдете, скажем, от поставщика сеансов SQL Server к Redis, вам придется переписать его.

0 голосов
/ 17 сентября 2011

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

0 голосов
/ 17 сентября 2011

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

Альтернативой является просто загрузка страницы JavaScript с помощью SetTimeout.

0 голосов
/ 16 сентября 2011

как насчет ДВУХ веб-приложений, обращающихся к одной и той же базе данных?в первом, главном приложении вы записываете время последнего доступа к базе данных, а второе приложение опрашивается через ajax, чтобы получить неактивную базу времени в последний раз доступа ...

0 голосов
/ 16 сентября 2011

Я думаю, что единственный надежный способ сделать это - изменить ваш ajax javascript, чтобы увеличить время ожидания существующего сценария.

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

В любом случае вам придется вносить обширные изменения в ваше приложение.

0 голосов
/ 16 сентября 2011

Если ваш сеанс имеет фиксированный 20-минутный срок действия, он не будет продлен при обновлении страницы.Однако, если вы хотите, чтобы на вашей странице был скрипт для оповещения пользователей об окончании срока их сессии, вам нужно установить скрипт на стороне клиента (предположить Javascript) и запустить его при загрузке страницы?

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