2009-01-09 14 views
7

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

Antwort

7

Sie versuchen, zwischen einem Timeout-Sitzung und eine Sitzung zu unterscheiden, die manully abgemeldet wurde?

Ihr Problem ist, dass seit der Sitzungsdaten ist alles, was Sie gehen müssen, ist, dass eine neue Anfrage eine neue Sitzung erstellt hat und die eingehende Anfrage trägt eine Sitzung ID Cookie (zeigt an, dass es angemeldet war Vor).

Es gibt zwei Ansätze.

Cookie:

Zuerst in Ihrer Login-Seite, die Sie könnten ein zusätzliches Cookie erstellen, die den Login-Status des Benutzers anzeigt. Wenn sich der Benutzer manuell abmeldet, wird der Cookie-Wert geändert, um die Abmeldung anzuzeigen. Eine Anfrage nach Ablauf einer Sitzung hat zusätzlich zu IsNewSession true auch einen Login-Status-Cookie, der anzeigt, dass der Benutzer noch angemeldet ist. Dies bedeutet, dass der Benutzer sich nicht manuell zum Abmelden entschieden hat.

Datenbank:

Ein zweiter Ansatz ist sessionIDs in einer DB-Tabelle zu speichern, zusammen mit Status angemeldet. Wenn eine Anmeldung erfolgreich ist, geben Sie die Sitzungs-ID in eine LoggedOnSessions-Tabelle ein. Wenn sich der Benutzer manuell abmeldet, löschen Sie die SessionID aus der Tabelle. Daher kann Ihre Zeitüberschreitungs-Erkennung ein Nachschlagen der Sitzungs-ID in der Tabelle enthalten, wenn es ein Zeitlimit war (zu diesem Zeitpunkt sollten Sie wahrscheinlich auch die ID entfernen).

Für die Verwaltung sollten Sie ein Verfallsdatum-Feld angeben, das viel länger als jeder realistische Anmeldezeitraum (beispielsweise eine Woche) eingestellt ist. In regelmäßigen Abständen (z. B. wöchentlich) löschen Sie Einträge in der Tabelle, die abgelaufen sind.

Meine Präferenz ist der Datenbankansatz Ich hasse das Setzen von Cookies, weil es mich ärgert, dass dieser Cookie mit jeder Anfrage gesendet wird, aber selten benötigt wird.

-1

Sie können auch in der Datei web.config unter dem Tag Authentifizierung suchen.Dies sollte wie folgt aussehen:

<authentication mode="Windows"> 
    <forms defaultUrl="Default.aspx" loginUrl="Login.aspx" name=".aspxAuth"> 
    </forms> 
</authentication> 

Hinweis das Attribut Modus, sagt es wahrscheinlich Forms statt Fenster in Sie Datei web.config. In diesem Fall, wenn Sie Ihre Sitzung verlieren und klicken Sie dann auf einen Link (sagen wir SalesChart.aspx) ASP.NET wird Sie direkt zu Login.aspx codebehind anstelle von SalesChart.aspx codebehind, was besonders ärgerlich ist.

Wenn Sie den Windows-Modus versuchen, werden Sie jedes Mal auf die angeforderte Seite (SalesChart.aspx) geführt und entscheiden dann selbst, welche Aktion ausgeführt werden soll, wenn die Sitzung unterbrochen wird.