Grundlagen zu Cookies in ASP.NET

Veröffentlicht: 13. Apr 2003 | Aktualisiert: 22. Jun 2004

Von Mike Pope

Auf dieser Seite

Einführung Einführung
Was sind Cookies? Was sind Cookies?
Einschränkungen von Cookies Einschränkungen von Cookies
Erstellen von Cookies Erstellen von Cookies
Anzeigen Ihrer Cookies Anzeigen Ihrer Cookies
Mehrwertige Cookies (Unterschlüssel) Mehrwertige Cookies (Unterschlüssel)
Steuern des Gültigkeitsbereichs von Cookies Steuern des Gültigkeitsbereichs von Cookies
Beschränken von Cookies auf Ordner oder Anwendungen Beschränken von Cookies auf Ordner oder Anwendungen
Festlegen des Gültigkeitsbereichs von Cookies auf eine Domäne Festlegen des Gültigkeitsbereichs von Cookies auf eine Domäne
Lesen von Cookies Lesen von Cookies
Wie lässt sich die Gültigkeitsdauer erkennen? Wie lässt sich die Gültigkeitsdauer erkennen?
Lesen von Cookieauflistungen Lesen von Cookieauflistungen
Ändern und Löschen von Cookies Ändern und Löschen von Cookies
Löschen von Cookies Löschen von Cookies
Ändern oder Löschen von Unterschlüsseln Ändern oder Löschen von Unterschlüsseln
Cookies und Sicherheit Cookies und Sicherheit
Überprüfen, ob ein Browser Cookies annimmt Überprüfen, ob ein Browser Cookies annimmt
Cookies und Sitzungsstatus Cookies und Sitzungsstatus

Einführung

Cookies stellen ein nützliches Verfahren in Webanwendungen dar, um benutzerspezifische Informationen zu speichern. Wenn z.B. Benutzer Ihre Site besuchen, können Sie mit Cookies Benutzervoreinstellungen oder andere Informationen speichern. Besuchen Benutzer Ihre Website ein weiteres Mal, kann die Anwendung die vorher gespeicherten Informationen abrufen.

Dieser Artikel bietet eine Übersicht über die Arbeit mit Cookies in ASP.NET-Anwendungen. Dabei wird z.B. beschrieben, wie Cookies erstellt und später wieder gelesen werden. Parallel dazu werden verschiedene Funktionen und (gelegentliche) Eigentümlichkeiten von Cookies sowie ihre Unterstützung in ASP.NET erläutert.

 

Was sind Cookies?

Ein Cookie ist eine kleine Textdatei, die Anforderungen und Seiten beim Austausch zwischen dem Webserver und dem Browser begleitet. Das Cookie enthält Informationen, die die Webanwendung lesen kann, sobald Benutzer die Site besuchen.

Stellen Sie sich vor, ein Benutzer fordert eine Seite von Ihrer Site, z.B. www.contoso.com, an. Dabei sendet Ihre Anwendung nicht nur eine Seite, sondern auch ein Cookie mit dem Datum und der Uhrzeit. Sobald der Browser des Benutzers die Seite empfängt, erhält er auch das Cookie, das in einem Ordner auf der Festplatte des Benutzers gespeichert wird.

Zu einem späteren Zeitpunkt fordert der Benutzer erneut eine Seite von Ihrer Site an. Sobald der Benutzer den URL www.contoso.com eingibt, sucht der Browser auf der lokalen Festplatte nach einem Cookie, das mit dem URL verbunden ist. Falls das Cookie vorhanden ist, sendet der Browser das Cookie zusammen mit der Seitenanforderung an Ihre Site. Ihre Anwendung kann dann den Zeitpunkt (Datum und Uhrzeit) ermitteln, zu dem die Site das letzte Mal vom Benutzer besucht wurde. Sie können diese Informationen verwenden, um eine Meldung für den Benutzer anzuzeigen, ein Gültigkeitsdatum zu überprüfen oder eine andere nützliche Funktion durchzuführen.

Cookies sind mit einer Website, und nicht mit einer bestimmten Seite verknüpft, weshalb der Browser und der Server die www.contoso.com-Cookieinformationen unabhängig davon austauschen, welche Seite der Benutzer von Ihrer Site abruft. Während der Benutzer andere Sites besucht, kann jede Site ebenfalls ein Cookie an den Browser des Benutzers senden. Der Browser speichert dabei alle Cookies separat.

Dies ist die grundlegende Funktionsweise von Cookies. Aber welchem Zweck dienen sie? Im Kern helfen Cookies Websites beim Speichern von Informationen über Besucher. Allgemeiner ausgedrückt ermöglichen Cookies eine gewisse Kontinuität in einer Webanwendung (formell ausgedrückt führen sie eine Statusverwaltung durch). Mit Ausnahme des kurzen Moments, wenn Browser und Webserver tatsächlich Informationen austauschen, sind diese voneinander getrennt. Jede Anforderung, die Sie an einen Webserver senden, wird unabhängig von allen anderen Anforderungen durchgeführt. In vielen Fällen ist es jedoch nützlich für den Webserver, wenn er Sie beim Anfordern einer Seite erkennt. So speichert z.B. der Webserver auf einer Einkaufssite Informationen zu einzelnen Käufern, damit die Site Einkaufswagen und andere benutzerspezifische Informationen verwalten kann. Ein Cookie fungiert daher als eine Art Callingcard, die relevante Identifikationsinformationen präsentiert und somit einer Anwendung das weitere Vorgehen erleichtert.

Cookies werden für alle möglichen Zwecke verwendet, die alle damit zu tun haben, dass sich die Website an Sie erinnert. So verwendet z.B. eine Site, die eine Umfrage durchführt, ein Cookie einfach als Booleschen Wert, um anzugeben, ob Ihr Browser bereits abgestimmt hat, damit Sie nicht zweimal abstimmen. Eine Site, die Sie zum Anmelden auffordert, bestätigt sich eventuell anhand eines Cookies, dass Sie bereits angemeldet sind, damit Sie nicht ständig Ihre Anmeldeinformationen eingeben müssen.

Wenn Sie weitere Hintergrundinformationen über Cookies wünschen, empfehle ich den Artikel "How Internet Cookies Work" (in Englisch) auf der Verizon-Website unter http://www22.verizon.com/about/community/learningcenter/articles/displayarticle1/0,4065,1022z1,00.html. Der Autor beschreibt im Detail, was Cookies sind und wie diese zwischen Browser und Server ausgetauscht werden. Er bietet auch eine gute Zusammenfassung der datenschutzrechtlichen Bedenken zum Thema Cookies.

Im Folgenden gehe ich davon aus, dass Sie wissen, was Cookies sind und eine Vorstellung davon haben, warum Sie diese in Ihren ASP.NET-Anwendungen verwenden sollten.

 

Einschränkungen von Cookies

