Partager via


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

Mise à jour : novembre 2007

Utilisez l'état de session ASP.NET pour stocker et récupérer des valeurs pour un utilisateur.

Cette rubrique contient les sections suivantes :

  • Contexte

  • Exemples de code

  • Référence de classe

Contexte

L'état de session ASP.NET vous permet de stocker et de récupérer des valeurs pour un utilisateur à mesure que ce dernier navigue dans les différentes pages ASP.NET d'une application Web. HTTP est un protocole sans état. Cela signifie qu'un serveur Web traite chaque requête HTTP pour une page comme une demande indépendante. Le serveur ne conserve aucune connaissance de valeurs variables utilisées pendant des demandes précédentes. L'état de session ASP.NET identifie les demandes du même navigateur en tant que session dans une fenêtre à durée limitée et offre un moyen de rendre persistantes les valeurs variables pour la durée de cette session. Par défaut, l'état de session ASP.NET est activé pour toutes les applications ASP.NET.

Les alternatives à l'état de session incluent les éléments suivants :

  • État de l'application, qui stocke des variables à qui peuvent être accédées par tous les utilisateurs d'une application ASP.NET.

  • Propriétés de profil, qui rendent des valeurs d'utilisateur persistantes dans un magasin de données sans les expirer.

  • Mise en cache ASP.NET, qui stocke des valeurs dans la mémoire qui est disponible à toutes les applications ASP.NET.

  • État d'affichage, qui rend des valeurs persistantes dans une page.

  • Cookies.

  • La chaîne de requête et champs sur un formulaire HTML qui sont disponibles d'une requête HTTP.

Pour une comparaison des différentes options de gestion d'état, consultez Recommandations sur la gestion d'état ASP.NET.

Variables de session

Les variables de session sont stockées dans un objet SessionStateItemCollection qui s'affiche via la propriété HttpContext.Session. Dans une page ASP.NET, les variables de session actuelles sont exposées à travers la propriété Session de l'objet Page.

La collection de variables de session est indexée par le nom de la variable ou par un index d'entiers. Les variables de session sont créées par référence à leur nom. Vous n'avez pas besoin de déclarer de variable de session ni d'en ajouter explicitement à la collection. L'exemple suivant indique la manière de créer des variables de session au sein d'une page ASP.NET pour le prénom et le nom d'un utilisateur et de leur affecter les valeurs récupérées depuis les contrôles TextBox.

Session("FirstName") = FirstNameTextBox.Text
Session("LastName") = LastNameTextBox.Text
Session["FirstName"] = FirstNameTextBox.Text;
Session["LastName"] = LastNameTextBox.Text;

Les variables de session peuvent être de tout type .NET Framework valide. L'exemple suivant stocke un objet ArrayList dans une variable de session nommée StockPicks. La valeur retournée par la variable de session StockPicks doit être castée au type approprié lorsque vous la récupérez de la collection SessionStateItemCollection.

' When retrieving an object from session state, cast it to 
' the appropriate type.
Dim stockPicks As ArrayList = CType(Session("StockPicks"), ArrayList)

' Write the modified stock picks list back to session state.
Session("StockPicks") = stockPicks
// When retrieving an object from session state, cast it to 
// the appropriate type.
ArrayList stockPicks = (ArrayList)Session["StockPicks"];

// Write the modified stock picks list back to session state.
Session["StockPicks"] = stockPicks;
Remarque :

Lorsque vous utilisez un mode d'état de session autre que InProc, le type session-variable doit être d'un type .NET primitif ou sérialisable. Ceci car la valeur de variable de session est stockée dans un magasin de données externe. Pour plus d'informations, consultez Modes d'état de session.

Identificateurs de session

Les sessions sont identifiées par un identificateur unique pouvant être lu à l'aide de la propriété SessionID. Lorsque l'état de session est activé pour une application ASP.NET, chaque demande d'une page de l'application est examinée par rapport à une valeur SessionID envoyée à partir du navigateur. Si aucune valeur SessionID n'est fournie, ASP.NET démarre une nouvelle session et la valeur SessionID de cette session est envoyée au navigateur avec la réponse.

Par défaut, les valeurs SessionID sont stockées dans un cookie. Toutefois, vous pouvez également configurer l'application pour stocker des valeurs SessionID dans l'URL pour une session « sans cookie ».

Une session est considérée comme active tant que les demandes continuent à être effectuées avec la même valeur SessionID. Si la durée entre les demandes d'une session donnée dépasse la valeur du délai d'expiration spécifiée en minutes, le système considère alors que la session a expiré. Les demandes effectuées avec une valeur SessionID qui a expiré entraînent une nouvelle session.

Note de sécurité :

