(0) exportieren Drucken
Alle erweitern
Dieser Artikel wurde manuell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen.
Übersetzung
Original

Übersicht über den ASP.NET-Ansichtszustand

Der Ansichtszustand ist die Methode, die vom ASP.NET-Seitenframework verwendet wird, um die Werte der Seiten und Steuerelemente zwischen den Roundtrips beizubehalten. Beim Rendern des HTML-Markups für die Seite werden der aktuelle Zustand der Seite und die Werte, die während des Postbacks beibehalten werden müssen, in Base64-codierten Zeichenfolgen serialisiert. Diese Informationen werden anschließend in dem ausgeblendeten Feld bzw. in den ausgeblendeten Feldern für den Ansichtszustand abgelegt.

Dieses Thema enthält folgende Abschnitte:

Der Ansichtszustand wird automatisch vom ASP.NET-Seitenframework zum Beibehalten von Informationen verwendet, die zwischen den Postbacks erhalten bleiben müssen. Zu diesen Informationen gehören alle nicht standardmäßigen Werte von Steuerelementen.

Sie können den Ansichtszustand auch verwenden, um seitenspezifische Anwendungsdaten zu speichern.

Zurück nach oben

Der Ansichtszustand ist ein Repository in einer ASP.NET-Seite, die die während des Postbacks beizubehaltenden Werte speichern kann. Der Ansichtszustand wird vom Seitenframework verwendet, um Steuerelementeinstellungen zwischen Postbacks beizubehalten.

Sie können den Ansichtszustand in Ihren eigenen Anwendungen verwenden, um Folgendes auszuführen:

  • Beibehalten von Werten zwischen Postbacks, ohne diese im Sitzungszustand oder in einem Benutzerprofil zu speichern.

  • Speichern der von Ihnen festgelegten Werte für Seiten- oder Steuerelementeigenschaften.

  • Erstellen eines benutzerdefinierten Anbieters für den Ansichtszustand zum Speichern von Ansichtszustandsinformationen in einer SQL Server-Datenbank oder einem anderen Datenspeicher.

Sie können im Ansichtszustand beispielsweise Informationen speichern, auf die beim nächsten Senden der Seite an den Server während des Ladeereignisses im Code zugegriffen werden kann. Empfehlungen zur Verwendung finden Sie unter Empfehlungen zur ASP.NET-Zustandsverwaltung.

Zurück nach oben

Eine Webanwendung ist zustandsfrei. Bei jeder Anforderung der Seite vom Server wird eine neue Instanz der Webseitenklasse erstellt. Normalerweise würden daher bei jedem Roundtrip alle Informationen der Seite und ihrer Steuerelemente verloren gehen. Wenn ein Benutzer auf einer HTML-Webseite beispielsweise Informationen in einem Textfeld eingibt, werden diese Informationen standardmäßig an den Server gesendet. Sie werden jedoch in der Antwort an den Browser nicht zurückgegeben.

Um diese systeminterne Einschränkung der Webprogrammierung zu umgehen, enthält das ASP.NET-Seitenframework mehrere Zustandsverwaltungsfeatures zum Beibehalten der Seiten- und Steuerelementwerte zwischen den Roundtrips zum Webserver. Eines dieser Features ist der Ansichtszustand. Informationen zu weiteren Features der Zustandsverwaltung finden Sie unter Übersicht über die ASP.NET-Zustandsverwaltung.

Der Ansichtszustand wird vom ASP.NET-Seitenframework standardmäßig verwendet, um die Seiten- und Steuerelementwerte zwischen den Roundtrips beizubehalten. Beim Rendern von HTML für die Seite werden der aktuelle Zustand der Seite und die Werte, die während des Postbacks beibehalten werden müssen, in Base64-codierten Zeichenfolgen serialisiert. Anschließend werden sie in ein oder mehrere ausgeblendete Felder in die Seite eingefügt.

