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.

    Consultant freelance, 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

- TechDays Paris 2010 : La BI dans SharePoint 2010 par Blog Technique de Romelard Fabrice le il y a 1 heure et 39 minutes

- TechDays Paris 2010 : Déploiement de nouvelles technologies – Retour d’expérience par l’informatique de Microsoft par Blog Technique de Romelard Fabrice le il y a 3 heures et 6 minutes

- TechDays Paris 2010 : Plan de migration vers SharePoint 2010 par Blog Technique de Romelard Fabrice le il y a 6 heures et 49 minutes

- TechDays Paris 2010 : La pleinière du second jour par Blog Technique de Romelard Fabrice le il y a 7 heures et 54 minutes

- Visual Studio 2010 and .NET Framework 4 Release Candidate now available par Matthieu MEZIL le il y a 11 heures et 0 minutes

- Création d’une base de donnée sous SQL Azure par Le Blog (Vert) d'Arnaud JUND le il y a 11 heures et 56 minutes

- TechDays Paris 2010 : Les Services d’applications dans SharePoint 2010 par Blog Technique de Romelard Fabrice le il y a 21 heures et 56 minutes

- TechDays Paris 2010 : La GED et SharePoint 2010 par Blog Technique de Romelard Fabrice le 02-08-2010, 16:54

- TechDays Paris 2010 : SharePoint 2010 et Les réseaux sociaux par Blog Technique de Romelard Fabrice le 02-08-2010, 15:40

- TechDays Paris 2010 : SharePoint 2010 – Description et nouveautés par Blog Technique de Romelard Fabrice le 02-08-2010, 14:33