it-swarm.com.de

asp.net Cookies, Authentifizierung und Sitzungszeitüberschreitungen

Ich habe eine asp.net-Website, die die Formularauthentifizierung verwendet. Es gibt ein paar Dinge, die ich in Sitzungen wie Benutzername, Benutzername, E-Mail usw. aufbewahre.

Ich erlaube dem Benutzer, auf der Website angemeldet zu bleiben, indem ich ein langes Ablaufdatum für das Authentifizierungs-Cookie setze. Es ist daher üblich, dass die Sitzung abläuft, während der Benutzer noch authentifiziert ist.

Das Problem, auf das ich stoße, ist, dass die Sitzung des Benutzers manchmal abläuft, aber sie werden immer noch authentifiziert. Eine meiner Benutzerseiten (die eine Authentifizierung erfordert) sagt zum Beispiel "Welcome Mike", wenn ihre Sitzung aktiv ist, aber sobald die Sitzung abgelaufen ist, wird "Welcome [blank]" angezeigt, da die Informationen nicht mehr in der Sitzung enthalten sind sind immer noch authentifiziert.

Wie gehe ich am besten damit um? Soll ich die Sitzungsinformationen erneut synchronisieren, wenn die Informationen nicht mehr vorhanden sind? Oder sollte ich die Benutzerinformationen (Benutzername, Benutzer-ID, E-Mail-Adresse) in Cookies verschieben und mir keine Sorgen um Sitzungszeitüberschreitungen machen?

Ich möchte die Sitzungsdauer nicht auf etwa 60 Minuten oder mehr einstellen. Ich möchte, dass meine Benutzer sich einmal anmelden können und sich keine Sorgen machen müssen, dass sie sich erneut anmelden müssen, bis sie sich explizit abmelden.

32
danifo

Vermeiden Sie es, Sitzungen so oft wie möglich zu verwenden. Wenn Sie sich ohne Sehen lassen können, werden Bereitstellungen mit mehreren Servern etwas einfacher. Wahrscheinlich sind Name und E-Mail einfache Kandidaten für Cookies. Es ist einfach, ein Cookie zu fälschen, sodass die Benutzer-ID je nach Ihren Sicherheitsanforderungen möglicherweise keine gute Idee ist.

Die Cookies zur Formularauthentifizierung sind verschlüsselt und Sie können diesen Cookies zusätzliche Daten hinzufügen (Details siehe unten). Es ist wahrscheinlich hackbar, aber bei weitem nicht so einfach wie ein einfacher Cookie. 

Der Code, den ich in der Vergangenheit verwendet habe, wurde leicht geändert, um einige projektspezifische Details zu entfernen. Rufen Sie dies im LoggedIn-Ereignis des Login-Steuerelements auf.

void AddUserIDToAuthCookie(string userID)  
{  
  //There is no way to directly set the userdata portion of a FormAuthenticationTicket  
  //without re-writing the login portion of the Login control  
  //  
  //I find it easier to pull the cookie that the Login control inserted out  
  //and create a new cookie with the userdata set  

  HttpCookie authCookie = Response.Cookies[AUTH_COOKIE];
  if(authCookie == null)
  {
    return;
  }

  Response.Cookies.Remove(AUTH_COOKIE);

  FormsAuthenticationTicket oldTicket = FormsAuthentication.Decrypt(authCookie.Value);
  var newTicket =
    new FormsAuthenticationTicket(oldTicket.Version, oldTicket.Name, oldTicket.IssueDate, oldTicket.Expiration,
                                  oldTicket.IsPersistent, userID, oldTicket.CookiePath);

  authCookie.Value = FormsAuthentication.Encrypt(newTicket);

  Response.Cookies.Add(authCookie);
}

Zu Ihrer Information, ich habe es aus einem alten Projekt kopiert und hier bearbeitet, um einige projektspezifische Bits zu entfernen, sodass es möglicherweise nicht kompiliert wird, aber es wird sehr nahe sein. 

Um die ID auf Ihrer Webseite zu erhalten ...

FormsAuthenticationTicket ticket = ((FormsIdentity) Page.User.Identity).Ticket;
string id = ticket.UserData;

Ich habe diesen Mechanismus verwendet, um eine ID zu speichern, die nicht Teil der aspnetdb-Benutzerdaten war. Wenn alle Ihre Identitätsdaten von aspnetdb verarbeitet werden, müssen Sie möglicherweise nur auf das Objekt Page.User.Identity zugreifen.

