Wie und warum in ASP.NET Session-IDs wiederverwendet werden

Einführung

Dieser Artikel beschreibt, wie und warum Microsoft ASP.NET Session-IDs verwendet werden.

Weitere Informationen

Der Sitzungszustand ASP.NET ist eine Technologie, die serverseitige benutzerspezifische Daten speichern kann. Diese Daten können ASP.NET-Webanwendungen Anfragen vom Benutzer bearbeitet für den Sitzungszustand instanziiert wurde. Ein Sitzungsteilnehmer Status wird durch eine Session-ID identifiziert. Der Sitzungsbezeichner erfolgt mithilfe einer der folgenden Methoden:
  • Sitzung-ID gehört ein Cookie an den Browser des Benutzers gesendet.
  • Der Sitzungsbezeichner ist im URL eingebettet. Dieses Verfahren ist auch eine Sitzung ohne Cookies.
Session-IDs sind ein 120-Bit-Zufallszahl, die 20 Zeichenfolge dargestellt wird. Die Zeichenfolge wird formatiert, sodass in einer URL enthalten sein und keinen URL-Codierung werden. Beispielsweise kann die Zeichenfolge in Clientsitzungen Cookies verwendet werden. Die am häufigsten verwendete Methode der Bereitstellung von Session-IDs wird mithilfe von Cookies Sitzung IDs gespeichert.

Wenn ein Benutzer zuerst ihren Webbrowser öffnet und führt zu einer Website, die ASP.NET Sitzungszustand implementiert, wird ein Cookie auf den Browser mit dem Namen "ASP.NET_SessionId" und einen Wert 20 Zeichen gesendet.

Wenn Benutzer innerhalb derselben DNS-Domäne durchsucht, weiterhin Webbrowser Bereich dieses Cookie an die bezogen wurde.

App1.tailspintoys.com und app2.tailspintoys.com sind z. B. beide ASP.NET Applications. Wenn der Benutzer zu app1.tailspintoys.com wechselt und zum app2.tailspintoys.com wechselt, verwenden beide Programme dasselbe Cookie und derselbe Sitzungsbezeichner Sitzungszustand der Benutzer in jeder Anwendung verfolgen. Die Anwendung freigeben den gleichen Sitzungszustand nicht. Die Anwendung Teilen nur die ID der Sitzung.

Daher können Sie die Sitzung IDs Gründe wiederverwenden. Beispielsweise wenn Session-IDs verwenden, müssen Sie keinen Folgendes:
  • Erstellen Sie ein kryptografisch eindeutiger Sitzungsbezeichner, wenn eine gültige Sitzung-ID angezeigt wird
  • Erstellen Sie eine neue Sitzung-ID für jede ASP.NET Anwendung in einer einzelnen Domäne.
Die Anwendung erfordert eine Anmeldung und Abmeldung Seite oder Option bietet, empfehlen wir den Sitzungsstatus deaktivieren, wenn Websites der Benutzer angemeldet hat. Deaktivieren des Sitzungsstatus rufen Sie die Session.Abandon -Methode auf. Die Session.Abandon -Methode können Sie den Sitzungszustand ohne Timeout der Sitzung geleert. Dieses Timeout ist standardmäßig eine Ablaufzeit von 20 Minuten. Dieser Ablauf wird jedes Mal aktualisiert, der Benutzer sendet eine Anforderung an die Website stellt das Sitzungscookie ID. Die Abandon -Methode legt ein Flag in das Sitzungsobjekt Zustand, das angibt, dass der Sitzungszustand aufgegeben werden sollte. Das Flag untersucht und dann am Ende der Seite gehandelt. Benutzer können daher Sitzungsobjekten innerhalb der Seite nach dem Aufruf der Methode verlassen . Verarbeitung der Seite wird die Sitzung entfernt.

Bei Verwendung des in-Process-Sitzungszustandsmodus werden diese Sitzungsobjekte in der HttpCache gespeichert. Die HttpCache unterstützt eine Rückrufmethode, wenn Folgendes zutrifft:
  • Ein Cacheeintrag wurde entfernt.
  • Sitzung Status-Manager registriert Session_OnEnd Ereignishandler aufgerufen werden, wenn der Cacheeintrag entfernt wird.
Wenn Session State Manager ein Sitzungsstatusobjekt, die sich im Cache befindet entfernt, ruft HttpCache Manager registrierten Rückrufe. Dieses Verhalten löst, Session_OnEnd -Ereignishandler.