Sie können im Code mit der Eigenschaft ViewState der Seite auf den Ansichtszustand zugreifen. Bei der ViewState-Eigenschaft handelt es sich um ein Wörterbuch, das Schlüssel-Wert-Paare mit den Ansichtszustandsdaten enthält.

SicherheitshinweisSicherheitshinweis

Für böswillige Benutzer ist es einfach, die Inhalte eines ausgeblendeten Felds anzuzeigen und zu ändern. Weitere Informationen zum Sichern von Ansichtszustandsdaten finden Sie weiter unten in diesem Thema unter Sichern des Ansichtszustands.

Empfehlungen dazu, wann Sie Informationen im Ansichtszustand speichern sollten, finden Sie unter Empfehlungen zur ASP.NET-Zustandsverwaltung.

Sie können das Standardverhalten ändern und den Ansichtszustand an einem anderen Speicherort speichern (z. B. in einer SQL Server-Datenbank), indem Sie eine benutzerdefinierte PageStatePersister-Klasse zum Speichern der Seitendaten implementieren. Ein Beispiel für das Speichern des Seitenzustands in einem Stream statt in einem ausgeblendeten Feld finden Sie im Beispiel für die PageStatePersister-Klasse.

Überlegungen zur Verwendung des Ansichtszustands

Der Ansichtszustand enthält Zustandsinformationen für eine bestimmte ASP.NET-Seite. Wenn Sie Informationen auf mehr als einer Seite verwenden müssen oder wenn Informationen bei mehreren Besuchen einer Website beibehalten werden sollen, empfiehlt es sich, zum Verwalten des Zustands eine andere Methode zu verwenden. Sie können den Anwendungszustand, den Sitzungszustand oder die Profileigenschaften verwenden. Weitere Informationen finden Sie unter Gewusst wie: Übergeben von Werten zwischen ASP.NET-Webseiten.

Ansichtszustandsinformationen werden in XML serialisiert und anschließend mit Base64-Codierung verschlüsselt. Dies führt u. U. zum Entstehen großer Datenmengen. Der Inhalt des Ansichtszustands wird beim Senden der Seite zum Server als Teil der Postbackinformationen gesendet. Wenn der Ansichtszustand große Informationsmengen enthält, kann dies die Leistung der Seite beeinflussen. Testen Sie die Leistung Ihrer Seiten mit typischen Daten, um für Ihre Anwendung festzulegen, ob die Größe des Ansichtszustands Leistungsprobleme verursacht.

Beachten Sie außerdem, dass von einigen Proxys und Firewalls der Zugriff auf eine Seite verhindert wird, wenn die Datenmenge in einem ausgeblendeten Feld sehr groß ist. Da die zulässige Höchstmenge mit unterschiedlichen Firewall- und Proxyimplementierungen variiert, werden durch große ausgeblendete Felder möglicherweise Probleme verursacht. Wenn die in der Eigenschaft ViewState gespeicherte Datenmenge den Wert übersteigt, der in der Eigenschaft MaxPageStateFieldLength der Seite festgelegt ist, wird der Ansichtszustand von der Seite in mehrere ausgeblendete Felder aufgeteilt. Dies verhindert, dass die Größe einzelner ausgeblendeter Felder die von Firewalls akzeptierte Größe überschreitet.

Der Ansichtszustand wird standardmäßig aktiviert, aber einige Steuerelemente auf einer Seite könnten keinen Ansichtszustand benötigen. Wenn ein Steuerelement auf einer Seite bei jedem Postback vom Datenspeicher aktualisiert wird, können Sie den Ansichtszustand für dieses Steuerelement ausschalten, um die Größe des Ansichtszustands zu verringern.

Sie können Steuerelemente so konfigurieren, dass der Ansichtszustand standardmäßig für alle Steuerelemente innerhalb einer Seite oder eines Containersteuerelements deaktiviert wird, und dann den Ansichtszustand für bestimmte Steuerelemente aktivieren. Sie können Steuerelemente auch so konfigurieren, dass der Ansichtszustand deaktiviert und nicht für untergeordnete Steuerelemente aktiviert wird.