Vor einer Beschreibung des Umgangs mit Cookies sollen einige Einschränkungen bei der Arbeit mit Cookies erwähnt werden. Die meisten Browser unterstützen Cookies mit einer Größe von bis zu 4096 Byte. Dies ist ausreichend Platz für das Speichern einiger Werte auf den Computern von Benutzern. Im Gegensatz dazu wird das Speichern von DataSets oder anderen potenziell großen Datenmengen in einem Cookie nicht empfohlen. In der Praxis möchten Sie wahrscheinlich keine großen Mengen an Benutzerinformationen in einem Cookie speichern. Stattdessen speichern Sie eine Benutzernummer oder andere Kennung. Wenn der Benutzer Ihre Site dann erneut besucht, können Sie die Benutzerinformationen in einer Datenbank nachschlagen. (Lesen Sie jedoch vorher den Abschnitt Cookies und Sicherheit, um sich über einige kritische Aspekte zum Speichern von Benutzerinformationen zu informieren.)

Browser können auch die Anzahl der Cookies einschränken, die Ihre Site auf dem Computer von Benutzern speichern kann. Die meisten Browser lassen 20 Cookies pro Site zu. Wenn Sie versuchen, mehr zu speichern, werden die ältesten Cookies gelöscht. Einige Browser verfügen auch über eine absolute Höchstzahl von Cookies, in der Regel 300, die sie von allen Sites zusammen akzeptieren.

Eine Cookiebeschränkung, auf die Sie mit größerer Wahrscheinlichkeit stoßen dürften, ist die Tatsache, dass Benutzer ihre Browser für das Ablehnen von Cookies einstellen können. Es gibt wenige Möglichkeiten, dieses Problem zu umgehen, mit der Ausnahme, Cookies ganz zu vermeiden und einen anderen Mechanismus zur Speicherung von benutzerspezifischen Informationen zu verwenden. Eine weit verbreitete Methode für das Speichern von Benutzerinformationen ist der Sitzungsstatus, jedoch ist diese Funktion von Cookies abhängig, wie weiter unter im Abschnitt Cookies und Sitzungsstatus erläutert wird.

Anmerkung:
Weitere Informationen zur Statusverwaltung und den Optionen zum Speichern von Informationen in einer Webanwendung finden Sie in den Artikeln Introduction to Web Forms State Management (in Englisch) und State Management Recommendations(in Englisch).

Generell lässt sich folgende Schlussfolgerung ableiten: Obwohl Cookies in Ihrer Anwendung sehr nützlich sein können, sollte die Anwendung nicht von der Speicherung von Cookies abhängig sein. Verwenden Sie Cookies für optionale Zusatzsatzfunktionen, nicht zur Unterstützung kritischer Funktionen. Ist Ihre Anwendung jedoch von Cookies abhängig, können Sie testen, ob der Browser Cookies annimmt. Eine Methode dafür wird weiter unten im Abschnitt Überprüfen, ob ein Browser Cookies annimmt beschrieben.

 

Erstellen von Cookies

Sie erstellen ein Cookie mithilfe der Response-Eigenschaft (in Englisch) der Seite. Diese legt ein Objekt offen, das Ihnen das Hinzufügen von Informationen ermöglicht, die von der Seite an den Browser übertragen werden. Das Response-Objekt unterstützt eine Auflistung mit der Bezeichnung Cookies (in Englisch), der Sie die Cookies hinzufügen, die an den Browser geschrieben werden sollen.

Anmerkung:
Das Response-Objekt und das Request-Objekt, die ich in Kürze erläutern werde, sind Eigenschaften der Seite, die jeweils Instanzen der HttpResponse- bzw. HttpRequest-Klassen (in Englisch) enthalten. Sie finden Informationen in der Dokumentation zu Response und Request, wenn Sie unter HttpResponse und HttpRequest nachsehen.

Bei der Erstellung von Cookies geben Sie mehrere Werte an. Zunächst geben Sie den Namen des Cookies und den darin zu speichernden Wert an. Sie können mehrere Cookies erstellen, und jedes Cookie muss über einen eindeutigen Namen verfügen, damit Sie dieses später beim Lesen identifizieren können. (Cookies werden mit dem Namen gespeichert. Wenn Sie also zwei Cookies mit dem gleichen Namen erstellen, überschreibt eines das andere.)

Sie möchten eventuell auch die Gültigkeitsdauer (Datum und Uhrzeit des Cookies) angeben. Cookies werden in der Regel auf die Festplatte von Benutzern geschrieben, wo sie potenziell sehr lange verweilen können. Aus diesem Grund können Sie ein Datum und eine Uhrzeit angeben, wann das Cookie abläuft. Wenn Benutzer Ihre Site dann erneut besuchen, untersucht der Browser zunächst die Auflistung der Cookies für Ihre Site. Wenn ein Cookie abgelaufen ist, sendet der Browser nicht dieses spezielle Cookie zusammen mit der Seitenanforderung an den Server, sondern löscht stattdessen das abgelaufene Cookie. (Wenn Ihre Site mehrere Cookies an den Computer des Benutzers geschrieben hat, kann jedes Cookie über eine separate Gültigkeitsdauer verfügen.) Beachten Sie, dass der Browser für die Verwaltung von Cookies auf der Festplatte verantwortlich ist. Diese Tatsache beeinflusst, was Sie mit Cookies in Ihren Anwendungen machen können, wie ich in Kürze näher erläutern werde.

Wie lange sollte die Gültigkeitsdauer für ein Cookie sein? Dies hängt davon ab, für welchen Zweck Sie das Cookie verwenden, oder um es anders zu formulieren: Es hängt davon ab, wie lange Ihre Anwendung den Wert eines Cookies für gültig erachtet. Wenn Sie Cookies zum Zählen von Besuchern Ihrer Site verwenden, können Sie z.B. als Gültigkeitsdauer 1 Jahr vom aktuellen Zeitpunkt an festlegen. Dies basiert auf der Annahme, dass Benutzer, die Ihre Site innerhalb eines Jahres nicht besucht haben, als neue Besucher angesehen werden können. Wenn Sie im Gegensatz dazu Cookies zum Speichern von Benutzereinstellungen verwenden, können Sie die Gültigkeitsdauer praktisch unbegrenzt (z.B. auf 50 Jahre) belassen, da es Benutzer eventuell als störend empfinden, wenn sie die Voreinstellungen in bestimmten Zeitabständen immer wieder neu festlegen müssen. In einigen Fällen benötigen Sie eventuell ein Cookie, das in Sekunden oder Minuten abläuft. Weiter unten im Abschnitt Überprüfen, ob ein Browser Cookies annimmt dieses Artikels wird ein Beispiel beschrieben, bei dem ein Cookie erstellt wird, dessen Lebensdauer praktisch in Sekunden gemessen wird.

Anmerkung:
Vergessen Sie nicht, dass Benutzer Cookies auf ihrem Computer jederzeit löschen können. Selbst, wenn Sie Cookies mit einer langen Gültigkeitsdauer speichern, kann sich ein Benutzer jederzeit dazu entschließen, alle Einstellungen zu löschen, die Sie in Ihren Cookies gespeichert haben.

Wenn Sie keine Gültigkeitsdauer für Cookies festlegen, wird das Cookie zwar erstellt, aber nicht auf der Festplatte des Benutzers gespeichert. Stattdessen wird das Cookie als Teil der Sitzungsinformationen des Benutzers verwaltet. Sobald der Benutzer den Browser beendet oder die Sitzung das Zeitlimit überschreitet, wird das Cookie verworfen. Ein nicht beständiges Cookie wie dieses eignet sich gut für Informationen, die nur für eine kurze Zeit gespeichert werden müssen oder aus Sicherheitsgründen nicht auf die Festplatte des Clientcomputers geschrieben werden sollten. So sind nicht beständige Cookies immer dann nützlich, wenn Benutzer an einem öffentlichen Computer arbeiten, auf dem keine Cookies auf der Festplatte gespeichert werden sollen.

