WEB开发网      婵犵數濞€濞佳囧磹婵犳艾鐤炬い鎰堕檮閸嬬喐銇勯弽銊с€掗梻鍕閺岋箑螣娓氼垱笑闂佽姘﹂褔婀佸┑鐘诧工妤犲憡绂嶉崜褏纾奸弶鍫涘妼缁楁岸鏌熷畡鐗堝殗闁诡喒鏅犲畷褰掝敃閵堝棙顔忔繝鐢靛仦閸ㄥ爼骞愰幘顔肩;闁规崘绉ぐ鎺撳亹闁绘垶锕╁Λ鍕⒑閹肩偛濡奸悗娑掓櫇缁顓兼径妯绘櫇闂佹寧绻傞弻濠囨晝閸屾稓鍘甸柣搴㈢⊕閿氶柣蹇ョ稻缁绘繃绻濋崘銊т紝闂佽鍨伴崯鏉戠暦閻旂⒈鏁傞柛鈾€鏅欑槐妯衡攽閻愬樊鍤熷┑顔藉劤铻為柛鏇ㄥ墯閸欏繘鏌嶉崫鍕櫣缂佲偓婢跺绠鹃柟瀛樼箘閿涘秵顨ラ悙顏勭伈闁诡喖缍婂畷鎯邦槻婵℃彃顭烽弻娑㈠Ω閵夈儺鍔夌紓浣稿€哥粔褰掑极閹剧粯鏅搁柨鐕傛嫹 ---闂傚倷鐒︾€笛兠洪埡鍛闁跨噦鎷�
开发学院WEB开发ASP.NET ASP.NET二级域名站点共享Session状态 阅读

ASP.NET二级域名站点共享Session状态

 2009-09-06 17:41:37 来源:WEB开发网 闂傚倷绶氬ḿ褍螞閹绢喖绠柨鐕傛嫹闂傚倷绀侀幉锟犲垂閻㈠灚宕查柟鎵閸庡秵銇勯幒鎴濃偓鐢稿磻閹炬枼妲堟繛鍡楃С濞岊亞绱撻崒姘扁枌闁瑰嚖鎷�婵犵數濮幏鍐川椤撴繄鎹曢梻渚€娼уú銈吤洪妸鈺佺劦妞ゆ帊鑳堕埊鏇㈡煏閸モ晛浠х紒杈╁仱閺佹捇鏁撻敓锟�闂傚倷绶氬ḿ褍螞閹绢喖绠柨鐕傛嫹  闂傚倷鑳舵灙缂佺粯顨呴埢宥夊即閵忕姵鐎梺缁樺姈椤愮厧鈽夊Ο閿嬬€婚梺褰掑亰閸撴稑鈻斿鑸碘拺闁告稑饪村▓鏃€绻涚仦鍌氬闁崇粯鎹囬獮瀣攽閹邦剚顔傛俊鐐€栧濠氬储瑜忛幉鎾晸閿燂拷
核心提示:asp.net二级域名站点共享session状态 我的前面一篇文章提到了如何在使用了ASP.NET form authentication的二级站点之间共享登陆状态,http://www.cnblogs.com/jzywh/archive/2007/09/23/902905.html,ASP.NET二级域名站点共享Se

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

Tags:ASP NET 二级域名

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接