zoukankan      html  css  js  c++  java
  • ASP.NET二级域名站点共享Session状态

    asp.net二级域名站点共享session状态
    我的前面一篇文章提到了如何在使用了ASP.NET form authentication的二级站点之间共享登陆状态,http://www.cnblogs.com/jzywh/archive/2007/09/23/902905.html

    今天, 我要写的是如何在二级域名站点之间,主站点和二级域名站点之间共享Session。

    首先, Session要共享,站点之间SessionID必须要一致,那怎么保证SessionID一致呢?

    ASP.NET中的SessionID是存储在客户端的cookie之中键值为ASP.NET_SessionId用来维护浏览者Session对应关系的一个字符串,要想在二级域名站点之间,主站点和二级域名站点共享SessionID就必须先共享,那么我们就必须先实现ASP.NET_SessionId这一cookie的共享。

    A: CrossDomainCookieModule

    ------------------------------------------------------------------------------------------------

    public class CrossDomainCookie : IHttpModule
     {
            PRivate string m_RootDomain = string.Empty;

            #region IHttpModule Members

            public void Dispose()
            {

            }

            public void Init(Httpapplication context)
            {
                m_RootDomain = ConfigurationManager.AppSettings["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++)
                {
                    app.Context.Response.Cookies[i].Domain = m_RootDomain;
                }
            }

            #endregion
     }
     

    上面的Module重设了所有cookie的domain到root domain, root domain在web.config中设置。也许有人会说这是眉毛胡子一把抓重写了所有cookie的domain, 那他也可以判断一下cookie的name, 如果为ASP.NET_SessionId的话才重写。

    如果主站点和二级域名站点是同一站点,那么做到这一步,你的session就已经共享了,因为Session的ID是相同的,而且Session容器也是同一个。

    如果主站点和二级域名站点是两个不同站点,则需要进行更多的操作了。

    如果两个站点是不同的服务器的话,解决方法要简单点:

    1) 使用相同的state server来存储Session.

    2) 在两个站点的web.config设置相同的machineKey.

    <machineKey 

     validationKey="78AE3850338BFADCE59D8DDF58C9E4518E7510149C46142D7AAD7F1AD49D95D4" 

     decryptionKey="5FC88DFC24EA123C"

     validation="SHA1"/>

    MachineKey的设置请参考http://msdn.microsoft.com/zh-cn/asp.net/w8h3skw9.aspx

    3) 给两个站点设置相同name

    这样做是为了确保两个站点的siteID相同,siteID是site name的hash值,注意请不要使用默认站点,因为默认站点的siteID并非site name的hash.

    如果两个站点是在同一的服务器的话,需要对CrossDomainCookie再作一下修改,此方法也可应用于两个站点在不同服务器的情况:

    1) 使用相同的state server来存储Session.

    2) 用反射来设置System.Web.SessionState.OutOfProcSessionStateStore的静态字段s_uribase的值

     public class CrossDomainCookie : IHttpModule
        {
            private string m_RootDomain = string.Empty;

            #region IHttpModule Members

            public void Dispose()
            {

            }

            public void Init(HttpApplication context)
            {
                m_RootDomain = ConfigurationManager.AppSettings["RootDomain"];

                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++)
                {
                    app.Context.Response.Cookies[i].Domain = m_RootDomain;
                }
            }

            #endregion
        }

    完成这样的修改之后就可以实现Session的共享了。

    同样如果你是使用SQL server来存储Session, 也可以使用类似的方法来解决Session共享问题。

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/nutian/archive/2008/11/08/3254149.aspx


    资料引用:http://www.knowsky.com/538027.html

  • 相关阅读:
    js检测对象中是否存在某个属性
    ES6 笔记
    DataSet 用法
    CommandBehavior.CloseConnection有何作用
    SqlDataReader
    Listview.Finditem()函数用法
    Instr()函数用法
    StringBuilder与StringBuffer的区别
    [DllImport("kernel32.dll")]使用
    extern用法
  • 原文地址:https://www.cnblogs.com/LYunF/p/2356539.html
Copyright © 2011-2022 走看看