Les valeurs P:System.Web.SessionState.HttpSessionState.SessionID sont envoyées en texte clair, sous la forme d'un cookie ou en tant que partie de l'URL. Un utilisateur malveillant pourrait accéder à la session d'un autre utilisateur en obtenant la valeur SessionID et en l'incluant dans les demandes au serveur. Si vous stockez des informations sensibles dans l'état de session, il est recommandé d'utiliser SSL pour chiffrer toutes les communications entre le navigateur et le serveur qui inclut la valeur SessionID.

Par défaut, la valeur SessionID est stockée dans un cookie de session sans date d'expiration dans le navigateur. Cependant, vous pouvez spécifier que les identificateurs de session ne soient pas stockés dans un cookie en affectant la valeur true à l'attribut cookieless dans la section sessionState du fichier Web.config.

L'exemple suivant montre un fichier Web.config qui configure une application ASP.NET pour utiliser des identificateurs de session sans cookie.

<configuration>
  <system.web>
    <sessionState cookieless="true"
      regenerateExpiredSessionId="true" />
  </system.web>
</configuration>

ASP.NET maintient un état de session sans cookie en insérant automatiquement un ID de session unique dans l'URL de la page. Par exemple, l'URL suivante a été modifiée par ASP.NET pour inclure l'ID de session unique lit3py55t21z5v55vlm25s55 :

http://www.example.com/(S(lit3py55t21z5v55vlm25s55))/orderform.aspx

Lorsque ASP.NET envoie une page au navigateur, il modifie tous liens dans la page qui utilisent un chemin d'accès relatif à l'application en incorporant une valeur d'ID de session dans les liens. (Les liens avec des chemins d'accès absolus ne sont pas modifiés.) L'état de session est maintenu tant que l'utilisateur clique sur liens modifiés de cette manière. Toutefois, si le client réécrit une URL fournie par l'application, il est possible qu'ASP.NET ne soit pas capable de résoudre l'ID de session et d'associer la demande à une session existante. Dans ce cas, une nouvelle session est démarrée pour la demande.

L'ID de session est incorporé dans l'URL après la barre oblique qui suit le nom d'application et avant tout autre fichier ou identificateur de répertoire virtuel. Cela permet à ASP.NET de résoudre le nom d'application avant d'impliquer SessionStateModule dans la demande.

Remarque :

Pour améliorer la sécurité de votre application, vous devez autoriser les utilisateurs à se déconnecter de votre application. À ce moment-là, l'application doit appeler la méthode Abandon. Cela réduit la possibilité pour un utilisateur malveillant d'obtenir l'identificateur unique de l'URL et de l'utiliser pour récupérer les données utilisateur privées stockées dans la session.

Régénération des identificateurs de session expirés

Par défaut, les valeurs de l'ID de session utilisées dans les sessions sans cookie sont recyclées. En d'autres termes, si une demande est effectuée avec un ID de session qui a expiré, une nouvelle session est démarrée en utilisant la valeur SessionID fournie avec la demande. Cela peut provoquer une session qui est partagée involontairement lorsqu'un lien qui contient une valeur SessionID sans cookie est utilisé par plusieurs navigateurs. (Cela peut se produire si le lien est passé dans un moteur de recherche, un courrier électronique ou un autre programme.) Vous pouvez réduire le risque de partage des données en configurant l'application de manière à ne pas recycler les identificateurs de session. Pour ce faire, affectez la valeur true à l'attribut regenerateExpiredSessionId de l'élément de configuration sessionState. Ainsi, un nouvel ID de session est généré lorsqu'une demande de session sans cookie est effectuée avec un ID de session expiré.

Remarque :

Si la demande faite avec l'ID de session périmé est effectuée en utilisant la méthode POST de HTTP, toutes données publiées seront perdues lorsque regenerateExpiredSessionId est true. Ceci car ASP.NET exécute une redirection pour s'assurer que le navigateur possède le nouvel identificateur de session dans l'URL.

Identificateurs de session personnalisés

Vous pouvez implémenter une classe personnalisée pour fournir et valider des valeurs SessionID. Pour cela, créez une classe qui hérite de la classe SessionIDManager et substitue les méthodes CreateSessionID et Validate avec vos propres implémentations. Pour obtenir un exemple, consultez celui fournit pour la méthode CreateSessionID.

Vous pouvez remplacer la classe SessionIDManager en créant une classe qui implémente l'interface ISessionIDManager. Par exemple, vous pouvez avoir une application Web qui associe un identificateur unique à des pages non-ASP.NET (telles que des pages HTML ou des images) à l'aide d'un filtre ISAPI. Vous pouvez implémenter une classe SessionIDManager personnalisée pour utiliser cet identificateur unique avec l'état de session ASP.NET. Si votre classe personnalisée prend en charge des identificateurs de session sans cookie, vous devrez implémenter une solution pour envoyer et récupérer des identificateurs de session dans l'URL.

