Vue d'ensemble de l'état d'affichage ASP.NET

Mise à jour : novembre 2007

L'état d'affichage est la méthode que l'infrastructure de page ASP.NET utilise par défaut pour conserver les valeurs de page et de contrôle entre les différents allers-retours. Lorsque la balise HTML pour la page est restituée, l'état actuel de la page et les valeurs qui doivent être conservées pendant la publication sont sérialisés dans des chaînes codées en base64. Ces informations sont ensuite placées dans le(s) champ(s) masqué(s) de l'état d'affichage.

Cette rubrique contient les sections suivantes :

  • Scénarios

  • Fonctionnalités ViewState

  • Contexte

  • Référence de classe

  • Ressources supplémentaires

  • Nouveautés

Scénarios

L'état d'affichage est utilisé automatiquement par l'infrastructure de page ASP.NET pour rendre persistantes des informations qui doivent être conservées entre des publications. Ces informations incluent toute valeur de contrôle non définie par défaut.

Vous pouvez également utiliser l'état d'affichage pour stocker des données d'application spécifiques à une page.

Retour au début

Fonctionnalités

L'état d'affichage est un référentiel, dans une page ASP.NET, qui peut stocker des valeurs devant être conservées lors de la publication. L'infrastructure de page utilise l'état d'affichage pour rendre des paramètres de contrôle persistants d'une publication à une autre.

Vous pouvez utiliser l'état d'affichage dans vos propres applications pour effectuer les opérations suivantes :

  • Conserver des valeurs d'une publication à une autre sans les stocker dans l'état de session ni dans un profil utilisateur ;

  • Stocker les valeurs de page ou les propriétés de contrôle que vous définissez ;

  • Créer un fournisseur d'état d'affichage personnalisé permettant de stocker des informations d'état d'affichage dans une base de données SQL Server ou dans un autre magasin de données.

Par exemple, vous pouvez stocker des informations dans l'état d'affichage pour que votre code puisse y accéder au cours de l'événement de chargement de la page, lors du prochain envoi de la page au serveur. Pour obtenir des recommandations d'utilisation, consultez Recommandations sur la gestion d'état ASP.NET.

Retour au début

Contexte

Une application Web est sans état. Une nouvelle instance de la classe de la page Web est créée chaque fois que la page est demandée à partir du serveur. Habituellement, cela signifie que toutes les informations de la page et de ses contrôles sont perdues à chaque aller-retour. Par exemple, par défaut, si un utilisateur entre des informations dans une zone de texte sur une page Web HTML, ces informations sont envoyées au serveur. Toutefois, elles ne sont pas retournées au navigateur dans la réponse.

Pour passer outre cette limitation intrinsèque à la programmation Web, l'infrastructure de page ASP.NET inclut plusieurs fonctionnalités de gestion d'état permettant de conserver les valeurs de page et de contrôle entre les différents allers-retours au serveur Web. L'une de ces fonctionnalités est l'état d'affichageVue d'ensemble de la gestion d'état ASP.NET.

Par défaut, l'infrastructure de page ASP.NET utilise l'état d'affichage pour conserver les valeurs de page et de contrôle entre les différents allers-retours. Lorsque le code HTML pour la page est restitué, l'état actuel de la page et les valeurs qui doivent être conservées pendant la publication sont sérialisés dans des chaînes codées en base64. Ces informations sont ensuite placées dans un ou plusieurs champ(s) masqué(s) de la page.

Vous pouvez accéder à l'état d'affichage dans votre code à l'aide de la propriété ViewState de la page. La propriété ViewState est un dictionnaire qui contient des paires clé/valeur contenant les données d'état d'affichage.

Note de sécurité :

Un utilisateur malveillant peut très facilement afficher et modifier le contenu d'un champ masqué. Pour plus d'informations sur la sécurisation de données d'état d'affichage, consultez Sécurisation de l'état d'affichage plus loin dans cette rubrique.

Pour des recommandations sur le moment du stockage dans l'état d'affichage, consultez Recommandations sur la gestion d'état ASP.NET.

Vous pouvez modifier le comportement par défaut et stocker l'état d'affichage à un autre emplacement tel qu'une base de données SQL Server en implémentant une classe PageStatePersister personnalisée pour stocker des données de page. Pour obtenir un exemple de stockage de l'état d'une page dans un flux de données plutôt que dans un champ masqué, consultez l'exemple de la classe PageStatePersister.

Considérations sur l'utilisation de l'état d'affichage

L'état d'affichage fournit des informations d'état sur une page ASP.NET spécifique. Si vous devez utiliser des informations sur plusieurs pages ou si vous souhaitez rendre persistantes des informations d'une visite au site Web à l'autre, utilisez une autre méthode pour maintenir l'état. Vous pouvez utiliser l'état de l'application, l'état de session ou les propriétés de profil.

