c# titel Wie kann ich Ausnahmen bei Formularauthentifizierungszeitüberschreitungen in ASP.NET behandeln?




title-tag (3)

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. Beispiel: Link in GridViews bearbeiten, wenn AutoCompleteExtender mit Textfeldern verwendet wird und die Anwendung versucht, die Informationen abzurufen, und grundsätzlich in jedem Fall, wenn ein Postback ausgeführt wird und das Ereignis nicht automatisch von der asp.net-Authentifizierung verarbeitet wird.

Was ist der beste Weg, um diese Ausnahmen zu behandeln?

UPDATE: Ich habe gerade den Fragetitel geändert: Zeitlimit für Formularauthentifizierung anstelle des anfänglichen Sitzungszeitlimits. Danke, dass Sie mir diesen Unterschied bewusst gemacht haben.

UPDATE: Ich habe gerade eine neue Frage mit dem spezifischen Problem erstellt, mit dem ich konfrontiert bin: Wie wird die Ausnahme aufgrund eines abgelaufenen Authentifizierungstickets mithilfe von UpdatePanel behandelt? . Überraschenderweise habe ich nicht viele Informationen darüber gefunden. Ich würde deine Hilfe sehr schätzen.


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

protected void Page_Load(object sender, EventArgs e)
{
    if (Session.IsNewSession)
    {
        //do whatever you need to do
    }
}

Wenn Sie die Formularauthentifizierung verwenden, wird der Benutzer auf die Anmeldeseite umgeleitet, wenn das Formularauthentifizierungsticket abläuft, was nicht mit dem Ablauf der Sitzung übereinstimmt.

Sie könnten in Erwägung ziehen, das Zeitlimit für die Formularauthentifizierung zu erhöhen. Sogar bis zu einem dauerhaften Cookie. Aber wenn es abläuft, gibt es keine echte Alternative zum Umleiten auf die Anmeldeseite - alles andere wäre unsicher.

Eine Möglichkeit, Session-Timeouts zu umgehen, besteht darin, Session als Cache zu verwenden und alles, was für einen Back-Store wie eine Datenbank wichtig ist, zu speichern. Überprüfen Sie dann, bevor Sie in Session auf etwas zugreifen und aktualisieren Sie es gegebenenfalls:

MyType MyObject
{
    get
    {
        MyType myObject = Session["MySessionKey"] as MyType
        if (myObject == null)
        {
            myObject = ... get data from a backing store
            Session["MySessionKey"] = myObject;  
        }
        return myObject;
    }
    set
    {
        Session["MySessionKey"] = value;
        ... and persist it to backing store if appropriate
    }
}

Aus diesem Grund enthalten viele Systeme Timer auf der Seite, um ungefähre Timeout-Zeiten anzugeben. Das ist schwierig mit interaktiven Seiten. Sie müssen wirklich Ajax Funktionen haken und schauen Sie sich den Return-Status-Code, der ein bisschen schwierig ist. Eine Alternative besteht darin, Code auf der Grundlage des Folgenden zu verwenden, der früh im Seitenlebenszyklus ausgeführt wird und eine Ajax-Umleitung zu einer Anmeldeseite ausführt. Sonst stecken Sie fest und versuchen, den Returncode von ajax abzufangen, und in asp.net, wo der Ajax "für Sie" erledigt wird (dh keine manuelle Methode wie jQuery), verlieren Sie diese Leichtigkeit der 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 können Sie es direkt in pre_init http://forums.asp.net/t/1193501.aspx versuchen

Bearbeiten Sie, was gesucht wird, sind für Formulare Auth Timeouts, nicht Session Timeouts. Formularauthentifizierungszeitlimits funktionieren in einem anderen Maßstab als Sitzungstimeouts. Sitzungstimeouts werden mit jeder Anfrage aktualisiert. Forms Auth Tickets werden erst nach Ablauf der Hälfte aktualisiert. Wenn Sie also Timeouts auf eine Stunde setzen und eine Anfrage 25 Minuten hineinschicken, wird die Sitzung auf eine Stunde Timeout zurückgesetzt, das Formular Auth Ticket wird nicht berührt und läuft in 35 Minuten ab! Um dies zu umgehen, synchronisieren Sie das Sitzungszeitlimit und das Formularauthentifizierungsticket. Auf diese Weise können Sie immer noch Sitzungstimeouts überprüfen. Wenn Ihnen das nicht gefällt, dann tun Sie dies - und synchronisieren Sie die Timeouts und parsen Sie dann das Auth-Ticket und lesen Sie das Timeout. Sie können das mit FormsAuthentication.Decrypt tun - siehe:

Lesen Sie Formular-Authentifizierungs-Cookie von asp.net-Code hinter

Beachten Sie, dass dieser Code erfordert, dass Sie bei der Anmeldung einen Sitzungswert festlegen - in diesem Fall "UniqueUserId". Ändern Sie auch den Pfad für die Anmeldeseite, damit er zu Ihrem passt.


protected void Application_PreRequestHandlerExecute(object sender, EventArgs e)
        {
            //Only access session state if it is available
            if (Context.Handler is IRequiresSessionState || Context.Handler is IReadOnlySessionState)
            {
                //If we are authenticated AND we dont have a session here.. redirect to login page.
                HttpCookie authenticationCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
                if (authenticationCookie != null)
                {
                    FormsAuthenticationTicket authenticationTicket = FormsAuthentication.Decrypt(authenticationCookie.Value);
                    if (!authenticationTicket.Expired)
                    {
                        if (Session["UniqueUserId"] == null)
                        {
                            //This means for some reason the session expired before the authentication ticket. Force a login.
                            FormsAuthentication.SignOut();
                            Response.Redirect("Login.aspx", true);
                            return;
                        }
                    }
                }
            }
        }





forms-authentication