10 Stimmen

Sitzungsende in ASP.net MVC

Ich lege Benutzerdaten in die Sitzung und übergebe sie dann an ViewData, um sie auf einer Seite anzuzeigen. Wenn mein Benutzer jetzt für eine Weile seinen Computer verlässt, endet die Sitzung, und die eingegebenen Daten gehen verloren (das ist in Ordnung). Das Problem ist, dass wenn er zurückkehrt und die Seite neu lädt, meine Seite zwar noch angezeigt wird, aber alle Daten verschwunden sind. Also,

Wie kann ich den Benutzer auf eine Login-Seite umleiten, wenn die Sitzung abläuft (damit er keine leere Seite sieht) oder ich möchte ihm auf eine Seite umleiten, auf der steht "Sie wurden aufgrund von Inaktivität abgemeldet".

Danke

16voto

tvanfosson Punkte 506878

Ich verwende in meinem MasterPage etwas Javascript, um den Benutzer (nach einer Aufforderung zur Erneuerung der Sitzung) zur Logout-Aktion umzuleiten. Es wird eine AJAX-Anfrage zurück zur Startseite der App verwendet, um das serverseitige Sitzungsfenster zu aktualisieren, wenn der Benutzer auf die Schaltfläche im Dialogfeld klickt, um die Sitzung zu verlängern. Verlässt sich auf jQuery und jQuery UI für den Dialog.

 <% if (this.Request.IsAuthenticated)
    {
        int sessionDialogWait = 2 * 60 * 1000 - 60 * 500; // ms = 1,5 Minuten
        int sessionTimeout = 28 * 60 * 1000; // ms = 28 Minuten
        if (ViewData["sessionTimeout"] != null)
        {
            sessionTimeout = ((int)ViewData["sessionTimeout"] * 60 - 120) * 1000;
        }
%>  

    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" ) %>';
    }       

<% } %>

    Ihre Sitzung läuft in Kürze ab. Klicken Sie auf OK, um Ihre Sitzung zu erneuern, oder auf Logout, um sich von der Anwendung abzumelden.

0 Stimmen

Kann das Session_End in Global.asax verwendet werden, um dies zu tun?

0 Stimmen

Ich sehe nicht, wie Sie den Browser von dem Session_End-Ereignis aus auf eine andere Seite umleiten würden, es sei denn, der Browser überprüfte regelmäßig, ob die Sitzung noch aktiv ist. Leider würde das dazu führen, dass die Sitzung künstlich aktiv bleibt, da sie bei jeder Abfrage aktualisiert wird. Ich arbeite daran, dies in ein jQuery-Plugin umzuwandeln.

0 Stimmen

Bitte korrigiere mich, wenn ich falsch liege, aber Session_End läuft in einem Hintergrundthread und kann daher nicht mit dem Benutzer kommunizieren. Liebe deine Arbeit, tvanfosson, dein Ansatz funktioniert sehr gut.

7voto

Ariel Popovsky Punkte 4639

Ich hatte das gleiche Problem mit einer alten ASP.net-App. Die Sitzung läuft ab, aber der Benutzer ist immer noch authentifiziert, weil Sitzungs- und Authentifizierungscookies unterschiedlich sind und nicht unbedingt gleichzeitig ablaufen. Was ich damals gemacht habe, war, den global.asax Session_Start zu verwenden, um zu überprüfen, ob der Benutzer authentifiziert war und ihn auszuloggen.

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

Dadurch wird ein Benutzer, der eine Sitzung startet, gezwungen, sich erneut anzumelden. Sie können dieses Ereignis auch nutzen, um Sitzungsinformationen aus der Datenbank wiederherzustellen oder ihn vielleicht auf eine andere Seite umzuleiten, aber seine Anmeldeinformationen gültig zu lassen.

0 Stimmen

Ist das Sitzungs-Timeout eine Funktion des Webservers? (IIS6) Kann es nur dort im Steuerfeld geändert werden?

0 Stimmen

Ich habe diesen Code ausprobiert, er hat mich abgemeldet, aber der Response.Redirect hat mich nicht auf meine Seite geleitet.

0 Stimmen

Sie können die Sitzungsdauer in Ihrer web.config ändern oder programmgesteuert mit Session.Timeout = x; Wenn Sie sich abmelden, können Sie nur zur Anmeldeseite oder zu einer Seite gehen, die nicht durch Authentifizierung geschützt ist.

6voto

Kev Punkte 115293

Ich gehe davon aus, dass Sie den Benutzer auf irgendeine Weise authentifizieren, aber verwenden Sie Forms Authentication?:

ASP.Net MVC Framework - Verwendung von Forms Authentication

Wenn Sie bereits Forms Authentication verwenden, müssen Sie sicherstellen, dass die Ablaufzeit des Authentifizierungscookies etwas kürzer ist als Ihre Session-Zeitüberschreitung.

0 Stimmen

Ja, ich verwende das Standard-MVC-Projekt als Basis.

0 Stimmen

YUK! Ich hasse es, wenn Websites mich ständig ausloggen. Denken Sie sorgfältig darüber nach, ob Sie dies implementieren möchten oder nicht. Die Art Ihrer Website wird natürlich der entscheidende Faktor sein :)

0voto

ajma Punkte 11955

Die Daten könnten immer noch auf der Seite sein, weil der Browser sie zwischenspeichert.

Versuchen Sie, dies einzufügen, und sehen Sie, ob die Daten noch da sind, nachdem die Sitzung beendet ist:

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X