У меня есть два сайта, 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.Будет ли это проблемой?Если это проблема, что мне нужно изменить в этом коде?
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;
}
}
}