Es gibt mehrere Möglichkeiten, Cookies der Response.Cookies-Auflistung hinzuzufügen. Das folgende Beispiel zeigt zwei Methoden zur Umsetzung dieses Vorgangs:

Response.Cookies("userName").Value = "mike" 
Response.Cookies("userName").Expires = DateTime.Now.AddDays(1) 
Dim aCookie As New HttpCookie("lastVisit") 
aCookie.Value = DateTime.Now.ToString 
aCookie.Expires = DateTime.Now.AddDays(1) 
Response.Cookies.Add(aCookie)

Das Beispiel fügt der Cookies-Auflistung zwei Cookies hinzu, eines mit der Bezeichnung userName und ein weiteres mit der Bezeichnung lastVisit. Für das erste Cookie werden die Werte der Response.Cookies-Auflistung direkt festgelegt. Das Hinzufügen von Werten zur Auflistung auf diese Weise ist deshalb möglich, weil Response.Cookies von einer speziellen Auflistung vom Typ NameObjectCollectionBase (in Englisch) abgeleitet ist.

Für das zweite Cookie habe ich eine Instanz des Cookieobjekts (Typ HttpCookie, in Englisch) erstellt, seine Eigenschaften festgelegt und es anschließend der Response.Cookies-Auflistung über die Add-Methode hinzugefügt. Bei der Instanziierung eines HttpCookie-Objekts müssen Sie den Cookienamen als Teil des Konstruktors übergeben.

Beide Beispiele erledigen dieselbe Aufgabe, nämlich das Schreiben eines Cookies an den Browser. Die verwendete Methode hängt größtenteils von Ihren persönlichen Vorlieben ab. Sie werden vielleicht feststellen, dass bei der zweiten Methode das Festlegen der Cookieeigenschaften etwas einfacher ist, aber wie Sie sehen können, sind die Unterschiede eher geringfügig.

In beiden Fällen muss der Wert für die Gültigkeitsdauer vom Typ DateTime sein. Bei dem Wert für lastVisited handelt es sich jedoch ebenfalls um einen Datum/Uhrzeit-Wert. In diesem Fall musste der Datum/Uhrzeit-Wert jedoch in eine Zeichenfolge konvertiert werden. Jeder Wert, den Sie in einem Cookie speichern, wird letztendlich als Zeichenfolge gespeichert.

 

Anzeigen Ihrer Cookies

Sie finden es eventuell nützlich, zu sehen, welchen Effekt die Erstellung von Cookies hat. Die Anzeige von Cookies ist einfach (es handelt sich schließlich um Textdateien), solange Sie diese finden können. Unterschiedliche Browser haben verschiedene Speichermethoden für Cookies. Im Anschluss wird beschrieben, wie Internet Explorer Cookies speichert. Wenn Sie einen anderen Browser verwenden, durchsuchen Sie die Hilfe des Browsers, um Informationen über die Verarbeitung von Cookies zu erhalten.

Eine einfache Möglichkeit für die Anzeige von Cookies besteht darin, diese von Internet Explorer automatisch suchen zu lassen. Klicken Sie in Internet Explorer im Menü Extras auf Internetoptionen. Klicken Sie auf der Registerkarte Allgemein auf Einstellungen und anschließend auf Dateien anzeigen. Internet Explorer öffnet ein Fenster mit allen seinen temporären Dateien, einschließlich Cookies. Suchen Sie im Fenster nach den Dateien, deren Namen mit "Cookie:" beginnt, oder suchen Sie nach Textdateien. Doppelklicken Sie auf eine Textdatei, um diese in Ihrem Standard-Text-Editor anzuzeigen.

Alternativ dazu können Sie nach Cookies über ihre Textdateien auf der Festplatte suchen. Internet Explorer speichert die Cookies für eine Site in einer Datei, deren Namen folgendes Format hat: <Benutzer>@<Domäne>.txt, wobei <Benutzer> ihr Benutzername ist. Wenn beispielsweise ihr Name mikepope lautet und Sie die Site www.contoso.com besuchen, befinden sich die Cookies für diese Site in einer Datei mit der Bezeichnung mikepope@www.contoso.txt. (Der Name kann eine laufende Nummer enthalten, wie etwa mikepope@www.contoso[1].txt.)

Da die Cookietextdateien benutzerspezifisch sind, werden diese nach Benutzerkonto getrennt. Unter Windows XP finden Sie Cookiedateien z.B. in einem Verzeichnis mit einem Namen wie dem Folgenden:

c:\Dokumente und Einstellungen\<user>\Cookies

Um die von Ihnen erstellten Cookies zu finden, kann es hilfreich sein, wenn Sie das Verzeichnis nach dem Änderungsdatum sortieren und nach der aktuellsten Datei suchen.

Das Cookie kann mit einem Text-Editor geöffnet werden. Falls die Datei mehrere Cookies enthält, sind diese durch ein Sternchen (*) getrennt. Die erste Zeile jedes Cookies enthält seinen Namen, die zweite seine Werte. Die restlichen Zeilen enthalten Informationen zur Cookieverwaltung, wie etwa Datum und Uhrzeit der Gültigkeit. Im Cookie befindet sich auch eine einfache Prüfsumme. Wenn Sie die Länge des Cookienamens oder den Wert ändern, erkennt der Browser diese Manipulation und verwirft das Cookie.

 

Mehrwertige Cookies (Unterschlüssel)

Das vorangegangene Beispiel verwendet ein Cookie für jeden zu speichernden Wert (Benutzername, letzter Besuch). Sie können auch mehrere Name/Wert-Paare in einem einzelnen Cookie speichern. Die Name/Wert-Paare werden als "Schlüssel" oder "Unterschlüssel" bezeichnet, je nachdem, was Sie gerade lesen. (Das Layout von Unterschlüsseln ist dem von Abfragezeichenfolgen in einem URL sehr ähnlich, falls Sie mit dieser Struktur vertraut sind.) Beispiel: Anstatt zwei unterschiedliche Cookies mit der Bezeichnung userName und lastVisit zu erstellen, könnten Sie ein einzelnes Cookie mit der Bezeichnung userInfo erstellen, das die zwei Unterschlüssel userName und lastVisit enthält.

Es gibt eine Reihe von Gründen für die Verwendung von Unterschlüsseln anstelle von separaten Cookies. Natürlich ist es übersichtlicher, verwandte oder ähnliche Informationen in einem einzelnen Cookie abzulegen. Da sich darüber hinaus alle Informationen in einem einzelnen Cookie befinden, beziehen sich Cookieattribute wie die Gültigkeitsdauer auf alle Informationen. (Wenn Sie hingegen verschiedenen Arten von Informationen eine unterschiedliche Gültigkeitsdauer zuweisen möchten, sollten Sie die Informationen in separaten Cookies speichern.)

