Wenn meine ASP.Net-Sitzung abläuft (und Formularauthentifizierung) und ich versuche, eine Seite zu treffen, werde ich automatisch auf meine Standardseite login.aspx umgeleitet.ASP.Net Session Timeout-Erkennung: Ist Session.IsNewSession und SessionCookie-Erkennung der beste Weg, dies zu tun?
Bevor die Seite geladen wird, muss ich feststellen, ob dies eine Timeout-Situation ist und wenn ja - redirect to timeout.aspx.
In den folgenden Artikeln wird angegeben, dass, wenn IsNewSession wahr ist und ein Sitzungs-ID-Cookie vorhanden ist, eine Zeitüberschreitungssituation vorliegt.
In meinem Test habe ich jedoch die Situation, wo ich Timeout und versuchen, wieder einzuloggen und IsNewSession ist gleich wahr und der SessionId Cookie ist immer noch herumhängen (weil es für eine ganze Browsersitzung bleibt), deshalb heißt es Ich habe wieder eine Zeitüberschreitung, wenn ich mich einfach wieder einloggen möchte.
Gibt es einen besseren Weg, all dies zu tun?
Technik ist beschrieben here und here.
In meinem ‚global.asax‘ Datei ich habe:
void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
// Check if session state is enabled in web.config
if (Context.Session == null) return;
if (Session["user"] == null)
{
if (Session.IsNewSession)
{
HttpCookie sessionCookie = Request.Cookies["ASP.NET_SessionId"];
if ((null != sessionCookie) && !string.IsNullOrEmpty(sessionCookie.Value))
{
/* Session Timeout! */
FormsAuthentication.SignOut(); //just in case not done yet
Session.Abandon();
Response.Redirect("timeout.aspx");
}
else
{
// Cookie didn't exist - must be a brand new login
return;
}
}
else
{
// If there is no session data and the session is not new then it must be the postback of the login screen.
if ((HttpContext.Current.Request.Path.ToLower().LastIndexOf("/login.aspx") >= 0) && (Request.HttpMethod == "POST"))
{
return;
}
}
}
}