Session End in ASP.net MVC

前端 未结 4 740
执念已碎
执念已碎 2020-12-07 21:38

I am placing user data in the session then passing it to viewdata to view on a page. Now when my user walks away from his computer for a while, the session ends and the data

相关标签:
4条回答
  • 2020-12-07 21:54

    I had that same problem with an old ASP.net app. The session expires but the user is still authenticated because session and authentication cookies are different and not necessarily they expire at the same time. What I did back then was use the global.asax Session_Start to check if the user was authenticated and log him out.

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

    This forces a user starting a session to login again. You may also use this event to recover session info from the database, or maybe redirecto him to another page but keep his credentials valid.

    0 讨论(0)
  • 2020-12-07 21:59

    I use some Javascript in my MasterPage to redirect the user (after a prompt to renew the session) to the logout action. It uses an AJAX request back to the Home page of the app to refresh the server side session window when the user clicks the button in the dialog to extend the session. Relies on jQuery and jQuery UI for the dialog.

     <% 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 讨论(0)
  • 2020-12-07 22:08

    I'm assuming you're authenticating the user in some way, but are you using Forms Authentication?:

    ASP.Net MVC Framework - Using Forms Authentication

    If you're already using Forms Authentication, you need to make sure that the authentication cookie expiration time is just a bit shorter than your Session timout.

    0 讨论(0)
  • 2020-12-07 22:09

    The data could be still on the page because the browser is caching it.

    Try throwing this in and see if the data is still there after the session is dead:

    <META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
    
    0 讨论(0)
提交回复
热议问题