Um den Ansichtszustand für ein Steuerelement standardmäßig zu deaktivieren, damit er für untergeordnete Steuerelemente aktiviert werden kann, legen Sie die ViewStateMode-Eigenschaft des Steuerelements auf Disabled fest. Um den Ansichtszustand standardmäßig für eine komplette Seite zu deaktivieren, legen Sie das ViewStateMode-Attribut der @ Page-Direktive auf Disabled fest.

Um den Ansichtszustand für ein Steuerelement und seine untergeordneten Elemente zu deaktivieren, damit er nicht für untergeordnete Steuerelemente aktiviert werden kann, legen Sie die EnableViewState-Eigenschaft des Steuerelements auf false fest. Um den Ansichtszustand für eine ganze Seite und all ihre untergeordneten Steuerelemente zu deaktivieren, legen Sie das EnableViewState-Attribut der @ Page-Direktive auf false fest.

HinweisHinweis

Selbst bei explizit deaktiviertem Ansichtszustand wird ein ausgeblendetes Feld an den Browser gesendet, um anzugeben, dass für die Seite ein Postback erfolgt.

Alternativen zum Verwenden des Ansichtszustands finden Sie unter Empfehlungen zur ASP.NET-Zustandsverwaltung.

Einige mobile Geräte lassen gar keine ausgeblendeten Felder zu. Deshalb funktioniert der Ansichtszustand bei diesen Geräten nicht. Weitere Informationen und Alternativen finden Sie unter ASP.NET-Websites für mobile Geräte.

Steuerelementzustand

Von ASP.NET wird zusätzlich zum Ansichtszustand der Steuerelementzustand unterstützt. Selbst wenn der Ansichtszustand für eine Seite oder für ein Steuerelement deaktiviert ist, behält die Seite mithilfe des Steuerelementzustands die Steuerelementinformationen bei, die zwischen den Postbacks erhalten bleiben müssen. Wie der Ansichtszustand wird der Steuerelementzustand in einem oder mehreren ausgeblendeten Feldern gespeichert.

Speichern von Werten im Ansichtszustand

Sie können auf die Ansichtszustandsinformationen über die ViewState-Eigenschaft der Seite zugreifen, durch die ein Wörterbuchobjekt verfügbar gemacht wird. Sie können dieses Wörterbuch verwenden, um benutzerdefinierte Werte zu speichern. Sie können beispielsweise den Wert von benutzerdefinierten Eigenschaften speichern, die Sie auf der Seite festlegen.

Da der Ansichtszustand als ausgeblendetes Feld gesendet wird, können Änderungen des Ansichtszustands auf der Seite bis zum Eintreten des PreRenderComplete-Ereignisses vorgenommen werden. Nach dem Rendern der Seite für den Browser werden Änderungen des Ansichtszustands nicht gespeichert.

Die Informationen im ausgeblendeten Ansichtszustandsfeld können vom Benutzer angezeigt werden, wenn der Quellcode der Webseite angezeigt und die Base-64-codierten Zeichenfolgen dekodiert werden können. Dies stellt ein mögliches Sicherheitsproblem dar. Weitere Informationen zu Sicherheitsproblemen im Zusammenhang mit dem Ansichtszustand finden Sie weiter unten in diesem Thema unter Sichern des Ansichtszustands.

HinweisHinweis

Um die Eigenschaft ViewState verwenden zu können, muss die ASP.NET-Webseite über ein form-Element mit dem Attribut runat="server" verfügen.