Ein Cookie mit Unterschlüsseln kann auch dazu beitragen, die Cookiegröße klein zu halten. Wie bereits weiter oben unter Einschränkungen von Cookies erwähnt, sind Cookies auf 4096 Byte beschränkt, und Sie können nicht mehr als 20 Cookies pro Site speichern. Indem Sie ein einzelnes Cookie mit Unterschlüsseln verwenden, verbrauchen Sie weniger der 20 Cookies, die Ihrer Site zugewiesen sind. Zudem beansprucht ein einzelnes Cookie bis zu 50 Zeichen an Overhead (Gültigkeitsinformationen usw.) sowie die Länge des Werts, den Sie darin speichern. All dies wird bereits zu der 4 KB-Höchstgrenze dazu gezählt. Wenn Sie fünf Unterschlüssel anstelle von fünf separaten Cookies speichern, sparen Sie sich den Overhead der separaten Cookies, was bis zu 200 Byte ausmachen kann.

Um ein Cookie mit Unterschlüsseln zu erstellen, können Sie eine Variation der Syntax für die Erstellung eines einzelnen Cookies verwenden. Das folgende Beispiel zeigt zwei Möglichkeiten zur Erstellung desselben Cookies, jedes davon mit zwei Unterschlüsseln.

Response.Cookies("userInfo")("userName") = "mike" 
Response.Cookies("userInfo")("lastVisit") = DateTime.Now.ToString 
Response.Cookies("userInfo").Expires = DateTime.Now.AddDays(1) 
Dim aCookie As New HttpCookie("userInfo") 
aCookie.Values("userName") = "mike" 
aCookie.Values("lastVisit") = DateTime.Now.ToString 
aCookie.Expires = DateTime.Now.AddDays(1) 
Response.Cookies.Add(aCookie)

 

Steuern des Gültigkeitsbereichs von Cookies

Standardmäßig werden alle Cookies für eine Site zusammen auf dem Client gespeichert, und alle Cookies werden an den Server mit beliebigen Anforderungen an diese Site gesendet. Anders ausgedrückt: Jede Seite auf einer Site erhält alle Cookies für diese Site. In bestimmten Situationen ist eventuell eine etwas differenziertere Funktionsweise von Cookies erwünscht. Es gibt zwei Möglichkeiten, um den Gültigkeitsbereich von Cookies einzuschränken:

  • Sie können den Gültigkeitsbereich von Cookies auf einen Ordner auf dem Server beschränken, wodurch Cookies in der Praxis auf eine Anwendung auf der Site beschränkt werden können.

  • Sie können den Gültigkeitsbereich für eine Domäne festlegen. Dadurch können Sie bestimmen, welche untergeordneten Domänen auf ein Cookie zugreifen können.

 

Beschränken von Cookies auf Ordner oder Anwendungen

Um Cookies auf einen Ordner auf dem Server zu beschränken, legen Sie die Path-Eigenschaft des Cookies wie folgt fest:

Dim appCookie As New HttpCookie("AppCookie") 
appCookie.Value = "written " & Now.ToString 
appCookie.Expires = Now.AddDays(1) 
appCookie.Path = "/Application1" 
Response.Cookies.Add(appCookie)

Natürlich können Cookies auch durch direktes Setzen von Response.Cookies geschrieben werden, wie weiter oben erläutert.

Bei dem Pfad kann es sich entweder um einen physischen Pfad unter dem Sitestammverzeichnis oder um ein virtuelles Stammverzeichnis handeln. Dies hat den Effekt, dass das Cookie nur Seiten im Ordner Application1 oder im virtuellen Stammverzeichnis zur Verfügung steht. Wenn Ihre Site die Bezeichnung www.contoso.com hat, steht das im vorherigen Beispiel erstellte Cookie Seiten mit dem Pfad http://www.contoso.com/Application1/ sowie allen Seiten unter diesem Ordner zur Verfügung. Jedoch steht das Cookie keinen Seiten in anderen Anwendungen zur Verfügung, wie etwa http://www.contoso.com/Application2/ oder nur http://www.contoso.com/.

Tipp:
Einige Tests mit Internet Explorer und dem Mozilla-Browser haben ergeben, dass bei der Pfadangabe die Groß-/Kleinschreibung eine Rolle spielt. In der Regel wird bei URLs auf Windows-Servern die Groß-/Kleinschreibung nicht beachtet, jedoch scheint dies eine Ausnahme zu sein. Sie können zwar nicht kontrollieren, wie Benutzer URLs in ihre Browser eingeben, aber wenn Ihre Anwendung von Cookies abhängig ist, die an einen bestimmten Pfad gebunden sind, stellen Sie sicher, dass URL-Angaben in allen von Ihnen erstellten Hyperlinks der Groß-/Kleinschreibung des Path-Eigenschaftswerts entsprechen.

 

Festlegen des Gültigkeitsbereichs von Cookies auf eine Domäne

Standardmäßig sind Cookies mit einer bestimmten Domäne verknüpft. Wenn beispielsweise Ihre Site www.contoso.com lautet, werden die von Ihnen erstellten Cookies an den Server gesendet, wenn Benutzer eine beliebige Seite von dieser Site anfordern. (Mit der Ausnahme von Cookies mit einem bestimmten Pfadwert, wie im unmittelbar vorausgehenden Abschnitt erklärt.) Verfügt Ihre Site über untergeordnete Domänen, z.B. contoso.com, sales.contoso.com und support.contoso.com, können Sie Cookies mit einer spezifischen untergeordneten Domäne verknüpfen. Legen Sie zu diesem Zweck für die Domain-Eigenschaft des Cookies folgenden Wert fest:

Response.Cookies("domain").Value = DateTime.Now.ToString 
Response.Cookies("domain").Expires = DateTime.Now.AddDays(1) 
Response.Cookies("domain").Domain = "support.contoso.com"

Wenn die Domäne auf diese Art und Weise festgelegt wurde, steht das Cookie nur für Seiten in der angegebenen untergeordneten Domäne zur Verfügung.

Mit der Domain-Eigenschaft können Sie auch ein Cookie erstellen, das für mehrere untergeordnete Domänen freigegeben wird. Legen Sie z.B. die Domäne wie folgt fest:

Response.Cookies("domain").Value = DateTime.Now.ToString 
Response.Cookies("domain").Expires = DateTime.Now.AddDays(1) 
Response.Cookies("domain").Domain = "contoso.com"

Das Cookie steht dann sowohl der primären Domäne zur Verfügung, als auch den Domänen sales.contoso.com und support.contoso.com.

 

Lesen von Cookies

Sendet der Browser eine Anforderung an den Server, werden die Cookies für diesen Server zusammen mit der Anforderung übertragen. In Ihren ASP.NET-Anwendungen können Sie die Cookies mithilfe des Request-Objekts lesen. Die Struktur des Request-Objekts entspricht im Wesentlichen der des Response-Objekts, weshalb Sie Cookies aus dem Request-Objekt fast so lesen können, wie Sie Cookies in das Response-Objekt geschrieben haben. Die folgenden Beispiele zeigen zwei Möglichkeiten, um den Wert eines Cookies mit der Bezeichnung "username" abzurufen und seinen Wert in einem Label-Steuerelement anzuzeigen:

