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

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01

- SharePoint Online: Script PowerShell pour supprimer une colonne dans tous les sites d’une collection par Blog Technique de Romelard Fabrice le 11-27-2018, 18:01