Gestion efficace de la péremption de Session dans ASP.NET

Dans les applications web ASP.NET, il est courant de vérifier l'état de la session utilisateur à chaque requête. Une approche classique consiste à inspecter immédiatement le contenu de Session["User"] dans les pages maîtresses, et à rediriger vers la page de connexion si celui-ci est nul.

Une solution plus élégante et maintenable repose sur une gestion centralisée des erreurs liées à la session. Elle s'appuie sur un mécanisme d'exception personnalisée et une classe de base partagée entre toutes les pages.

La première étape consiste à définir une exception spécifique pour signaler l'absence de session utilisateur :

public class SessionExpiredException : Exception
{
   public SessionExpiredException() : base("La session utilisateur a expiré ou n'est pas disponible.")
   {
   }

   public SessionExpiredException(string message) : base(message)
   {
   }
}

Ensuite, on crée une classe de base BasePage qui hérite de System.Web.UI.Page. Cette classe expose une propriété statique CurrentUser pour accéder à l'utilisateur courant via la session. Si la session est vide ou manquante, une exception est levée :

public static T_User CurrentUser
{
   get
   {
       var context = HttpContext.Current;
       if (context == null)
           throw new InvalidOperationException("Le contexte HTTP est indisponible.");

       if (context.Session == null)
           throw new InvalidOperationException("La session n'a pas été initialisée.");

       var user = context.Session["LoggedInUser"] as T_User;
       if (user != null)
           return user;

       throw new SessionExpiredException();
   }
}

Enfin, la méthode OnError de BasePage est surchargée pour intercepter les exceptions spécifiques. Lorsqu'une SessionExpiredException est détectée, la page est redirigée vers la page de connexion. Pour toute autre erreur, une reidrection vers une page d’erreur générique est effectuée :

protected override void OnError(EventArgs e)
{
   base.OnError(e);

   var error = Server.GetLastError();
   if (error == null) return;

   if (error is SessionExpiredException)
   {
       Response.Redirect("~/Account/Login.aspx", false);
   }
   else if (error is System.Data.ConstraintException)
   {
       var enhancedError = new System.Data.ConstraintException(
           $"{error.Message} - Opération en conflit avec les contraintes métier."
       );
       throw enhancedError;
   }
   else
   {
       // Enregistrer l'erreur pour le suivi
       Session["LastError"] = error;
       Response.Redirect("~/Error/GeneralError.aspx", false);
   }
}

Cette architecture permet une gestion cohérente et évolutif des erreurs de session, tout en réduisant le code redondant dans chaque page.

Étiquettes: ASP.NET Session Management exception handling BasePage User Authentication

Publié le 10 septembre à 19h35