Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Atteint de JavaScriptite Aiguë [Cyril Durand]

Expert ASP.net Ajax et WCF, Cyril Durand parle dans son blog de point techniques sur ASP.net, ASP.net Ajax, JavaScript, WCF et .net en général. Cyril est également consultant indépendant, n'hésitez pas à le contacter pour de l'assistance sur vos projets

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    N'hésitez pas à me contacter pour vos projets .net : architecture, accompagnement, formation, ...

    View Cyril Durand's profile on LinkedIn
    hit counters


    Expertise Commerce server et BizTalk

ASP.net – Partager la session entre plusieurs sous-domaines avec http ou https

Dans certains cas il peut être intéressant de pouvoir partager une session entre plusieurs sous-domaines. Cela nous permet par exemple d’avoir une session unique pour les urls fr.monsite.com et en.monsite.com ou http://www.monsite.com et https://secure.monsite.com.

Afin de bien comprendre notre problème, intéressons nous au fonctionnement des sessions.

Tout d’abord une session est partagée entre les pages d’un site via un cookie. Par défaut, ce cookie a pour nom ASP.NET_SessionId et contient une suite de 24 caractères alpha numériques aléatoires.

Lorsque l’on fait une requête vers ASP.net, un HttpContext est instancié. Ce contexte passe au travers de différents HttpModule dont le SessionStateModule, c’est ce module qui va se charger d’orchestrer les différentes étapes de la création / sauvegarde des variables de session. Dans un premier temps, ce module va récupérer un ID de session via le SessionIDManager, ce manager va regarder dans la requête s’il y a ou non le cookie de session contenant l’ID. S’il n’est pas présent, il va alors générer et retourner un ID unique. Le module va ensuite interroger le SessionStateStoreProvider afin de récupérer l’état de la session pour l’assigner au contexte de la requête.

Le traitement de la page s’exécute alors. Viens ensuite l’événement ReleaseRequesState qui va sauvegarder la session dans le SessionStateStoreProvider puis persister le SessionID dans la réponse renvoyé au client.

image

Deux classes sont responsables du fonctionnement des sessions, le SessionIDManager et le SessionStateStoreProvider. Le SessionStateStoreProvider permet de stocker les variables de sessions alors que SessionIDManager permet de sauvegarder côté client l’identifiant de session. ASP.net nous permet de personnaliser ces 2 classes via des interfaces.

Dans notre cas, nous avons besoin de créer notre propre SessionIDManager, en effet c’est lui qui est responsable de la création du cookie. Afin de simplifier l’implémentation, nous allons encapsuler le SessionIDManager natif, lors de la méthode SaveSessionID nous allons modifier la propriété Domain du cookie de session.


