Состояние общего сеанса не работает;два файла cookie ASP.NET_SessionId? - PullRequest
0 голосов
/ 24 октября 2018

У меня есть два сайта, sub1.topleveldomain.com и sub2.topleveldomain.com, для которых я пытаюсь реализовать общее состояние сеанса, чтобы включить единый вход.Я следовал за документацией здесь:

https://support.microsoft.com/en-us/help/2527105/how-to-share-session-state-across-subdomains

Обе веб-конфигурации имеют следующие настройки:

<sessionState mode="SQLServer" allowCustomSqlDatabase="true" sqlConnectionString="Data Source=sqlserver;user id=user;password=password;Application Name=MyAppName" cookieless="false" />

<machineKey validationKey="[same machine key]" decryptionKey="[same decryption key]" validation="SHA1" decryption="AES" />    

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
        <add name="SharedSessionModule" type="CSASPNETShareSessionBetweenSubDomainsModule.SharedSessionModule, CSASPNETShareSessionBetweenSubDomainsModule, Version=1.0.0.0, Culture=neutral"/>
    </modules>
</system.webServer>

<appSettings>
    <add key="ApplicationName" value="MyAppName"/>
    <add key="RootDomain" value="topleveldomain.com"/>
</appSettings>

Я также настроил sub2 для использования userserviceиз sub1 (не уверен, если это имеет значение здесь):

<client>  
    <endpoint address="https://sub1.topleveldomain.com/Services/UserService.svc" binding="basicHttpsBinding" bindingConfiguration="BasicHttpsBinding_IUserService" contract="netzkern.SC.UserManager.Contracts.IUserService" name="BasicHttpsBinding_IUserService" />
</client>

Оба сайта загружаются и работают правильно, но когда я захожу в sub1, я не захожу в sub2.Я проверил файлы cookie, и есть два файла cookie ASP.Net_SessionId.Будет ли это проблемой?Если это проблема, что мне нужно изменить в этом коде?

enter image description here

public class SharedSessionModule : IHttpModule
{
    // Cache settings on memory. 
    protected static string applicationName = ConfigurationManager.AppSettings["ApplicationName"];
    protected static string rootDomain = ConfigurationManager.AppSettings["RootDomain"];

    #region IHttpModule Members 
    /// <summary> 
    /// Initializes a module and prepares it to handle requests. 
    /// </summary> 
    /// <param name="context"> 
    /// An System.Web.HttpApplication 
    /// that provides access to the methods, 
    /// properties, and events common to all application objects within  
    /// an ASP.NET application. 
    /// </param> 
    public void Init(HttpApplication context)
    {
        // This module requires both Application Name and Root Domain to work. 
        if (string.IsNullOrEmpty(applicationName) ||
            string.IsNullOrEmpty(rootDomain))
        {
            return;
        }

        // Change the Application Name in runtime. 
        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, applicationName);

        // Subscribe Events. 
        context.PostRequestHandlerExecute += new EventHandler(context_PostRequestHandlerExecute);
    }

    /// <summary> 
    /// Disposes of the resources (other than memory) used by the module 
    /// that implements. 
    /// </summary> 
    public void Dispose()
    {
    }
    #endregion

    /// <summary> 
    /// Before sending response content to client, change the Cookie to Root Domain 
    /// and store current Session Id. 
    /// </summary> 
    /// <param name="sender"> 
    /// An instance of System.Web.HttpApplication that provides access to 
    /// the methods, properties, and events common to all application 
    /// objects within an ASP.NET application. 
    /// </param> 
    void context_PostRequestHandlerExecute(object sender, EventArgs e)
    {
        try
        {
            HttpApplication context = (HttpApplication) sender;

            // ASP.NET store a Session Id in cookie to specify current Session. 
            HttpCookie cookie = context.Response.Cookies["ASP.NET_SessionId"];

            if (context.Session != null &&
                !string.IsNullOrEmpty(context.Session.SessionID))
            {
                // Need to store current Session Id during every request. 
                cookie.Value = context.Session.SessionID;

                // All Applications use one root domain to store this Cookie 
                // So that it can be shared. 
                if (rootDomain != "localhost")
                {
                    cookie.Domain = rootDomain;
                }

                // All Virtual Applications and Folders share this Cookie too. 
                cookie.Path = "/";
            }
        }
        catch (Exception ex)
        {
            return;
        }
    }
}
...