Les informations d'état d'affichage sont sérialisées en XML puis codées à l'aide du codage en base64, capable de générer d'importantes quantités de données. Lorsque la page est publiée sur le serveur, le contenu de l'état d'affichage est envoyé en tant qu'information de publication de la page. Si l'état d'affichage contient une quantité importante d'informations, cela peut affecter les performances de la page. Testez les performances de vos pages en utilisant des données classiques pour votre application afin de déterminer si la taille de l'état d'affichage est à l'origine de problèmes de performances. Pour des solutions de remplacement à l'utilisation de l'état d'affichage, consultez Recommandations sur la gestion d'état ASP.NET.

Si vous n'avez pas à stocker des informations de contrôle pour tous les contrôles, vous pouvez désactiver l'état d'affichage pour ces contrôles. Si un contrôle sur une page est actualisé à partir du magasin de données à chaque publication, vous pouvez désactiver l'état d'affichage pour ce contrôle afin de réduire la taille de l'état d'affichage. Par exemple, vous pouvez désactiver l'état d'affichage pour un contrôle tel que le contrôle GridView.

Remarque :

Même lorsque vous désactivez explicitement l'état d'affichage, un champ masqué est encore envoyé au navigateur afin d'indiquer que la publication est en cours pour cette page.

Vous devez également prendre en compte le fait que si la quantité de données dans un champ masqué devient très importante, certains proxies et pare-feu empêchent l'accès à la page qui les contient. La quantité maximale de données autorisée pouvant varier en fonction du pare-feu et des implémentations de proxy, les champs masqués volumineux sont susceptibles de provoquer des problèmes par intermittence. Si la quantité de données stockées dans la propriété ViewState dépasse la valeur spécifiée dans la propriété MaxPageStateFieldLength de la page, cette dernière fractionne l'état d'affichage en plusieurs champs masqués. Cette opération réduit la taille des différents champs masqués à une taille autorisée par les pare-feu.

Certains appareils mobiles n'autorisent pas du tout les champs masqués. Par conséquent, l'état d'affichage ne fonctionnera pas pour ces appareils. Pour plus d'informations et des solutions de remplacement, consultez Vue d'ensemble du développement d'applications Web mobiles ASP.NET.

État du contrôle

En plus de l'état d'affichage, ASP.NET prend en charge l'état du contrôle. La page utilise l'état du contrôle pour conserver les informations sur le contrôle qui doivent être conservées entre les publications, même si l'état d'affichage est désactivé pour la page ou pour un contrôle. Comme l'état d'affichage, l'état du contrôle est stocké dans un ou plusieurs champ(s) masqué(s).

Enregistrement des valeurs dans l'état d'affichage

Vous pouvez accéder aux informations d'état d'affichage à l'aide de la propriété ViewState de la page, qui présente un objet dictionnaire. Vous pouvez utiliser ce dictionnaire pour stocker des valeurs personnalisées. Le dictionnaire est généralement utilisé pour stocker la valeur de propriétés personnalisées que vous définissez dans la page.

L'état d'affichage étant envoyé en tant que champ masqué, vous pouvez le modifier jusqu'à ce que l'événement PreRenderComplete de la page ne se produise. Une fois la page restituée dans le navigateur, les modifications apportées à l'état d'affichage ne sont plus enregistrées.

Les informations du champ masqué d'état d'affichage peuvent être vues par les utilisateurs s'ils affichent la source de la page Web et peuvent décoder des chaînes codées en base 64. Cela constitue un potentiel problème de sécurité. Pour plus d'informations sur les problèmes de sécurité avec l'état d'affichage, consultez Sécurisation de l'état d'affichage plus loin dans cette rubrique.

Remarque :

Pour utiliser la propriété ViewState, la page Web ASP.NET doit avoir un élément form disposant de l'attribut .

Pour enregistrer une valeur dans l'état d'affichage, créez un nouvel élément qui contient la valeur à enregistrer et ajoutez-le au dictionnaire d'état d'affichage. L'exemple suivant montre une page Web ASP.NET avec du code qui enregistre une chaîne et une valeur entière dans l'état d'affichage.

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

  Function CreateArray() As ArrayList
    ' Create a sample ArrayList.
    Dim result As ArrayList
    result = New ArrayList(4)
    result.Add("item 1")
    result.Add("item 2")
    result.Add("item 3")
    result.Add("item 4")
    Return result
  End Function

  Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
    If (Me.ViewState("arrayListInViewState") IsNot Nothing) Then
      PageArrayList = CType(Me.ViewState("arrayListInViewState"), ArrayList)
    Else
      ' ArrayList isn't in view state, so it must be created and populated.
      PageArrayList = CreateArray()
    End If
    ' Code that uses PageArrayList.
  End Sub

  Sub Page_PreRender(ByVal sender As Object, ByVal e As EventArgs)
    ' Save PageArrayList before the page is rendered.
    Me.ViewState.Add("arrayListInViewState", PageArrayList)
  End Sub
