同じドメイン名のASP.NETサイトでセッション共有を実現

9642 ワード

Session共有の主な保証2点:
  • フロントAsp_SessionIdのCookie役割ドメインはトップドメイン名であり、値は同じ
  • です.
  • バックエンドSession共通の同じソースは、HttpModuleをカスタマイズすることによって、この2つの要件
  • を実現することができる.
        /// 
        ///    HttpModule,    HttpModule        SessionID(         ),  Session   ///    AppSetting    Domain(   ), system.webServer      modules add name = "MakeSessionIDOneOnly" type="Tools.MakeSessionIDOneOnly, Tools" ///  public class MakeSessionIDOneOnly : IHttpModule { private string m_RootDomain = string.Empty; #region IHttpModule Members public void Dispose() { } ///  /// Init           StateServer  Session s_uribase(        )  ,        ,               Session  ///  ///  public void Init(HttpApplication context) { //1.      m_RootDomain = ConfigurationManager.AppSettings["Domain"]; //2.  System.Web.SessionState.OutOfProcSessionStateStore  Type stateServerSessionProvider = typeof(HttpSessionState).Assembly.GetType("System.Web.SessionState.OutOfProcSessionStateStore"); //3.         s_uribase FieldInfo uriField = stateServerSessionProvider.GetField("s_uribase", BindingFlags.Static | BindingFlags.NonPublic); if (uriField == null) throw new ArgumentException("UriField was not found"); //object obj= uriField.GetValue(null); //4.  s_uribase      uriField.SetValue(null, m_RootDomain); context.EndRequest += new System.EventHandler(context_EndRequest); } ///  ///           cookie///  ///  ///  void context_EndRequest(object sender, System.EventArgs e) { HttpApplication app = sender as HttpApplication; for (int i = 0; i < app.Context.Response.Cookies.Count; i++) { if (app.Context.Response.Cookies[i].Name == "ASP.NET_SessionId") { app.Context.Response.Cookies[i].Domain = m_RootDomain; } } } #endregion } 
    Initメソッドは、ASPを出力するために、本HttpModuleを使用するすべてのプロジェクトが同じソースのSessionを使用することを実現することができる.NET_SessionIdのクッキーの場合は同じ値になりますが、クッキーの役割ドメインは変更できません.context_EndRquestメソッドでASPを再設定.NET_SessionIdの役割ドメインはルートドメイン名でよい.本Moduleを呼び出す必要がある項目Web.Configに参加する必要があります
      <system.web>
        <compilation debug="true" targetFramework="4.6.1"/> <httpRuntime targetFramework="4.6.1"/>  <sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" timeout="30">sessionState>  <machineKey decryptionKey="FD69B2EB9A11E3063518F1932E314E4AA1577BF0B824F369" validationKey="5F32295C31223A362286DD5777916FCD0FD2A8EF882783FD3E29AB1FCDFE931F8FA45A8E468B7A40269E50A748778CBB8DB2262D44A86BBCEA96DCA46CBC05C3" validation="SHA1" decryption="Auto"/>  <httpModules> <add name="MakeSessionIDOneOnly" type="Tools.MakeSessionIDOneOnly,Tools"/> httpModules> system.web> <system.webServer> <modules>  <add name="MakeSessionIDOneOnly" type="Tools.MakeSessionIDOneOnly,Tools"/> modules> system.webServer> <appSettings>  <add key="DOMAIN" value="localhost"/> appSettings>