Modes de session

L'état de session ASP.NET prend en charge de nombreuses options de stockage pour les variables de session. Chaque option est identifiée comme un type Mode d'état de session. Le comportement par défaut consiste à stocker les variables de session dans l'espace mémoire du processus de traitement ASP.NET. Toutefois, vous pouvez également configurer cet état de session pour qu'il soit stocké dans un processus distinct, dans une base de données SQL Server ou dans une source de données personnalisée. Si vous ne souhaitez pas que l'état de session soit activé pour votre application, vous pouvez affecter la propriété Off au mode de session.

Pour plus d'informations, consultez Modes d'état de session.

Événements de session

ASP.NET fournit deux événements qui vous aident à gérer des sessions utilisateur. L'événement Session_OnStart est déclenché lors du démarrage d'une nouvelle session, et l'événement Session_OnEnd est déclenché lorsqu'une session est abandonnée ou expire. Les événements de session sont spécifiés dans le fichier Global.asax d'une application ASP.NET.

L'événement Session_OnEnd n'est pas pris en charge si la propriété de session Mode a une valeur différente de InProc, qui est le mode par défaut.

Remarque :

Si le fichier Global.asax ou Web.config d'une application ASP.NET est modifié, cette dernière est redémarrée et toutes les valeurs stockées dans l'état de l'application ou de session sont perdues. Sachez que certains logiciels antivirus peuvent mettre à jour les dernières date et heure modifiées du fichier Global.asax ou Web.config d'une application.

Pour plus d'informations, consultez Événements d'état de session.

Configuration de l'état de session

L'état de session est configuré à l'aide de l'élément sessionState de la section de configuration system.web. Vous pouvez également configurer l'état de session à l'aide de la valeur EnableSessionState dans la directive @ Page.

L'élément sessionState vous permet de spécifier les options suivantes.

  • Le mode dans lequel la session stockera des données.

  • La façon dont les valeurs de l'identificateur de session sont envoyées entre le client et le serveur.

  • La valeur Timeout de la session.

  • La prise en charge des valeurs basées sur le paramètre de session Mode.

L'exemple suivant montre un élément sessionState qui configure une application pour le mode de session SQLServer. Il définit la valeur Timeout à 30 minutes et spécifie que les identificateurs de session sont stockés dans l'URL.

<sessionState mode="SQLServer"
  cookieless="true "
  regenerateExpiredSessionId="true "
  timeout="30"
  sqlConnectionString="Data Source=MySqlServer;Integrated Security=SSPI;"
  stateNetworkTimeout="30"/>

Vous pouvez désactiver l'état de session d'une application en affectant la valeur Off au mode d'état de session. Si vous souhaitez désactiver l'état de session uniquement pour une page d'application, vous pouvez affecter la valeur false à la propriété EnableSessionState de la directive @ Page. EnableSessionState peut également avoir la valeur ReadOnly pour permettre l'accès en lecture seule aux variables de session.

Demandes simultanés et état de session

L'accès à l'état de session ASP.NET s'effectue exclusivement par session, ce qui signifie que si deux utilisateurs différents effectuent des demandes simultanées, l'accès à chaque session distincte est accordé simultanément. Toutefois, si deux demandes simultanées sont faites pour la même session (en utilisant la même valeur SessionID), la première demande a l'accès exclusif aux informations sur la session. La deuxième demande s'exécute uniquement après que la première demande est terminée. (La deuxième session peut également obtenir l'accès si le verrou exclusif sur les informations est libéré parce que la première demande dépasse le délai d'attente de verrouillage.) Si EnableSessionState de la directive @ Page a la valeur ReadOnly, une demande d'informations de session en lecture seule n'entraîne pas de verrouillage exclusif des données de session. Cependant, les demandes de données de session en lecture seule risquent encore de patienter jusqu'à ce qu'un verrouillage définit par une demande de données de session en lecture-écriture soit désactivé.

Retour au début

Exemples de code

Comment : enregistrer des valeurs dans l'état de session

Comment : lire les valeurs de l'état de session

Implémentation d'un fournisseur de magasins d'état de session

Retour au début

Référence de classe

Le tableau suivant répertorie les classes clés relatives à l'état de session dans l'espace de noms System.Web.SessionState.

Membre

Description

SessionIDManager

Gère des identificateurs uniques pour l'état de session ASP.NET.

SessionStateItemCollection

Utilisé pour stocker des variables d'état de session.

Retour au début

Voir aussi

Concepts

Implémentation d'un fournisseur de magasins d'état de session