If Not Request.Cookies("userName") Is Nothing Then 
   Label1.Text = Server.HtmlEncode(Request.Cookies("userName").Value) 
End If 
If Not Request.Cookies("userName") Is Nothing Then 
   Dim aCookie As HttpCookie = Request.Cookies("userName") 
   Label1.Text = Server.HtmlEncode(aCookie.Value) 
End If

Bevor Sie versuchen, den Wert eines Cookies abzurufen, sollten Sie sicherstellen, dass das Cookie existiert. Andernfalls erhalten Sie eine System.NullReferenceException-Ausnahme (in Englisch). Beachten Sie, dass ich die HttpServerUtility.HtmlEncode-Methode (in Englisch) aufrufe, um den Inhalt eines Cookies zu codieren, bevor es auf der Seite angezeigt wird. Dieser Schritt erfolgt hier deshalb, weil der Inhalt des Cookies angezeigt wird (was Sie normalerweise wahrscheinlich nicht tun) und sichergestellt werden soll, dass böswillige Benutzer kein ausführbares Skript im Cookie versteckt haben. Weitere Informationen über die Cookiesicherheit finden Sie im Abschnitt Cookies und Sicherheit.

Anmerkung:
Da verschiedene Browser Cookies unterschiedlich speichern, sind verschiedene Browser auf demselben Computer nicht unbedingt in der Lage, die Cookies des anderen zu lesen. Wenn Sie zum Testen einer Seite einmal Internet Explorer verwenden und dann diese später mit einem anderen Browser erneut testen, findet der zweite Browser nicht die von Internet Explorer gespeicherten Cookies. Natürlich verwenden die meisten Benutzer denselben Browser für ihre gesamte Webkommunikation, weshalb dies in den meisten Situationen kein Problem ist. Dieser Punkt könnte jedoch relevant werden, wenn Sie Ihre Anwendung z.B. auf Browserkompatibilität testen.

Das Lesen des Werts eines Unterschlüssels in einem Cookie ist ebenfalls dem Festlegen des Werts ähnlich. Hier ist eine Möglichkeit, um den Wert eines Unterschlüssels abzurufen:

If Not Request.Cookies("userInfo") Is Nothing Then 
   Label1.Text = _ 
  Server.HtmlEncode(Request.Cookies("userInfo")("userName")) 
   Label2.text = _ 
  Server.HtmlEncode(Request.Cookies("userInfo")("lastVisit")) 
End If

Im vorangegangenen Beispiel wird der Wert des Unterschlüssels "lastVisit" abgerufen, für den vorher die Zeichenfolgendarstellung eines DateTime-Werts festgelegt wurde. Denken Sie daran, dass Cookies Werte als Zeichenfolgen speichern. Wenn Sie also den lastVisit-Wert als Datum verwenden möchten, müssen Sie diesen konvertieren.

Dim dt As DateTime 
dt = CDate(Request.Cookies("userInfo")("lastVisit"))

Die Unterschlüssel in einem Cookie sind als eine Auflistung vom Typ NameValueCollection (in Englisch) typisiert. Eine weitere Möglichkeit zum Abrufen eines einzelnen Unterschlüssels besteht daher darin, die Unterschlüsselauflistung abzurufen und anschließend den Unterschlüsselwert dem Namen nach zu extrahieren, wie hier gezeigt:

If Not Request.Cookies("userInfo") Is Nothing Then 
   Dim UserInfoCookieCollection As _ 
   System.Collections.Specialized.NameValueCollection 
   UserInfoCookieCollection = Request.Cookies("userInfo").Values 
   Label1.Text = Server.HtmlEncode(UserInfoCookieCollection("userName")) 
   Label2.Text = Server.HtmlEncode(UserInfoCookieCollection("lastVisit")) 
End If

Wie beim Festlegen des Cookies liegt das zum Lesen eines Cookies verwendete Verfahren ganz bei Ihnen.

 

Wie lässt sich die Gültigkeitsdauer erkennen?

Sie können zwar den Namen und den Wert eines Cookies lesen, aber recht viel mehr Informationen lassen sich nicht erkennen. Zwar können Sie die Eigenschaften Domain und Path abrufen, aber diese Eigenschaften sind von begrenztem Nutzen. So ist z.B. die Domain-Eigenschaft lesbar, aber wenn sich Ihre Seite nicht in demselben Verzeichnis wie das Cookie befindet, haben Sie das Cookie erst gar nicht empfangen.

Nicht lesbar ist hingegen die Gültigkeitsdauer (Datum und Uhrzeit) des Cookies. So ist es in der Tat so, dass keine Gültigkeitsinformationen eingefügt werden, wenn der Browser Cookieinformationen an den Server sendet. Zwar können Sie die Expires-Eigenschaft lesen, aber sie gibt stets den Datum/Uhrzeit-Wert Null zurück.

Weiter oben im Abschnitt Erstellen von Cookies wurde erwähnt, dass der Browser für die Verwaltung von Cookies verantwortlich ist: Die Expires-Eigenschaft ist ein Beispiel dafür. Die Hauptfunktion der Expires-Eigenschaft besteht darin, den Browser bei der Verwaltung seines Cookiespeichers zu unterstützen. Aus der Perspektive des Servers existiert ein Cookie oder es existiert nicht, die Gültigkeitsdauer stellt keine nützliche Information auf der Serverseite dar. Aus diesem Grund wird diese Information vom Browser beim Senden des Cookies nicht zur Verfügung gestellt. Wenn die Gültigkeitsdauer eines Cookie für Sie von Bedeutung ist, müssen Sie diese zurücksetzen, wie im Anschluss unter Ändern und Löschen von Cookies beschrieben wird.

Um es noch einmal zu verdeutlichen: Sie können die Expires-Eigenschaft eines Cookies lesen, die Sie im Response-Objekt festgelegt haben, bevor das Cookie an den Browser gesendet wurde. Jedoch wird die Gültigkeitsdauer nicht im Request-Objekt zurückgegeben.

 

Lesen von Cookieauflistungen

In den vorangegangenen Beispielen wurde angenommen, dass Sie ein spezifisches Cookie lesen möchten, dessen Namen Sie kennen. Gelegentlich ist es eventuell notwendig, alle Cookies durchzulesen, die der Seite zur Verfügung stehen. Um die Namen und Werte aller Cookies zu lesen, die der Seite zur Verfügung stehen, können Sie eine Schleife durch die Request.Cookies-Auflistung mithilfe von Code wie dem Folgenden durchführen:

Dim i As Integer 
Dim output As String = "" 
Dim aCookie As HttpCookie 
For i = 0 to Request.Cookies.Count - 1 
 aCookie = Request.Cookies(i) 
 output &= "Cookiename = " & Server.HtmlEncode(aCookie.Name) & "<br>" 
 output &= "Cookiewert = " & Server.HtmlEncode(aCookie.Value) & _ 
  & "<br><br>" 
Next  
Label1.Text = output

Anmerkung:
Bei Ausführung dieses Codes bemerken Sie eventuell ein Cookie mit der Bezeichnung ASP.NET_SessionId. Mithilfe dieses Cookies speichert ASP.NET einen eindeutigen Bezeichner für Ihre Sitzung. Das Sitzungscookie wird nicht auf Ihrer Festplatte gespeichert. Weitere Informationen finden Sie unter Cookies und Sitzungsstatus weiter unten in diesem Artikel.

