zoukankan      html  css  js  c++  java
  • EF架构~二级域名中共享Session

    回到目录

    对于一个有点规模的网站,都会有各个子网站,说是子网站,其实也都是独立的站点,一般通过二次域名来分开,如www.zzl.com,它可以有很多子网站,如image.zzl.com,file.zzl.com,sale.zzl.com,manage.zzl.com,news.zzl.com等等!

    而如果希望在各个项目中共享你的登陆状态,我们通过的做法是通过cookies实现,但使用cookies就有安全性的问题,因为它的信息保存在客户端,这是重所周知的,而session本身不支持跨域,即使是二级域名,也是不可以的.(cookies可以在各二级域名中共享信息),当然,这只是对于inpro的存储方式来说的,如果你是sqlserver或者StateServer的方法,那么,通过一些设置,还是可以实现session的跨域的,下面来说一下实现方式.

    一 建立一个httpModule,在页面加载完成后,执行这个方法,将域名的asp.net_sessionId重写

        /// <summary>
        /// session共享sessionId
        /// </summary>
        public class SessionProviderHttpModule : IHttpModule
        {
            private string m_RootDomain = string.Empty;
    
            public void Dispose()
            {
    
            }
    
            public void Init(HttpApplication context)
            {
                m_RootDomain = ".mvvm.com";
    
                Type stateServerSessionProvider = typeof(HttpSessionState).Assembly.GetType("System.Web.SessionState.OutOfProcSessionStateStore");
                FieldInfo uriField = stateServerSessionProvider.GetField("s_uribase", BindingFlags.Static | BindingFlags.NonPublic);
    
                if (uriField == null)
                    throw new ArgumentException("UriField was not found");
    
                uriField.SetValue(null, m_RootDomain);
    
                context.EndRequest += new System.EventHandler(context_EndRequest);
            }
    
            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;
                    }
                }
            }
        }

    二 将这个httpModule注入到项目中

    web.config方法

     <sessionState cookieless="false"
                     timeout="50"
                     mode="StateServer"
                     stateConnectionString="tcpip=localhost:42424"/>
        <httpModules>
          <add name="CrossDomainCookieModule"
               type="EntityFrameworks.Application.Core.HttpModule.SessionProviderHttpModule,EntityFrameworks.Application.Core"/>
        </httpModules>

    预处理程序方法

        /// <summary>
        /// 预处理代码
        /// </summary>
        public class PreApplicationStartCode
        {
            public static void Start()
            {
                // Register our module
                Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(typeof(EntityFrameworks.Application.Core.HttpModule.SessionProviderHttpModule));
            }
        }

    三 设置注册表相关项,启动asp.net的session服务,如图

    HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesaspnet_stateParameters

    AllowRemoteConnection值为1,Port值可以任意设置,默认为42424

    四 当我们设置好上面内容后,我们的session共享就完成了,测试后的结果,如图

    通过图上我们可以看到,它们的ASP.NET_SessionId是相同的,我们知道,浏览器在没有进行用户session写入时,每次刷新,这个值都会变,但当用户使用session序列化后,这个值就固定了,当你把浏览器关闭后,这个值也同时消失,可以说,它是服务器端session的唯一标示,这个值如果相同,服务器就会认为,你的网站是在同一个域下的,它们的信息是共享的,反之,它们就是自立独立的,就像两个应用程序域一样,它们之间是不能相互通讯的.

     回到目录

  • 相关阅读:
    pat 甲级 1065. A+B and C (64bit) (20)
    pat 甲级 1064. Complete Binary Search Tree (30)
    pat 甲级 1010. Radix (25)
    pat 甲级 1009. Product of Polynomials (25)
    pat 甲级 1056. Mice and Rice (25)
    pat 甲级 1078. Hashing (25)
    pat 甲级 1080. Graduate Admission (30)
    pat 甲级 团体天梯 L3-004. 肿瘤诊断
    pat 甲级 1099. Build A Binary Search Tree (30)
    Codeforce 672B. Different is Good
  • 原文地址:https://www.cnblogs.com/lori/p/3723714.html
Copyright © 2011-2022 走看看