18
ScottS

Persönlich würde ich die Standardeinstellung von 20 Minuten beibehalten und Ihrer Website eine "Keep Alive" -Funktion hinzufügen. Erstellen Sie ein einfaches Javascript, das alle 5 Minuten Umfragen ausführt, beispielsweise heartbeat.aspx, um die Sitzung am Leben zu erhalten. Dadurch werden Sitzung und Authentifizierung erweitert, ohne verrückte Authentifizierungs-Token beizubehalten.

Es gibt einige (meiner Meinung nach schlechte) Beispiele dafür. Am Ende habe ich etwas benutzt, das auf der Sitzungszeitüberschreitung von AjaxLines basiert . Anstelle der ajax-Bibliothek habe ich einfach eine xhtml-Anfrage direkt verwendet. Nichts ist wirklich mehr als ein zeitgesteuerter Javascript-Aufruf einer GET auf der Heartbeat-Seite erforderlich.

4
ccook

Technisch sollte aufgrund von Zeitüberschreitung bei asp.net Ihr Benutzer nicht abgemeldet werden. Dies sollte/wird durch das Formularauthentifizierungs-Cookie gesteuert.

Alle wesentlichen Informationen zur Benutzerauthentifizierung sollten in der Eigenschaft USERDATA des Formularauthentifizierungsticket aufbewahrt werden. Dieser Wert sollte nicht als Sitzung in der Sitzung bleiben.

Behalte nur den Wert in einer Sitzung, die wieder hergestellt werden kann.

Wenn Sie also ein Formularauthentifizierungs-Cookie erstellen, können Sie alle wesentlichen Informationen als Teil des Tickets übergeben.

-

Schnell können Sie das Zeitlimit der Sitzungs- und Formularauthentifizierung gleich halten. Dies ist eine gute Praxis. 

Das Sitzungszeitlimit wird automatisch mit jeder Anforderung an die Site verlängert.

Eine Formularauthentifizierung verlängert ihre Zeit jedoch erst nach 50% der Zeit.

Hier eine ausführliche Information dazu: Forms Authentication FAQ

Am einfachsten ist es, die Zeit für die Formularauthentifizierung in einem benutzerdefinierten HttpModule oder auf einer Basisseite zu verlängern.

Auf diese Weise wird Ihr Timeout immer synchron sein, obwohl es eine leichte Lücke geben kann.

2
rajesh pillai

Ohne selbst etwas zu versuchen, gibt es ein paar Dinge, die ich auschecken würde.

  • Verwenden Sie eine Methode/Überladung der FormsAuthentication-Klasse, mit der Sie einen permanenten Cookie setzen können. IMHO ist es jedoch üblich, Ihren Benutzern zu ermöglichen, ein Kontrollkästchen für "Merken" zu markieren, anstatt sie dazu zu zwingen, dauerhaft angemeldet zu werden. Es gibt eine Reihe von Methoden, mit denen Sie dies tun können, je nachdem, welches Verhalten Sie möchten. SetAuthenticationCookie () und RedirectFromLoginPage () sind die ersten, die mir in den Sinn kommen.

  • Auschecken FormsAuthentication.GetAuthenticationCookie (). Dadurch wird ein HTTP-Cookie mit dem Authentifizierungstoken generiert, das jedoch nicht festgelegt ist. Mit sollte können Sie das ändern, was Sie möchten. Wenn das FormsAuthentication-Modul nach einem bestimmten Wert sucht, kann dies jedoch zu Problemen führen Authentifizierung. Sie müssen das Cookie dann manuell in der Antwortsammlung zur Cookies-Sammlung hinzufügen.

0
Daniel Schaffer

Meine bevorzugte Methode ist die Verwendung von sitzungsähnlichem Cache. Versuchen Sie also, von Sitzung zu lesen. Wenn der Wert vorhanden ist, geben Sie ihn zurück. Wenn dies nicht der Fall ist, lesen Sie ihn aus dem Persistenzspeicher (Datenbank usw.), setzen Sie ihn in Sitzung und geben Sie ihn zurück.

Um dies zu vereinfachen, erstellen Sie eine Klasse, fügen Sie für jede Variable in session eine Eigenschaft hinzu und speichern Sie eine Instanz der Klasse in session. Erstellen Sie anschließend eine statische Methode, um eine Instanz der Klasse abzurufen. Ich werde später ein Beispiel hinzufügen, wenn ich könnte.

0
Mahmoodvcs