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;
}
}
}
}
}