Перенаправление сессии Asp.net на страницу входа - PullRequest
1 голос
/ 24 декабря 2008

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

sessionState mode="InProc"

Можно установить это в файле web.config?

Ответы [ 5 ]

4 голосов
/ 24 декабря 2008

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

Что я делаю, так это то, что у меня на странице зарегистрирован блок Javascript, который снова перенаправит пользователя на страницу входа после назначенного времени ожидания:

Page.ClientScript.RegisterStartupScript(Me.GetType, "TimeoutScript", 
"setTimeout(""top.location.href = '~/Login.aspx'""," &
 ConfigurationManager.AppSettings("SessionTimeoutMilliseconds") & ");", True)

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

Использование этого в сочетании с типичным событием Session_End в файле Global.asax делает довольно чистый способ обработки тайм-аутов сеансов в моих веб-приложениях.

2 голосов
/ 17 февраля 2009

Вроде позднего ответа, но, если вы используете стандартный поставщик членства asp.net, вы также можете использовать конфигурацию ниже.

Основной идеей для этого является одновременное истечение срока действия файла cookie аутентификации + сеанса. Автоматическое поведение asp.net будет возвращать вас на определенную страницу входа. Атрибут slideExpiration в куки-файле auth должен иметь значение true, чтобы продлить срок его службы во время сеанса.

<system.web>
  <sessionState mode="InProc" cookieless="false" timeout="20" />
  <authentication mode="Forms">
    <forms name=".SAMPLESITEAUTH" loginUrl="~/Login.aspx" protection="All" timeout="20" slidingExpiration="true" path="/" cookieless="UseCookies"></forms>
  </authentication>
</system.web>
1 голос
/ 24 декабря 2008

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

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

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

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

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

EDIT

В ответ на комментарий Ниже:

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

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

0 голосов
/ 13 ноября 2009

Bellow Answer - лучший пример, который когда-либо существовал ......

Лучше попробовать так:

Page.ClientScript.RegisterStartupScript(Me.GetType, "TimeoutScript", "setTimeout(""top.location.href = '~/Login.aspx'""," & ConfigurationManager.AppSettings("SessionTimeoutMilliseconds") & ");", True)

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

Использование этого в сочетании с типичным событием Session_End в файле Global.asax делает довольно чистый способ обработки тайм-аутов сеансов в моих веб-приложениях.

С уважением, Нагараджу Р || Dell PerotSystems ||

0 голосов
/ 17 февраля 2009

Можете ли вы присоединиться к событию Session_End в файле Global.asax?

...