2008-10-29 6 views
2

J'ai www.example.com et aussi store.example.com. (Oui, ils sont sous-domaines du même domaine parent)Quelles sont les options disponibles pour le partage de données entre sous-domaines?

store.example.com se trouve sur ASP.NET 1.1

www.example.com est sur ASP.NET 3.5

Je veux savoir quelles sont les options disponibles pour le partage « la session 'données entre les deux sites. J'ai besoin d'une sorte de connexion partagée et aussi l'abilité de suivre l'activité des utilisateurs, peu importe le site sur lequel ils ont commencé.

  • obvously je pouvais envoyer un GUID lors de la transition d'un site à l'autre. Je pense aussi que je peux définir un cookie qui peut être partagé entre les sous-domaines. Je n'ai jamais essayé cela mais c'est très probablement ce que je vais faire. Je ne suis pas encore clair si c'est un vrai cookie de session ou si je viens de définir une date d'expiration basse?

Est-ce que ce sont mes meilleures options ou y a-t-il autre chose?

+0

Je suis sûr, vous pourriez avoir obtenu la réponse maintenant, mais je veux juste poster le lien à une réponse ici sur SO http://stackoverflow.com/questions/2868316/sharing-sessions-across-applications-using -the-asp-net-session-state-service/3151315 # 3151315 – Vamsi

Répondre

3

La chose importante à faire est de définir le domaine des cookies correctement.

Si le domaine est défini sur .example.com (notez la période principale), il doit être inclus dans les demandes adressées à exemple.com et à tous les sous-domaines. Je suppose que vous avez un moyen de partager les données entre vos différents sous-domaines.

+0

j'aime comment vous avez reformulé ma question comme une supposition à la fin ;-) merci pour l'info –

+0

Désolé, je pensais que votre question était de reconnaître 2 requêtes HTTP à différents sous-domaines comme appartenant à la même personne. Je supposais que vous savez comment vous connecter par ex. une base de données de deux endroits différents (le code de chaque sous-domaine) - était-ce faux? Je suppose que je n'étais pas vraiment clair à ce sujet – Gareth

6

Si vous souhaitez partager des sessions entre différentes applications, vous devez effectuer certaines opérations.

Vous devez d'abord exécuter l'état de session en mode SQL. À ce stade, j'ai découvert que l'état de la session SQL prend la clé de la machine et votre _appDomainAppId pour générer une clé pour que votre application accède à ses propres données de session. Nous devons donc garder la même chose entre toutes vos applications.

Dans les configurations Web de vos applications, vous devez utiliser la même clé machine. Cela peut être tout où l'intérieur de la system.web balises EG:

<machineKey decryptionKey="EDCDA6DF458176504BBCC720A4E29348E252E652591179E2" validationKey="CC482ED6B5D3569819B3C8F07AC3FA855B2FED7F0130F55D8405597C796457A2F5162D35C69B61F257DB5EFE6BC4F6CEBDD23A4118C4519F55185CB5EB3DFE61"/> 

Ajouter un appSetting « ApplicationName » et lui donner le nom (ce qui doit être le même pour les deux applications) Vous devrez ensuite créer un module de session partagé qui va changer le _appDomainAppId. Celui ci-dessous est ce que j'utilise.

namespace YourApp 
{ 
    using System.Configuration; 
    using System.Reflection; 
    using System.Web; 

    /// <summary>class used for sharing the session between app domains</summary> 
    public class SharedSessionModule : IHttpModule 
    { 
    #region IHttpModule Members 
    /// <summary> 
    /// Initializes a module and prepares it to handle requests. 
    /// </summary> 
    /// <param name="context">An <see cref="T:System.Web.HttpApplication"/> 
    /// that provides access to the methods, 
    /// properties, and events common to all application objects within an ASP.NET 
    /// application</param> 
    /// <created date="5/31/2008" by="Peter Femiani"/> 
    public void Init(HttpApplication context) 
    { 
     // Get the app name from config file... 
     string appName = ConfigurationManager.AppSettings["ApplicationName"]; 
     if (!string.IsNullOrEmpty(appName)) 
     { 
     FieldInfo runtimeInfo = typeof(HttpRuntime).GetField("_theRuntime", BindingFlags.Static | BindingFlags.NonPublic); 
     HttpRuntime theRuntime = (HttpRuntime)runtimeInfo.GetValue(null); 
     FieldInfo appNameInfo = typeof(HttpRuntime).GetField("_appDomainAppId", BindingFlags.Instance | BindingFlags.NonPublic); 
     appNameInfo.SetValue(theRuntime, appName); 
     } 
    } 

    /// <summary> 
    /// Disposes of the resources (other than memory) used by the module that 
    /// implements <see cref="T:System.Web.IHttpModule"/>. 
    /// </summary> 
    /// <created date="5/31/2008" by="Peter Femiani"/> 
    public void Dispose() 
    { 
    } 
    #endregion 
    } 
} 

Dans la configuration web, vous devez ajouter ce module:

 <add name="SharedSessionModule" type="YourApp.SharedSessionModule, YourApp, Version=1.0.0.0, Culture=neutral" /> 

dernière chose à faire est de permettre le cookie de session pour passer entre les domaines ...comme si

var session = HttpContext.Current.Session; 
    var request = HttpContext.Current.Request; 
    var cookie = request.Cookies["ASP.NET_SessionId"]; 
    if (cookie != null && session != null && session.SessionID != null) 
    { 
    cookie.Value = session.SessionID; 
    cookie.Domain = "yourappdomain.com"; 

    // the full stop prefix denotes all sub domains 
    cookie.Path = "/"; // default session cookie path root 
    } 

Et cela devrait faire l'affaire.

+1

Ceci est le même exemple que celui publié ici: http://www.codeproject.com/KB/session/sharedsession.aspx. Cela n'a pas fonctionné pour moi, même avec les suggestions postées par @Krenning. – DaveDev