Das vorangegangene Beispiel besitzt folgende Einschränkung: Wenn das Cookie über Unterschlüssel verfügt, werden diese als einzelne Name/Wert-Zeichenfolge angezeigt. Anhand der Cookieeigenschaft HasKeys (in Englisch) können Sie ablesen, ob das Cookie über Unterschlüssel verfügt. Falls ja, können Sie ein Drilldown in die Unterschlüsselauflistung durchführen, um Namen und Werte der einzelnen Unterschlüssel zu ermitteln.

Wie bereits weiter oben erwähnt, lassen sich Informationen über die Unterschlüssel aus der Cookieeigenschaft Values (in Englisch) ablesen, bei der es sich um eine Auflistung vom Typ NameValueCollection handelt. Unterschlüsselwerte können aus der Values-Auflistung direkt nach dem Indexwert gelesen werden. Die entsprechenden Unterschlüsselnamen stehen im AllKeys-Member (in Englisch) der Values-Auflistung zur Verfügung, die eine Auflistung von Zeichenfolgen zurückgibt.

Das folgende Beispiel zeigt eine Variation des vorherigen Beispiels. Es führt eine Überprüfung auf Unterschlüssel mithilfe der HasKeys-Eigenschaft durch. Falls Unterschlüssel erkannt werden, ruft das Beispiel Unterschlüssel von der Values-Auflistung ab:

Dim i As Integer 
Dim j As Integer 
Dim output As String = "" 
Dim aCookie As HttpCookie 
Dim subkeyName As String 
Dim subkeyValue As String 
For i = 0 To Request.Cookies.Count - 1 
   aCookie = Request.Cookies(i) 
   output &= "Name = " & aCookie.Name & "<br>" 
   If aCookie.HasKeys Then 
   For j = 0 To aCookie.Values.Count - 1 
   subkeyName = Server.HtmlEncode(aCookie.Values.AllKeys(j)) 
   subkeyValue = Server.HtmlEncode(aCookie.Values(j)) 
   output &= "Unterschlüsselname = " & subkeyName & "<br>" 
   output &= "Unterschlüsselwert = " & subkeyValue & "<br><br>" 
  Next 
   Else 
  output &= "Wert = " & Server.HtmlEncode(aCookie.Value) & "<br><br>" 
   End If 
Next 
Label1.Text = output

Alternativ dazu können Sie die Unterschlüssel als ein NameValueCollection-Objekt extrahieren, wie hier gezeigt:

If aCookie.HasKeys Then 
   Dim CookieValues As _ 
   System.Collections.Specialized.NameValueCollection = aCookie.Values 
   Dim CookieValueNames() As String = CookieValues.AllKeys 
   For j = 0 To CookieValues.Count - 1 
   subkeyName = Server.HtmlEncode(CookieValueNames(j)) 
   subkeyValue = Server.HtmlEncode(CookieValues(j)) 
   output &= "Unterschlüsselname = " & subkeyName  & "<br>" 
   output &= "Unterschlüsselwert = " & subkeyValue & "<br><br>" 
   Next 
Else 
   output &= "Wert = " & aCookie.Value & "<br><br>" 
End If

Anmerkung:
Zur Erinnerung: Die Server.HtmlEncode-Methode wird nur aufgerufen, weil die Werte des Cookies auf der Seite angezeigt werden. Wenn Sie nur den Wert eines Cookies testen, müssen Sie den Wert vor seiner Verwendung nicht codieren.

 

Ändern und Löschen von Cookies

In bestimmten Situationen möchten Sie ein Cookie eventuell bearbeiten, um z.B. seinen Wert zu ändern oder seine Gültigkeitsdauer zu erweitern. (Denken Sie daran, dass Sie das Gültigkeitsdatum eines Cookies nicht lesen können, weil der Browser die Gültigkeitsinformationen nicht an den Server übergibt.)

Natürlich bearbeiten Sie ein Cookie nicht direkt. Wenn Sie auch ein Cookie von der Request.Cookies-Auflistung abrufen und verändern können, befindet sich das Cookie selbst weiterhin irgendwo auf der Festplatte des Benutzers. Das Bearbeiten eines Cookies besteht also in Wirklichkeit darin, ein neues Cookies mit neuen Werten zu erstellen und das Cookie an den Browser zu senden, um die alte Version auf dem Client zu überschreiben.

Das folgende Beispiel zeigt, wie Sie den Wert eines Cookies ändern können, das einen Zähler der Benutzerbesuche einer Site speichert.

Dim counter As Integer 
If Request.Cookies("counter") Is Nothing Then 
 counter = 0 
Else 
 counter = CInt(Request.Cookies("counter").Value) 
End If 
counter += 1 
Response.Cookies("counter").Value = counter.ToString 
Response.Cookies("counter").Expires = DateTime.Now.AddDays(1)

<br>
Oder als alternative Möglichkeit:<br>

Dim ctrCookie As HttpCookie 
Dim counter As Integer 
If Request.Cookies("counter") Is Nothing Then 
 ctrCookie = New HttpCookie("counter") 
Else 
 ctrCookie = Request.Cookies("counter") 
End If 
counter = CInt(ctrCookie.Value) + 1 
ctrCookie.Value = counter.ToString 
ctrCookie.Expires = DateTime.Now.AddDays(1) 
Response.Cookies.Add(ctrCookie)

 

Löschen von Cookies

Das Löschen eines Cookies (das tatsächliche Entfernen von der Festplatte des Benutzers) ist eine Variation seiner Bearbeitung. Das direkte Löschen eines Cookies ist nicht möglich, weil sich das Cookie auf dem Computer von Benutzern befindet. Sie können jedoch den Browser veranlassen, das Cookie für Sie zu löschen. Das Verfahren besteht darin, das Cookie wie oben beschrieben zu ändern (das heißt ein neues Cookie mit demselben Namen zu erstellen), aber dann ein Gültigkeitsdatum vor dem aktuellen Datum anzugeben. Sobald der Browser das Gültigkeitsdatum des Cookies überprüft, verwirft der Browser das jetzt veraltete Cookie.

Das Löschen eines beliebigen Cookies entspricht deshalb dem Erstellen dieses Cookies, mit Ausnahme der Tatsache, dass Sie ein Datum in der Vergangenheit wählen. Das folgende Beispiel ist etwas interessanter als das Löschen eines einzelnen Cookies: Es zeigt eine Methode zum Löschen aller Cookies für die aktuelle Domäne.

Dim i As Integer 
Dim cookieName As String 
Dim limit As Integer = Request.Cookies.Count - 1 
For i = 0 To limit 
   aCookie = Request.Cookies(i) 
   aCookie.Expires = DateTime.Now.AddDays(-1) 
   Response.Cookies.Add(aCookie) 
Next

 

Ändern oder Löschen von Unterschlüsseln

Die Bearbeitung einzelner Unterschlüssel entspricht ebenfalls ihrer Erstellung.

Response.Cookies("userInfo")("lastVisit") = DateTime.Now.ToString 
Response.Cookies("userInfo").Expires = DateTime.Now.AddDays(1)