Um einen Wert im Ansichtszustand zu speichern, erstellen Sie ein neues Element mit dem zu speichernden Wert und fügen das Element dem Ansichtszustandswörterbuch hinzu. Im folgenden Beispiel ist eine ASP.NET-Webseite mit Code dargestellt, in dem eine Zeichenfolge und ein Ganzzahlwert im Ansichtszustand gespeichert wird.

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
  // Sample ArrayList for the page.
  ArrayList PageArrayList;

  ArrayList CreateArray()
  {
    // Create a sample ArrayList.
    ArrayList result = new ArrayList(4);
    result.Add("item 1");
    result.Add("item 2");
    result.Add("item 3");
    result.Add("item 4");
    return result;
  }

  void Page_Load(object sender, EventArgs e)
  {
    if (ViewState["arrayListInViewState"] != null)
    {
      PageArrayList = (ArrayList)ViewState["arrayListInViewState"];
    }
    else
    {
      // ArrayList isn't in view state, so it must be created and populated.
      PageArrayList = CreateArray();
    }
    // Code that uses PageArrayList.
  }
    
  void Page_PreRender(object sender, EventArgs e)
  {
    // Save PageArrayList before the page is rendered.
    ViewState.Add("arrayListInViewState", PageArrayList);
  }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>View state sample</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    </div>
    </form>
</body>
</html>

Datentypen, die Sie im Ansichtszustand speichern können

Die folgenden Objekttypen können im Ansichtszustand gespeichert werden:

  • Zeichenfolgen

  • Ganze Zahlen

  • Boolean -Werte

  • Array -Objekte

  • ArrayList -Objekte

  • Hashtabellen

  • Benutzerdefinierte Typkonverter (weitere Informationen finden Sie in der TypeConverter-Klasse)

Andere Datentypen können ebenfalls gespeichert werden, die Klasse muss jedoch mit dem Serializable-Attribut kompiliert werden, sodass die Werte für den Ansichtszustand serialisiert werden können.

Lesen von Werten aus dem Ansichtszustand

Um einen Wert aus dem Ansichtszustand zu lesen, rufen Sie die ViewState-Eigenschaft der Seite auf und lesen anschließend den Wert aus dem Ansichtszustandswörterbuch.

Im folgenden Beispiel wird veranschaulicht, wie Sie das ArrayList-Objekt mit dem Namen arrayListInViewState aus dem Ansichtszustand abrufen und anschließend ein GridView-Steuerelement als Datenquelle an das Objekt binden können.

arrayList = new ArrayList();
arrayList = (ArrayList)ViewState["arrayListInViewState"];

this.GridView1.DataSource = arrayList;
this.GridView1.DataBind();

Werte im Ansichtszustand werden als String typisiert. Wenn Sie in Visual Basic Option Strict On festlegen, müssen Sie die Ansichtszustandswerte vor ihrer Verwendung in den geeigneten Typ umwandeln, wie im vorherigen Beispiel dargestellt. In C# müssen Sie immer in den geeigneten Typ umwandeln, wenn Sie die Ansichtszustandswerte lesen.

Wenn Sie versuchen, einen Wert aus einem nicht vorhandenen Ansichtszustand abzurufen, wird keine Ausnahme ausgelöst. Um sicherzustellen, dass der Wert im Ansichtszustand vorhanden ist, überprüfen Sie zuerst, ob das Objekt vorhanden ist. Im folgenden Beispiel ist die Überprüfung auf einen Ansichtszustandseintrag dargestellt.

if (ViewState["color"] == null)
    // No such value in view state, take appropriate action.

Wenn Sie versuchen, einen nicht vorhandenen Ansichtszustandseintrag auf andere Weise zu verwenden (beispielsweise, um seinen Typ zu untersuchen), wird eine NullReferenceException-Ausnahme ausgelöst.

Zurück nach oben

Sichern des Ansichtszustands

Standardmäßig werden Ansichtszustandsdaten in einem ausgeblendeten Feld auf der Seite gespeichert und mit Base64 codiert. Außerdem wird mithilfe eines MAC-Schlüssels (Machine Authentication Code) ein Hashwert der Ansichtszustandsdaten erstellt. Der Hashwert wird den codierten Ansichtszustandsdaten hinzugefügt, und die daraus resultierende Zeichenfolge wird auf der Seite gespeichert. Wenn die Seite an den Server zurückgesendet wird, berechnet das ASP.NET-Seitenframework den Hashwert erneut und vergleicht ihn mit dem im Ansichtszustand gespeicherten Wert. Falls die Hashwerte nicht übereinstimmen, wird eine Ausnahme ausgelöst, da die Ansichtszustandsdaten ungültig sein könnten.

