Завершение сеанса в ASP.net MVC

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

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

Спасибо

Ответ 1

Я использую 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>

Ответ 2

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

ASP.Net MVC Framework - использование проверки подлинности с помощью форм

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

Ответ 3

У меня была та же проблема со старым 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");
        }
    }

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

Ответ 4

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

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

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