Beim Abbrechen einer Sitzung wird das Sitzungscookie ID nicht im Browser des Benutzers entfernt. Daher als die Sitzung abgebrochen wurde, werden neuen Anfragen zur selben Anwendung aktiv bleibt jedoch neue Sitzungszustandsinstanz. Gleichzeitig Wenn der Benutzer eine andere Anwendung in derselben DNS-Domäne verlieren der Benutzer ihre Sitzungszustand nicht Abandon -Methode von einer Anwendung aufgerufen wurde.

In einigen Fällen sollten Sie die Sitzungs Id nicht wiederverwenden. Wenn Sie und verstehen die Konsequenzen nicht wiederverwenden der Sitzungsbezeichner im folgenden Codebeispiel wird verwenden eine Sitzung verlassen und das Sitzungscookie ID:
Session.Abandon();Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));
In diesem Codebeispiel wird den Sitzungszustand auf dem Server Löscht und Zustand Sitzungscookie auf null festgelegt. Der null-Wert wird effektiv das Cookie vom Browser gelöscht.

Benutzer nicht aus der Anwendung abmelden Zustand Sitzungstimeout auftritt, können die Anwendung weiterhin denselben Zustand Sitzungscookie Browser nicht geschlossen wird. Dadurch kann den Benutzer an die Anmeldeseite und das Sitzungscookie Zustand des Benutzers angezeigt werden. Um sicherzustellen, dass eine neue Session-ID verwendet wird, wenn die Anmeldeseite (login.aspx) öffnen, wird senden Sie null Cookie zurück an den Client. Dazu wird fügen Sie einen Cookie Antwort-Auflistung hinzu. Senden Sie Antwort-Auflistung dann zurück an den Client. Die einfachste Möglichkeit, ein null-Cookie senden ist mithilfe der Response.Redirect -Methode. Da die Auflistung der Cookies immer einen Wert für die ASP.NET_SessionId hat können nicht Sie nur testen, wenn dieses Cookie vorhanden ist, da eine Schleife Response.Redirect erstellen. Sie können eine Abfragezeichenfolge auf die Umleitung auf die Anmeldeseite festlegen.

Oder wie im folgenden Beispiel dargestellt, können verschiedene Cookie feststellen, ob Sie bereits auf der Anmeldeseite umgeleitet werden. Zur Verbesserung der Sicherheit und um sicherzustellen, dass niemand versucht, die Anmeldeseite öffnen mithilfe eines zweiten Cookies mit ASP.NET Cookies verwendet das folgende Codebeispiel FormsAuthentication -Klasse Ver-und entschlüsselt die Cookiedaten. Anschließend wird im Codebeispiel 5-Sekunden-Timeouts.
private void Page_Load(object sender, System.EventArgs e){ 
if( !IsPostBack &&
( Request.Cookies["__LOGINCOOKIE__"] == null ||
Request.Cookies["__LOGINCOOKIE__"].Value == "" ) )
{
//At this point, we do not know if the session ID that we have is a new
//session ID or if the session ID was passed by the client.
//Update the session ID.

Session.Abandon();
Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));

//To make sure that the client clears the session ID cookie, respond to the client to tell
//it that we have responded. To do this, set another cookie.
AddRedirCookie();
Response.Redirect( Request.Path );
}

//Make sure that someone is not trying to spoof.
try
{
FormsAuthenticationTicket ticket =
FormsAuthentication.Decrypt( Request.Cookies["__LOGINCOOKIE__"].Value );

if( ticket == null || ticket.Expired == true )
throw new Exception();

RemoveRedirCookie();
}
catch
{
//If someone is trying to spoof, do it again.
AddRedirCookie();
Response.Redirect( Request.Path );
}


Response.Write("Session.SessionID="+Session.SessionID+"<br/>");
Response.Write("Cookie ASP.NET_SessionId="+Request.Cookies["ASP.NET_SessionId"].Value+"<br/>");
}

private void RemoveRedirCookie()
{
Response.Cookies.Add(new HttpCookie("__LOGINCOOKIE__", ""));
}

private void AddRedirCookie()
{

FormsAuthenticationTicket ticket =
new FormsAuthenticationTicket(1,"Test",DateTime.Now,DateTime.Now.AddSeconds(5), false,"");
string encryptedText = FormsAuthentication.Encrypt( ticket );
Response.Cookies.Add( new HttpCookie( "__LOGINCOOKIE__", encryptedText ) );
}

Eigenschaften

Artikelnummer: 899918 – Letzte Überarbeitung: 16.01.2017 – Revision: 1

Feedback