</script>

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

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script >
  // 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 >
    <title>View state sample</title>
</head>
<body>
    <form id="form1" >
    <div>
    </div>
    </form>
</body>
</html>

Types de données que vous pouvez stocker dans l'état d'affichage

Les types d'objets suivants peuvent être stockés dans l'état d'affichage :

  • Chaînes

  • Entiers

  • Valeurs Boolean

  • Objets Array

  • Objets ArrayList

  • Tables de hachage

  • Convertisseurs de type personnalisés (consulter la classe TypeConverter pour plus d'informations)

Vous pouvez également stocker d'autres types de données, mais la classe doit être compilée avec l'attribut Serializable afin que ses valeurs puissent être sérialisées pour l'état d'affichage.

Lecture des valeurs de l'état d'affichage

Pour lire une valeur de l'état d'affichage, obtenez la propriété ViewState de la page puis lisez la valeur dans le dictionnaire de l'état d'affichage.

L'exemple suivant montre comment obtenir un objet ArrayList nommé arrayListInViewState à partir de l'état d'affichage et comment lier un contrôle GridView à cet objet en tant que source de données.

Dim arrayList As ArrayList
arrayList = CType(ViewState("arrayListInViewState"), ArrayList)

Me.GridView1.DataSource = arrayList
Me.GridView1.DataBind()

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

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

Les valeurs de l'état d'affichage sont de type String. En Visual Basic, si vous définissez Option Strict On, vous devez caster des valeurs d'état d'affichage vers le type approprié avant de les utiliser, comme illustré dans l'exemple précédent. En C#, vous devez toujours caster vers le type approprié lorsque vous lisez des valeurs d'état d'affichage.

Si vous tentez d'obtenir une valeur qui n'existe pas dans l'état d'affichage, aucune exception n'est levée. Pour vous assurer qu'une valeur figure dans l'état d'affichage, commencez par vérifier si l'objet existe. L'exemple suivant montre comment vérifier une entrée d'état d'affichage.

If ViewState("color") Is Nothing Then
    ' No such value in view state, take appropriate action.
End If
if (ViewState["color"] == null)
    // No such value in view state, take appropriate action.

Si vous tentez d'utiliser différemment une entrée qui n'existe pas dans l'état d'affichage (par exemple, pour examiner son type), une exception NullReferenceException est levée.

Retour au début

Sécurisation de l'état d'affichage

Par défaut, les données d'état d'affichage sont stockées dans un champ masqué de la page et codées en base 64. En outre, un hachage des données d'état d'affichage est créé à partir des données à l'aide d'une clé MAC (Machine Authentication Code). La valeur de hachage est ajoutée aux données d'état d'affichage codées et la chaîne résultante est stockée dans la page. Lorsque la page est publiée en retour sur le serveur, l'infrastructure de page ASP.NET recalcule la valeur de hachage et la compare à la valeur stockée dans l'état d'affichage. Si ces valeurs de hachage sont différentes, une exception est levée pour signaler que les données d'état d'affichage peuvent être non valides.

En créant une valeur de hachage, l'infrastructure de page ASP.NET peut tester les données d'état d'affichage afin de déterminer si elles ont été corrompues ou falsifiées. Toutefois, même si elles n'ont pas été falsifiées, les données d'état d'affichage peuvent être interceptées et lues par des utilisateurs malveillants.

Utilisation de la clé MAC pour calculer la valeur de hachage de l'état d'affichage

La clé MAC utilisée pour calculer la valeur de hachage de l'état d'affichage est générée automatiquement ou spécifiée dans le fichier Machine.config. Si la clé est générée automatiquement, elle est créée d'après l'adresse MAC de l'ordinateur, qui correspond à la valeur GUID unique de la carte réseau de l'ordinateur.

Il peut en effet s'avérer difficile, pour des utilisateurs malveillants, d'effectuer une ingénierie à rebours de la clé MAC selon la valeur de hachage dans l'état d'affichage. Ainsi, le codage MAC représente une méthode raisonnablement fiable pour déterminer si les données d'état d'affichage ont été modifiées.

En général, plus la clé MAC utilisée pour générer le hachage est grande, moins il y a de chances que la valeur de hachage des différentes chaînes soit la même. Lorsque la clé est générée automatiquement, ASP.NET utilise le codage SHA-1 pour créer une grande clé. Toutefois, dans un environnement de batterie de serveurs Web, la clé doit être identique sur tous les serveurs. Si la clé n'est pas la même et que la page est publiée sur un serveur autre que celui qui a créé la page, l'infrastructure de page ASP.NET lève une exception. Par conséquent, dans un environnement de batterie de serveurs Web, vous devez spécifier une clé dans le fichier Machine.config au lieu de laisser ASP.NET la générer automatiquement. Dans ce cas, assurez-vous de créer une clé suffisamment longue pour garantir la sécurité de la valeur de hachage. Toutefois, plus la clé est longue, plus la création d'un hachage prend de temps. Par conséquent, vous devez peser vos besoins en matière de sécurité et vos besoins en matière de performances.

Chiffrement de l'état d'affichage

Bien que le codage MAC permette d'éviter la falsification des données d'état d'affichage, il n'empêche pas les utilisateurs de consulter ces données. Pour empêcher les utilisateurs d'accéder à ces données, deux méthodes sont possibles : l'envoi de la page via le protocole SSL et le chiffrement des données d'état d'affichage. L'envoi de la page via le protocole SSL permet d'empêcher l'analyse des paquets de données et l'accès non autorisé aux données par des utilisateurs auxquels la page n'est pas destinée.

Cependant, l'utilisateur qui a demandé la page peut continuer d'accéder aux données d'état d'affichage, car le protocole SSL déchiffre la page afin de l'afficher dans le navigateur. Ceci ne constitue pas un problème si vous acceptez que des utilisateurs autorisés accèdent aux données d'état d'affichage. Toutefois, dans certains cas, les contrôles peuvent utiliser l'état d'affichage pour stocker des informations auxquelles aucun utilisateur ne doit pouvoir accéder. Par exemple, la page peut contenir un contrôle lié aux données qui stocke des identificateurs d'éléments (clés de données) dans l'état d'affichage. Si ces identificateurs contiennent des données sensibles, telles que des ID de clients, vous devez chiffrer les données d'état d'affichage en plus (ou en remplacement) de l'envoi de la page via SSL.

Pour chiffrer les données, affectez la valeur true à la propriété ViewStateEncryptionMode de la page. Si vous stockez des informations dans l'état d'affichage, vous pouvez utiliser des techniques de lecture et d'écriture normales ; la page gère le chiffrement et le déchiffrement à votre place. Le chiffrement des données d'état d'affichage peut affecter les performances de votre application. Par conséquent, n'utilisez le chiffrement qu'en cas de besoin.

Chiffrement de l'état du contrôle

Les contrôles qui utilisent cet état du contrôle peuvent exiger que l'état d'affichage soit chiffré en appelant la méthode RegisterRequiresViewStateEncryption. Si un contrôle de la page requiert le chiffrement de l'état d'affichage, le chiffrement sera appliqué à l'intégralité de l'état d'affichage de la page.

Codage de l'état d'affichage par utilisateur

Si le site Web authentifie les utilisateurs, vous pouvez définir la propriété ViewStateUserKey dans le gestionnaire d'événements Page_Init afin d'associer l'état d'affichage de la page à un utilisateur spécifique. Cela permet de prévenir les attaques par clic unique, au cours desquelles lequel un utilisateur malveillant crée une page Web valide et pré-remplie avec l'état d'affichage d'une page créée précédemment. L'intrus incite ensuite une victime à cliquer sur un lien qui envoie la page au serveur en utilisant l'identité de cette victime.

Lorsque la propriété ViewStateUserKey est définie, l'identité de l'intrus est utilisée pour créer le hachage de l'état d'affichage de la page d'origine. Lorsque la victime est conduite par la ruse à renvoyer la page, les valeurs de hachage sont différentes parce que les clés d'utilisateur sont différentes. La vérification de la page échoue et une exception est déclenchée.

Vous devez associer la propriété ViewStateUserKey à une valeur unique pour chaque utilisateur, comme le nom ou l'identificateur de l'utilisateur.

Sécurisation de la configuration dans un environnement d'hébergement partagé

Dans un environnement d'hébergement partagé, les utilisateurs malveillants peuvent potentiellement modifier les propriétés de gestion d'état qui peuvent affecter d'autres applications sur l'ordinateur. Il leur suffit de modifier directement le fichier Machine.config ou d'effectuer des modifications à l'aide des classes de configuration ou d'autres outils d'administration et de configuration. Vous pouvez empêcher la modification de la configuration de votre application en chiffrant des sections des fichiers de configuration. Pour plus d'informations, consultez Chiffrement des informations de configuration à l'aide de la configuration protégée

Référence de classe

ViewState

Fournit un objet dictionnaire permettant de conserver des valeurs entre les différentes demandes d'une même page.

PageStatePersister

Fournit un moyen de définir un mécanisme personnalisé pour stocker des informations d'état d'affichage, comme dans une base de données SQL Server.

Retour au début

Voir aussi

Concepts

Vue d'ensemble de la gestion d'état ASP.NET

Recommandations sur la gestion d'état ASP.NET

Référence

Retour au début