Durch das Erstellen eines Hashwerts kann vom ASP.NET-Seitenframework getestet werden, ob die Ansichtszustandsdaten fehlerhaft sind oder manipuliert wurden. Doch auch wenn die Ansichtszustandsdaten nicht manipuliert wurden, können sie von böswilligen Benutzern abgefangen und gelesen werden.

Verwenden des MAC zum Berechnen des Hashwerts des Ansichtszustands

Der MAC-Schlüssel zum Berechnen des Hashwerts des Ansichtszustands wird entweder automatisch erstellt oder in der Datei "Machine.config" festgelegt. Wird der Schlüssel automatisch erstellt, wird dies auf der Grundlage der MAC-Adresse des Computers ausgeführt, bei der es sich um einen eindeutigen GUID-Wert des Netzwerkadapters für den jeweiligen Computer handelt.

Für böswillige Benutzer ist es schwierig, den MAC-Schlüssel auf der Grundlage des Hashwerts im Ansichtszustand mit Reverse Engineering-Techniken zu entschlüsseln. Die MAC-Codierung ist daher eine recht zuverlässige Möglichkeit, um zu bestimmen, ob die Ansichtszustandsdaten geändert wurden.

Grundsätzlich gilt: Je größer der zur Generierung des Hashwerts verwendete MAC-Schlüssel ist, desto unwahrscheinlicher ist es, dass zwei Hashwerte für unterschiedliche Zeichenfolgen identisch sind. Wenn der Schlüssel automatisch erstellt wird, verwendet ASP.NET die SHA1-Verschlüsselung, um einen großen Schlüssel zu erstellen. In einer Webfarmumgebung muss der Schlüssel jedoch auf allen Servern identisch sein. Wenn der Schlüssel nicht identisch ist und die Seite an einen anderen Server zurückgesendet wird, als den, der die Seite erstellt hat, löst das ASP.NET-Seitenframework eine Ausnahme aus. Daher sollten Sie in einer Webfarmumgebung einen Schlüssel in der Datei Machine.config festlegen, anstatt von ASP.NET automatisch einen Schlüssel generieren zu lassen. Beachten Sie in diesem Fall, dass der Schlüssel lang genug sein sollte, um eine ausreichende Sicherheit für den Hashwert zu gewährleisten. Je länger jedoch der Schlüssel ist, desto länger dauert es, einen Hash zu erstellen. Sie müssen daher Sicherheits- und Leistungsanforderungen abwägen.

Verschlüsseln des Ansichtszustands

Die MAC-Codierung verhindert zwar das Manipulieren der Ansichtszustandsdaten, jedoch nicht das Anzeigen der Daten durch Benutzer. Sie haben zwei Möglichkeiten, das Anzeigen der Daten zu verhindern: Sie können die Seite über SSL übermitteln oder die Ansichtszustandsdaten verschlüsseln. Zusätzlich kann Seitenanforderung über SSL Datenpaket-Sniffing und nicht autorisierten Datenzugriff durch Personen verhindern, für die die Seite nicht bestimmt ist.

Der die Seite anfordernde Benutzer kann trotzdem noch die Ansichtszustandsdaten anzeigen, da SSL die Seite zum Anzeigen im Browser entschlüsselt. Wenn von autorisierten Benutzern mit Zugriff auf die Ansichtszustandsdaten keine Gefahr ausgeht, ist dies akzeptabel. Es gibt jedoch Fälle, in denen Steuerelemente im Ansichtszustand Informationen speichern, auf die kein Benutzer zugreifen können sollte. Beispielsweise kann eine Seite ein datengebundenes Steuerelement enthalten, das Elementbezeichner (Datenschlüssel) im Ansichtszustand speichert. Wenn diese Bezeichner vertrauliche Daten wie Kunden-IDs enthalten, sollten die Ansichtszustandsdaten zusätzlich oder alternativ zur SSL-Übertragung verschlüsselt werden.

