10 Stimmen

Wie kann ich Ausnahmen bei Timeouts der Formularauthentifizierung in ASP.NET behandeln?

Wenn die Sitzung abgelaufen ist und der Benutzer auf einen Link zu einem anderen Webformular klickt, leitet die asp.net-Authentifizierung den Benutzer automatisch zur Anmeldeseite um.

Es gibt jedoch Fälle, in denen der Benutzer nicht auf Links zu anderen Webformularen klickt. Zum Beispiel: Bearbeiten-Link in GridViews, bei Verwendung von AutoCompleteExtender mit Textfeldern und wenn die Anwendung versucht, die Informationen abzurufen, und im Grunde genommen in jedem Fall, wenn ein Postback durchgeführt wird und das Ereignis nicht automatisch von der asp.net-Authentifizierung behandelt wird.

Wie geht man am besten mit diesen Ausnahmen um?

UPDATE: Ich habe gerade den Titel der Frage geändert: Formularauthentifizierungstimeout, anstelle des ursprünglichen Sitzungstimeouts. Vielen Dank, dass Sie mich auf diesen Unterschied aufmerksam gemacht haben.

UPDATE: Ich habe gerade eine neue Frage mit dem spezifischen Problem erstellt, mit dem ich konfrontiert bin: Wie behandelt man Ausnahmen aufgrund eines abgelaufenen Authentifizierungstickets unter Verwendung von UpdatePanel?. Überraschenderweise habe ich nicht viele Informationen dazu gefunden. Ich würde Ihre Hilfe wirklich schätzen.

10voto

Adam Tuliper Punkte 29789

Deshalb enthalten viele Systeme Timer auf der Seite, um ungefähre Timeout-Zeiten anzugeben. Das ist schwierig bei interaktiven Seiten. Du musst wirklich Ajax-Funktionen einbinden und den Rückgabestatuscode überprüfen, was etwas schwierig ist. Eine Alternative besteht darin, Code zu verwenden, der früher im Seitenlebenszyklus läuft und eine Ajax-Weiterleitung zu einer Anmeldeseite durchführt. Andernfalls steckst du fest und versuchst, den Rückgabecode von Ajax abzufangen, und in asp.net, wo das Ajax 'für dich' erledigt wird (d. h. nicht auf eine manuellere Methode wie jQuery zurückgegriffen wird), verlierst du diese einfache Erkennung.

http://www.eggheadcafe.com/tutorials/aspnet/7262426f-3c65-4c90-b49c-106470f1d22a/build-an-aspnet-session-timeout-redirect-control.aspx

Für einen schnellen Hack kannst du es direkt in pre_init ausprobieren http://forums.asp.net/t/1193501.aspx

Bearbeiten Was benötigt wird, sind Timeouts für Formularauthentifizierung, nicht Sitzungstimeouts. Formularauthentifizierungstimeouts funktionieren auf einer anderen Skala als Sitzungstimeouts. Sitzungstimeouts werden bei jeder Anfrage aktualisiert. Formularauthentifizierungstickets werden erst aktualisiert, wenn die Hälfte der Zeit verstrichen ist. Wenn du also Timeouts auf eine Stunde einstellst und eine Anfrage 25 Minuten nach Beginn sendest, wird die Sitzung auf einen Stunden-Timeout zurückgesetzt, das Formularauthentifizierungsticket wird jedoch nicht berührt und läuft in 35 Minuten ab! Um dies zu umgehen, synchronisierst du den Sitzungstimeout und das Formularauthentifizierungsticket. Auf diese Weise kannst du immer noch nur die Sitzungstimeouts überprüfen. Wenn dir das nicht gefällt, dann synchronisiere immer noch die Timeouts und analysiere dann das Authentifizierungsticket und lese dessen Zeitablauf. Dies kannst du mit FormsAuthentication.Decrypt tun - siehe:

Cookie zur Formularauthentifizierung aus dem asp.net-Code hinterlesen

Beachte, dass dieses Code erfordert, dass du beim Anmelden einen bestimmten Sessionwert festlegst - in diesem Fall "UniqueUserId". Ändere außerdem den Login-Seitenpfad unten, um zu dir zu passen.

protected void Application_PreRequestHandlerExecute(object sender, EventArgs e)
        {
            //Nur auf den Sitzungsstatus zugreifen, wenn er verfügbar ist
            if (Context.Handler ist IRequiresSessionState || Context.Handler ist IReadOnlySessionState)
            {
                //Wenn wir authentifiziert sind UND hier keine Sitzung haben... Weiterleitung zur Anmeldeseite.
                HttpCookie authenticationCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
                if (authenticationCookie != null)
                {
                    FormsAuthenticationTicket authenticationTicket = FormsAuthentication.Decrypt(authenticationCookie.Value);
                    if (!authenticationTicket.Expired)
                    {
                        if (Session["UniqueUserId"] == null)
                        {
                            //Das bedeutet, dass aus irgendeinem Grund die Sitzung vor dem Authentifizierungsticket abgelaufen ist. Erzwinge eine Anmeldung.
                            FormsAuthentication.SignOut();
                            Response.Redirect("Login.aspx", true);
                            return;
                        }
                    }
                }
            }
        }

1voto

Joe Punkte 117971

Wenn Sie Formularauthentifizierung verwenden, wird der Benutzer auf die Anmeldeseite weitergeleitet, wenn das Formularauthentifizierungsticket abläuft, was nicht dasselbe ist wie das Ablaufen der Sitzung.

Sie könnten in Betracht ziehen, das Timeout für die Formularauthentifizierung zu erhöhen, wenn dies angemessen ist. Selbst bis hin zur Verwendung eines persistenten Cookies. Aber wenn es abläuft, gibt es keine echte Alternative zur Weiterleitung auf die Anmeldeseite - alles andere wäre unsicher.

Eine Möglichkeit, mit Sitzungsabläufen umzugehen, besteht darin, die Sitzung als Cache zu verwenden - und alles Wichtige in einem Back-End-Speicher wie einer Datenbank zu speichern. Überprüfen Sie dann, bevor Sie auf etwas in der Sitzung zugreifen, und aktualisieren Sie es bei Bedarf:

MyType MyObject
{
    get
    {
        MyType myObject = Session["MySessionKey"] as MyType
        if (myObject == null)
        {
            myObject = ... Daten aus einem Back-End-Speicher abrufen
            Session["MySessionKey"] = myObject;  
        }
        return myObject;
    }
    set
    {
        Session["MySessionKey"] = value;
        ... und gegebenenfalls im Back-End-Speicher persistieren
    }
}

0voto

James Johnson Punkte 44864

Wenn Sie eine Masterseite oder eine Basiseite verwenden, würde ich etwas Logik zu einem der Ereignisse im Seitenlebenszyklus hinzufügen, um zu überprüfen, ob die Sitzung neu ist:

protected void Page_Load(object sender, EventArgs e)
{
    if (Session.IsNewSession)
    {
        // tun Sie, was immer Sie tun müssen
    }
}

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