public class CustomSessionIDManager : ISessionIDManager { private ISessionIDManager _innerSessionIDManager; public CustomSessionIDManager() { this._innerSessionIDManager = new SessionIDManager(); } public void SaveSessionID(HttpContext context, string id, out bool redirected, out bool cookieAdded) { this._innerSessionIDManager.SaveSessionID(context, id, out redirected, out cookieAdded); // POC : not the best solution if (cookieAdded) { context.Response.Cookies["ASP.NET_SessionId"].Domain = "local.test"; } } // ... }

L’enregistrement de notre SessionIDManager se fait en renseignant la propriété sessionIDManagetType de la section sessionState du fichier de config.

<configuration> <system.web> <sessionState sessionIDManagerType="CustomSessionIDManager, App_Code" /> </system.web> </configuration>

Cette solution n’est pas optimum, en effet le nom du cookie est écrit en dur ainsi que le domaine. Le nom du cookie est spécifié via la propriété cookieName de la section sessionState du web.config, il nous est alors facilement récupérable. Pour le nom du domaine, nous avons 2 solutions, soit l’on réussit à le faire transiter du fichier de config vers notre SessionIDManager, soit on le calcul via le domaine courant. Malheureusement, on ne peut pas ajouter de paramètres au SessionIDManager via la section sessionState. Nous allons utiliser les AppSettings et le calcul si la clé n’est pas définit.

public class CustomSessionIDManager : ISessionIDManager { private String _cookieName; private ISessionIDManager _innerSessionIDManager; public CustomSessionIDManager() { this._innerSessionIDManager = new SessionIDManager(); } public void Initialize() { this._innerSessionIDManager.Initialize(); SessionStateSection sessionStateSection = (SessionStateSection)ConfigurationManager.GetSection("system.web/sessionState"); this._cookieName = sessionStateSection.CookieName; } public void SaveSessionID(HttpContext context, string id, out bool redirected, out bool cookieAdded) { this._innerSessionIDManager.SaveSessionID(context, id, out redirected, out cookieAdded); if (cookieAdded) { String domainName = ConfigurationManager.AppSettings["CustomSessionIDManager.CookieDomain"]; if (String.IsNullOrEmpty(domainName)) { domainName = context.Request.Url.Host; String[] domainParts = domainName.Split('.'); if (domainParts.Length > 1) domainName = String.Join(".", domainParts .Skip(domainParts.Length - 2) .ToArray()); } context.Response.Cookies[_cookieName].Domain = domainName; } } // ... }

Ainsi, nous pouvons accéder à la session entre plusieurs sous-domaines.

Bien sur, il faut que le SessionStateStoreProvider utilisé soit le même entre les différents sites. Si vous avez qu’un seul site définit pour les 2 urls au niveau de IIS, il n’est pas nécessaire de modifier le sessionStateStoreProvider. Par contre, si vous avez 2 sites différents il vous faut utiliser un serveur de session ou un serveur SQL afin de transiter les sessions entre vos 2 sites web. Pour plus d’informations sur la configuration d’un serveur de session, vous pouvez lire l’article ASP.NET Session State 

Pour plus de détails sur le fonctionnement interne des sessions, je vous invite à consulter l’article Fast, Scalable, and Secure Session State Management for Your Web Applications de Michael Volodarsky.

Posted: mercredi 1 juillet 2009 10:42 par cyril
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

FREMYCOMPANY a dit :

Intéressant. J'avais jamais pensé au cas de problème, mais je me dis que cela doit être assez courrant, quand même.

# juillet 1, 2009 18:44

Nix a dit :

Merci pour ton post, tu répond à ma question de l'autre jour ;)

Cela va bien me servir.

# juillet 1, 2009 19:30

FeelTheWay a dit :

Merci pour l'article, j'étais justement entrain de chercher du côté des SessionState pour les partager entre différents sites.

par contre j'ai quelques questions.

Je fais actuellement des tests sur du Localhost bien évidemment mais je n'arrive pas à mettre en place cette solution.

J'ai 2 soucis réels.

1 - Sur Firefox, mes 2 sites en mode debug, je passe bien par ma classe pour changer le domaine sur les 2 sites. j'ai un site A qui crée une variable de session et l'affiche et un site B qui l'affiche uniquement. Bien que les 2 pages appelées passent dans le code correspondant, impossible de récupérer la variable de session.

2 - Sur IE 8, je ne passe pas en mode debug dans le code correspondant oO

# août 7, 2009 10:09
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- MBA : Pourquoi faire et comment le choisir ? par Blog Technique de Romelard Fabrice le il y a 15 heures et 39 minutes

- Y'a des erreurs qui peuvent rendre le développeur violent par Aleks's Blog le 02-02-2012, 16:33

- [Hyper-V 3] Présentation des commandlets PowerShell par Blog de SPBrouillet (Pierrick BROUILLET) le 01-31-2012, 16:01

- IIS7 – Compression GZIP par Atteint de JavaScriptite Aiguë [Cyril Durand] le 01-31-2012, 15:52

- SharePoint 15 Technical Preview Managed Object Model Software Development Kit par Matthew le 01-31-2012, 12:34

- Office 15 Technical Preview - Open specification Update par Matthew le 01-31-2012, 10:14

- TFS Integration Tools – Installation par Vivien Fabing le 01-31-2012, 00:06

- Test par RonnyK le 01-30-2012, 16:56

- [SharePoint 2010] Désactiver le correcteur orthographique dans les pages d’un site de publication par Jean-Christophe Brabant le 01-30-2012, 09:30

- [SharePoint 2010] Site internet et performances : poids et nombre des ressources par Arnault Nouvel le 01-30-2012, 00:52