Zur Verschlüsselung der Daten legen Sie die ViewStateEncryptionMode-Eigenschaft der Seite auf true fest. Zum Speichern von Informationen im Ansichtszustand können normale Lese- und Schreibtechniken verwendet werden; die gesamte Ver- und Entschlüsselung wird von der Seite ausgeführt. Das Verschlüsseln der Ansichtszustandsdaten kann die Leistung Ihrer Anwendung beeinträchtigen. Verwenden Sie daher nur dann eine Verschlüsselung, wenn sie erforderlich ist.

Verschlüsselung des Steuerelementzustands

Steuerelemente, die den Steuerelementzustand verwenden, können eine Verschlüsselung des Ansichtszustands erfordern. Dies wird durch den Aufruf der RegisterRequiresViewStateEncryption-Methode mitgeteilt. Sobald für ein einzelnes Steuerelement auf der Seite die Verschlüsselung des Ansichtszustands erforderlich ist, wird der gesamte Ansichtszustand der Seite verschlüsselt.

Benutzerbezogene Verschlüsselung des Ansichtszustands

Wenn Sie für die Website die Benutzerauthentifizierung verwenden, können Sie durch Festlegen der ViewStateUserKey-Eigenschaft im Page_Init-Ereignishandler den Ansichtzustand der Seite einem bestimmten Benutzer zuordnen. Dadurch können One-Click-Angriffe verhindert werden, bei denen ein böswilliger Benutzer eine gültige, vollständig vorausgefüllte Webseite mit Ansichtszustandsdaten einer vorher erstellten Seite erstellt. Das Opfer wird vom Angreifer dazu gebracht, auf einen Link zu klicken, durch den die Seite mit der Identität des Opfers an den Server gesendet wird.

Wenn die ViewStateUserKey-Eigenschaft festgelegt wird, wird zum Erstellen des Hashwerts des Ansichtszustands der ursprünglichen Seite die Identität des Angreifers verwendet. Wenn das Opfer aufgrund von Täuschung die Seite zurücksendet, sind die Hashwerte unterschiedlich, da die Benutzerschlüssel unterschiedlich sind. Die Seite besteht die Überprüfung nicht, und eine Ausnahme wird ausgelöst.

Die ViewStateUserKey-Eigenschaft muss für den jeweiligen Benutzer einem eindeutigen Wert zugeordnet werden, beispielsweise dem Benutzernamen oder -bezeichner.

Sichern der Konfiguration in Umgebungen mit gemeinsamen Hostservern

In einer Umgebung mit gemeinsamen Hostservern können böswillige Benutzer möglicherweise Zustandsverwaltungseigenschaften manipulieren, die andere Anwendungen auf dem Computer betreffen. Dies kann durch direktes Manipulieren der Datei Machine.config durchgeführt werden, durch Manipulationen mithilfe der Konfigurationsklassen oder mit anderen Verwaltungs- und Konfigurationstools. Sie können Änderungen an Ihrer Anwendungskonfiguration verhindern, indem Sie Konfigurationsabschnitte oder -dateien verschlüsseln. Weitere Informationen finden Sie unter Verschlüsseln von Konfigurationsinformationen mithilfe der geschützten Konfiguration.

ViewState

Stellt ein Wörterbuchobjekt bereit, um Werte für die gleiche Seite zwischen den Anforderungen beizubehalten.

PageStatePersister

Stellt eine Möglichkeit bereit, um einen benutzerdefinierten Mechanismus zum Speichern von Ansichtszustandsinformationen festzulegen, beispielsweise in einer SQL Server-Datenbank.

Zurück nach oben

Community-Beiträge

HINZUFÜGEN
Anzeigen:
© 2014 Microsoft