Ein etwas komplizierteres Problem besteht im Löschen eines einzelnen Unterschlüssels. Sie können nicht einfach das Gültigkeitsdatum für das Cookie zurücksetzen, da dies das gesamte Cookie anstatt eines einzelnen Unterschlüssels löschen würde. Die Lösung besteht stattdessen darin, die Values-Auflistung des Cookies zu ändern, in der die Unterschlüssel gespeichert sind. Erstellen Sie zunächst das Cookie erneut, indem Sie es aus dem Request.Cookies-Objekt abrufen. Sie können anschließend die Remove-Methode der Values-Auflistung aufrufen und der Remove-Methode den Namen des zu löschenden Unterschlüssels übergeben. Dann fügen Sie wie gewohnt das bearbeitete Cookie der Response.Cookies-Auflistung hinzu, damit es in seiner veränderten Form zurück an den Browser gesendet wird.

Der folgende Code zeigt das Löschen eines Unterschlüssels. Im Beispiel wird der Name des zu löschenden Unterschlüssels in einer Variablen angegeben.

Dim subkeyName As String 
subkeyName = "userName" 
Dim aCookie As HttpCookie = Request.Cookies("userInfo") 
aCookie.Values.Remove(subkeyName) 
aCookie.Expires = DateTime.Now.AddDays(1) 
Response.Cookies.Add(aCookie)

 

Cookies und Sicherheit

Bei der Arbeit mit Cookies müssen Sie sich der damit verbundenen Sicherheitsrisiken bewusst sein. Mit dem Begriff Sicherheit sind hier keine datenschutzrechtlichen Aspekte gemeint, wie diese im Abschnitt Was sind Cookies? weiter oben beschrieben werden. Datenschutz ist vielmehr ein Thema für Benutzer, die Bedenken haben, wie die Informationen in Cookies verwendet werden können. Die Sicherheitsprobleme mit Cookies sind ähnlich wie beim Abrufen von Daten von einem Client. Was zunächst Ihre Anwendung anbelangt, sind Cookies eine andere Form von Benutzereingabe und aus diesem Grund Formen der Datenspionage und Datenfälschung ausgesetzt. Benutzer können zumindest die in einem Cookie gespeicherten Daten einsehen, da das Cookie auf dem eigenen Computer von Benutzern verfügbar ist. Wenn Benutzer dies wünschen, können sie das Cookie auch ändern, bevor es der Browser an Sie sendet.

Als Fazit lässt sich festhalten, dass Sie niemals geheime Informationen in einem Cookie speichern sollten, z.B. Benutzernamen, Kennwörter, Kreditkartennummern usw. Fügen Sie keine Informationen in ein Cookie ein, die nicht in die Hände von Benutzern oder Personen geraten sollten, die Interesse daran haben könnten, das Cookie auf irgend eine Weise zu stehlen.

Stehen Sie auch den Informationen, die Sie über Cookies erhalten, immer skeptisch gegenüber. Setzen Sie nicht voraus, dass die empfangenen Daten mit den von Ihnen geschriebenen Daten identisch sind. Wenden Sie dieselben Sicherheitsmaßennahmen bei der Arbeit mit Cookiewerten an, wie Sie diese bei Daten verwenden würden, die Benutzer auf einer Webseite eingegeben haben. So habe ich z.B. HTML-Codierung auf den Inhalt eines Cookies angewandt, bevor der Wert auf einer Seite anzeigt wurde. Dies ist ein Standardverfahren für das Sichern von Informationen, die Sie anzeigen, nachdem Sie diese von Benutzern erhalten haben, und die Arbeit mit Cookies ist nicht anders.

