ASP.net MVC中的会话结束

时间:2009-05-13 17:32:19

标签: .net asp.net-mvc

我将用户数据放在会话中,然后将其传递给viewdata以在页面上查看。现在,当我的用户离开他的电脑一段时间后,会话结束,他输入的数据丢失。(没关系)问题是,当他返回时刷新屏幕我的页面仍在显示,但所有数据都是不见了。所以,

如何在会话到期时将用户重定向到登录屏幕(因此他没有看到空白页面)或者我想将其重定向到一个页面,其中说明“由于不活动而您已登出”。< / p>

由于

4 个答案:

答案 0 :(得分:15)

我在MasterPage中使用一些Javascript将用户(在提示更新会话后)重定向到注销操作。当用户单击对话框中的按钮以扩展会话时,它使用AJAX请求返回应用程序的主页以刷新服务器端会话窗口。依赖jQuery和jQuery UI进行对话。

 <% 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>

答案 1 :(得分:6)

我假设您以某种方式对用户进行身份验证,但您使用的是表单身份验证吗?:

ASP.Net MVC Framework - Using Forms Authentication

如果您已经在使用表单身份验证,则需要确保身份验证Cookie到期时间比会话时间稍短。

答案 2 :(得分:6)

我在旧的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");
        }
    }

这会强制用户启动会话再次登录。您也可以使用此事件从数据库中恢复会话信息,或者将其重定向到另一个页面,但保持其凭据有效。

答案 3 :(得分:0)

数据可能仍在页面上,因为浏览器正在缓存它。

尝试将其抛入并查看会话结束后数据是否仍然存在:

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