2009-05-13 3 views
10

Я помещаю данные пользователя в сеанс, а затем передаю его в viewdata для просмотра на странице. Теперь, когда мой пользователь некоторое время уходит со своего компьютера, сеанс заканчивается, и данные, которые он вводил, теряются. (Это нормально) Проблема в том, что когда он возвращается, он обновляет экран, который моя страница все еще отображается, но все данные прошло. Таким образом,Завершение сеанса в ASP.net MVC

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

Благодаря

ответ

15

Я использую некоторые Javascript в моем MasterPage переадресовать пользователь (после приглашения возобновить сеанс) к действию выхода из системы. Он использует запрос AJAX на домашнюю страницу приложения, чтобы обновить окно сеанса на стороне сервера, когда пользователь нажимает кнопку в диалоговом окне, чтобы продлить сеанс. Опирается на jQuery и пользовательский интерфейс jQuery для диалога.

<% if (this.Request.IsAuthenticated) 
    { 
     int sessionDialogWait = 2 * 60 * 1000 - 60 * 500; // ms = 1.5 minutes 
     int sessionTimeout = 28 * 60 * 1000; // ms = 28 minutes 
     if (ViewData["sessionTimeout"] != null) 
     { 
      sessionTimeout = ((int)ViewData["sessionTimeout"] * 60 - 120) * 1000; 
     } 
%> 
<script type="text/javascript"> 
    var logoutTimer = null; 
    var sessionTimer = null; 
    var sessionTimeout = Number('<%= sessionTimeout %>'); 
    var sessionDialogWait = Number('<%= sessionDialogWait %>'); 

    $(document).ready(function() { 
     $('#sessionEndDialog').dialog({ 
      autoOpen: false, 
      bgiframe: true, 
      modal: true, 
      buttons: { 
       OK: function() { 
        $(this).dialog('close'); 
        $.get('<%= Url.Action("About", "Home") %>', scheduleSessionPrompt, 'html'); 
       }, 
       Logout: logoutOnSessionExpires 
      } 
     }).ajaxStart(function() { scheduleSessionPrompt(); }); 
     scheduleSessionPrompt(); 
    }); 

    function scheduleSessionPrompt() 
    { 
     if (logoutTimer) clearTimeout(logoutTimer); 
     if (sessionTimer) clearTimeout(sessionTimer); 

     sessionTimer = setTimeout(sessionExpiring, sessionTimeout ); 
    } 

    function sessionExpiring() 
    { 
     logoutTimer = setTimeout(logoutOnSessionExpires, sessionDialogWait); 
     $('#sessionEndDialog').dialog('open'); 
    } 

    function logoutOnSessionExpires() 
    { 
     window.location.href = '<%= Url.Action("Logout", "Account") %>'; 
    }  

    </script> 
<% } %> 

<div id="sessionEndDialog" title="Session Expiring" style="display: none;"> 
    <p>Your session is about to expire. Click OK to renew your session or Logout to logout of the application.</p> 
</div> 
+0

Можно ли использовать Session_End в Global.asax? –

+0

Я не вижу, как вы перенаправляете браузер на другую страницу из события Session_End, если браузер не периодически проверяет, жив ли сеанс. К сожалению, если браузер сделает это, это будет искусственно поддерживать сеанс, так как он будет обновляться по каждому запросу. Я работаю над превращением этого в плагин jQuery. – tvanfosson

+0

Исправьте меня, если я ошибаюсь, но Session_End работает в фоновом потоке и как таковой не может общаться с пользователем. любите свою работу tvanfosson, ваш подход работает очень хорошо – CodeKiwi

6

Я предполагаю, что вы аутентификации пользователя в некотором роде, но вы используете проверки подлинности форм ?:

ASP.Net MVC Framework - Using Forms Authentication

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

+0

Да, я использую проект MVC по умолчанию в качестве базы. –

+0

YUK! Я ненавижу, когда сайты выходят из системы все время. Подумайте внимательно, прежде чем реализовать это или нет. Характер вашего сайта будет решающим фактором курса :) –

0

Данные могут быть на странице, потому что браузер кэширует его.

Попробуйте бросать это и увидеть, если данные все еще там после того, как сеанс мертв:

<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE"> 
5

меня была та же проблема со старым приложением ASP.net. Сеанс истекает, но пользователь все еще аутентифицирован, поскольку файлы cookie сеанса и аутентификации различны и не обязательно истекают одновременно. То, что я тогда делал, было использование global.asax Session_Start для проверки подлинности пользователя и выхода из системы.

protected void Session_Start(Object sender, EventArgs e) 
    { 
     if (User.Identity.IsAuthenticated) 
     { 
      FormsAuthentication.SignOut(); 
      Response.Redirect("~/SessionEnd.aspx"); 
     } 
    } 

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

+0

Является ли время ожидания сеанса функцией веб-сервера? (IIS6) Может ли он быть изменен только там, на панели управления? –

+0

Я пробовал этот код, он вышел из системы, но Response.Redirect не взял меня на мою страницу. –

+0

Вы можете изменить срок действия сеанса на своем web.config или программно использовать сеанс.Тайм-аут = x; Если вы выйдете из системы, вы можете перейти только на страницу входа или страницу, которая не защищена аутентификацией. –

Смежные вопросы