Ein weiterer Aspekt ist die Tatsache, dass Cookies zwischen Browser und Server als reiner Text gesendet werden, und alle Personen, die Ihren Webverkehr abfangen können, auch in der Lage sind, das Cookie zu lesen. Sie können eine Cookieeigenschaft festlegen, die bewirkt, dass das Cookie nur dann übertragen wird, wenn die Verbindung das Secure Sockets Layer-Protokoll (das heißt https://) verwendet. Das SSL-Protokoll schützt das Cookie nicht vor dem Lesen oder einer Änderung, während es sich auf dem Computer von Benutzern befindet, jedoch verhindert es das Abfangen des Cookies während der Übertragung. In diesem Artikel kann zwar auf SSL nicht eingegangen werden, aber Sie sollten wissen, dass Sie Cookies mit einem Übertragungsschutz versehen können. Weitere Informationen über SSL finden Sie im Artikel Secure Sockets Layer: Protect Your E-Commerce Web Site with SSL and Digital Certificates (in Englisch).

Wie lassen sich Cookies also angesichts dieser Sicherheitsrisiken sicher verwenden? Sie können nicht kritische Daten in Cookies speichern, wie etwa Benutzervoreinstellungen oder andere Informationen, die bei einer Beeinträchtigung keine schwerwiegenden Auswirkungen für Ihre Anwendung haben. Wenn Sie vertrauliche Informationen, wie etwa eine Benutzer-ID, in einem Cookie speichern möchten, können Sie das Cookie verschlüsseln. Eine Möglichkeit dafür ist die Verwendung der ASP.NET Forms Authentication-Dienstprogramme zur Erstellung eines Authentifizierungstickets, das als Cookie gespeichert wird. In diesem Artikel wird zwar nicht auf das Thema Verschlüsselung eingegangen, aber wenn Sie vertrauliche Daten in einem Cookie speichern möchten, sollten Sie die Ihnen zur Verfügung stehenden Möglichkeiten untersuchen, um Informationen vor potenziellen Eindringlingen und Fälschern zu verbergen.

Weitere Informationen zu Cookies und Sicherheitsrisiken finden Sie im Artikel Mitigating Cross-site Scripting With HTTP-only Cookies (in Englisch).

 

Überprüfen, ob ein Browser Cookies annimmt

Weiter oben im Abschnitt Einschränkungen von Cookies wurde das potenzielle Problem erwähnt, dass Benutzer ihren Browser so eingestellt haben, dass Cookies abgelehnt werden. Wie wissen Sie also, ob Sie Cookies lesen und schreiben können? Es wird kein Fehler ausgelöst, falls ein Cookie nicht geschrieben werden kann (so löst z.B. Response.Cookies keine Ausnahme aus), da der Server nicht verfolgt, was nach Übertragung der Seite geschieht. Der Browser sendet ebenfalls keine Informationen zu seinen aktuellen Cookieeinstellungen an den Server. (Falls Sie sich wundern: Die HttpBrowserCapabilities.Cookies Property-Eigenschaft (in Englisch) enthält keine Informationen darüber, ob Cookies aktiviert sind, sondern ob der aktuelle Browser allgemein Cookies unterstützt.)

Eine Möglichkeit zur Ermittlung, ob Cookies angenommen werden, besteht darin, ein Cookie zu schreiben und es dann wieder zu lesen. Wenn Sie das von Ihnen geschriebene Cookie nicht lesen können, ist davon auszugehen, dass Cookies im Browser deaktiviert sind.

Ich habe ein einfaches Beispiel dafür zusammengestellt, wie Sie testen können, ob Cookies angenommen werden. Das Beispiel besteht aus zwei Seiten. Auf der ersten Seite wird ein Cookie geschrieben und anschließend der Browser auf die zweite Seite umgeleitet. Die zweite Seite versucht, das Cookie zu lesen. Diese leitet den Browser wiederum auf die erste Seite um, wobei dem URL eine Abfragezeichenfolgenvariable mit dem Ergebnis des Tests hinzugefügt wird.

Der Code für die erste Seite sieht folgendermaßen aus:

Sub Page_Load() 
   If Not Page.IsPostBack Then 
   If Request.QueryString("AcceptsCookies") Is Nothing Then 
  Response.Cookies("TestCookie").Value = "ok" 
  Response.Cookies("TestCookie").Expires = _ 
  DateTime.Now.AddMinutes(1) 
  Response.Redirect("TestForCookies.aspx?redirect=" & _ 
  Server.UrlEncode(Request.Url.ToString)) 
   Else 
  labelAcceptsCookies.Text = "Cookies annehmen = " & _ 
  Request.QueryString("AcceptsCookies") 
   End If 
   End If 
End Sub

Die erste Seite testet, ob es sich um eine Rückübertragung handelt. Falls nicht, sucht sie nach der Abfragezeichenfolgenvariablen (AcceptsCookies) mit dem Testergebnis. Falls keine Abfragezeichenvariable vorhanden ist, wird der Test abgeschlossen, weshalb der Code ein Cookie mit der Bezeichnung "TestCookie" schreibt. Nach dem Schreiben des Cookies ruft das Beispiel Response.Redirect zur Übertragung der Testseite (TestForCookies.aspx) auf. Angehängt an den URL der Testseite ist eine Abfragezeichenfolgenvariable mit der Bezeichnung redirect, die den URL der aktuellen Seite enthält. Dies ermöglicht eine Umleitung zurück zu dieser Seite nach Durchführung des Tests.

Die Testseite kann vollständig aus Code bestehen und muss auch keine Steuerelemente enthalten. So sieht der verwendete Code aus:

Sub Page_Load() 
 Dim redirect As String = Request.QueryString("redirect") 
 Dim acceptsCookies As String 
 ' Wurde das Cookie angenommen? 
 If Request.Cookies("TestCookie") Is Nothing Then 
  ' Kein Cookie, deshalb wurde es nicht angenommen 
  acceptsCookies = 0 
 Else 
  acceptsCookies = 1 
  ' Testcookie löschen 
  Response.Cookies("TestCookie").Expires = _ 
  DateTime.Now.AddDays(-1) 
 End If 
 Response.Redirect(redirect & "?AcceptsCookies=" & acceptsCookies, _ 
 True) 
End Sub

Nach dem Lesen der redirect-Abfragezeichenvariablen versucht der Code, das Cookie zu lesen. Falls das Cookie tatsächlich existiert, wird es aus Verwaltungsgründen sofort gelöscht. Nach Beendigung des Tests konstruiert der Code einen neuen URL aus dem URL, der ihm in der redirect-Abfragezeichenvariablen übergeben wurde. Der neue URL enthält auch eine Abfragezeichenvariable mit den Testergebnissen. Der letzte Schritt besteht in der Verwendung der neuen URL, um den Browser an die ursprüngliche Seite zurückzuleiten.

Das Beispiel ist zwar ziemlich einfach, aber es illustriert das grundlegende Testprinzip des Verfahrens auf Versuchsbasis. Eine offensichtliche Verbesserung würde darin bestehen, die Cookietestergebnisse in einem permanenten Speicher zu sammeln, damit der Test nicht jedes Mal wiederholt werden müsste, wenn Benutzer die ursprüngliche Seite anzeigen. Dies ist jedoch etwas komplizierter, als es aussieht. Cookies funktionieren aus offensichtlichen Gründen nicht immer. Eine weitere Möglichkeit wäre die Speicherung der Testergebnisse im Sitzungsstatus. Der Sitzungsstatus ist jedoch standardmäßig auch von Cookies abhängig, und wenn der Browser keine Cookies akzeptiert, funktioniert auch der Sitzungsstatus nicht. Die Lösung für dieses letzte Problem wäre die Verwendung eines "cookiefreien" Sitzungsstatus. Im nächsten Abschnitt erhalten Sie einen kurzen Überblick darüber, wie der Sitzungsstatus mit Cookies arbeitet.

 

Cookies und Sitzungsstatus

Sobald ein Benutzer zu Ihrer Site navigiert, stellt der Server eine einmalige Sitzung für diesen Benutzer her, die solange wie der Besuch des Benutzers dauert. Für jede Sitzung verwaltet ASP.NET eine serverbasierte Struktur ("Sitzungsstatus"), in der Anwendungen benutzerspezifische Informationen speichern können. Weitere Informationen finden Sie im Artikel Session State (in Englisch).

ASP.NET muss in der Lage sein, eine Sitzungs-ID für jeden Benutzer zu überwachen, damit Benutzer den Sitzungsstatusinformationen auf dem Server zugeordnet werden können. Standardmäßig verwendet ASP.NET ein nicht beständiges Cookie zum Speichern des Sitzungsstatus. Wenn Sie den Beispielcode unter "Lesen von Cookieauflistungen" im Abschnitt Lesen von Cookies verwendet haben, konnten Sie wahrscheinlich unter den Cookies ein Sitzungsstatuscookie erkennen.

Wenn jedoch Benutzer im Browser Cookies deaktiviert haben, kann der Sitzungsstatus kein Cookie zum Speichern der Sitzungs-ID verwenden, und der Sitzungsstatus funktioniert nicht. Aus diesem Grund habe ich weiter oben im Abschnitt Überprüfen, ob ein Browser Cookies annimmt erwähnt, dass es nach dem Testen auf Cookies nicht praktisch ist, die Ergebnisse im Sitzungsstatus zu speichern - kein Cookie, kein Sitzungsstatus.

ASP.NET bietet eine Lösung in Form von "cookiefreien" Sitzungen. Sie können Ihre Anwendung für die Speicherung der Sitzungs-ID nicht in einem Cookie, sondern im URL der Seiten auf Ihrer Site konfigurieren. Indem die Sitzungs-ID im URL belassen wird, speichert ASP.NET die ID gewissermaßen im Browser, und erhält diese zurück, sobald Benutzer eine weitere Seite aufrufen.

Cookiefreie Sitzungen ermöglichen Ihnen die Umgehung des Problem eines Browsers, der Cookies ablehnt, sowie die Arbeit mit Sitzungsstatus. Wenn Ihre Anwendung vom Sitzungsstatus abhängig ist, ist es eventuell sinnvoll, diese für die Verwendung von cookiefreien Sitzungen zu konfigurieren. In einigen wenigen Situationen, z.B. wenn ein Benutzer den URL mit einer anderen Person gemeinsam verwendet (z.B. beim Versenden des URL als E-Mail an einen Kollegen, während die Sitzung des Benutzers noch aktiv ist), kann es vorkommen, dass beide Benutzer dieselbe Sitzung gemeinsam verwenden, was zu nicht vorhersehbaren Ergebnissen führen kann.

Weitere Informationen zur Konfiguration Ihrer Anwendung für die Verwendung cookiefreier Sitzungen finden Sie im Knowledge Base-Artikel INFO: ASP.NET: Statusverwaltung.