Asp.Net StateServer实现共同域名下Session共享

概述

在实验的时候,参照了多方的信息,确实成功了,这里简单记录一下。

我们知道,在Asp.Net的Web.Config文件中,System.Web节点下,有个sessionState节点,它说明了应用程序的Session处理方式,它有如下几个选项:

MSDN对其分别作简单的解释:

(MSDN地址:https://msdn.microsoft.com/zh-cn/library/h6bb9cz9(VS.80).aspx)



说明


Custom


会话状态将使用自定义数据存储区来存储会话状态信息。


InProc


会话处于正在处理 ASP.NET 辅助进程的状态。这个辅助进程是:aspnet_state.


Off


会话状态被禁用。


SQLServer


会话状态将使用进程外 SQL Server 数据库来存储状态信息。


StateServer


会话状态将使用进程外 ASP.NET 状态服务来存储状态信息。

我们今天要说的是StateSerrer方式,我们采取远程服务器的aspnet_state进程来集中管理多台服务器的Session。

概述

路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\aspnet_state\Parameters

将AllowRemoteConnection的值设置为1.

    注意:配置完成后要在服务管理器中重启aspnet_state这个服务.

第二步:配置的Web.config来指定Session服务器地址和连接参数

1.配置应用服务器Web.Configsystem.web下的SessionState节点

<sessionState cookieless="UseCookies" mode="StateServer" stateConnectionString="tcpip=192.168.5.2:42424" timeout="20"/>

其中:mode一定是StateServer

StateConnectionString是tcpip=Session服务器IP:端口的格式,tcpip指应用服务器与Session服务器交流Session数据时采用的传输方式,Session服务器就不说了,端口默认是42424.

   2.配置应用服务器下system.web下的machineKey 节点

<machineKey validationKey="7285450293EE699F349F7DB9BEA1F0B9EE1F045F" decryptionKey="73035EE41002AFB88D12A1B08559389CA351359A232649B3" validation="SHA1" />

这个machineKey的值可以是随意的,但应用服务器和Sessione服务器一定要配成一样的,因为需要用它来给session进行解密。

情况1:设置Session的域----同域名(www.a.com)访问

因为stateserver会把这些要共享session放置到 appdomin的情况来区分,而appdomain是根据网站的标识ID来区分的,因此我们只需要共享Session的应用服务器的域设置成一样即可。当共享Session的应用均是www.a.com时,我们可以在自定义IHttpModule中,在request结束的事件中,改写ASP.NET_SessionId的cookie的 domain为这些网站的主域名即可。如下所示(转自:http://sai5d.blog.163.com/):

public class ShareSessionModule : IHttpModule
    {
        #region IHttpModule 成员

        void IHttpModule.Init(HttpApplication context)
        {
            context.EndRequest += new EventHandler(this.EndRequest);
        }

        private void EndRequest(object sender, EventArgs args)
        {
            HttpApplication application = sender as HttpApplication;
            for (int i = 0; i < application.Response.Cookies.Count; i++)
            {
                if (application.Response.Cookies[i].Name == "ASP.NET_SessionId")
                    application.Response.Cookies[i].Domain = ".test.com";
            }
        }

        #endregion
    }

情况2:设置Session的域----跨域名(www.a.com和www.b.com)访问概述

共享的网站是跨域名了,如www.a.comwww.b.com ,按照情况1的思路,现在Session在服务器是存在两个appdomain中了,这样我们就不能共享Session了。但,我们可以通过反射修改 OutOfProcSessionStateStore类中静态成员s_uribase来实现我们的目的,它是state外部存储需要访问的appdomain的一个内部id(其实就是多个appdomain映射为一个内部id,这个id就是s_uribase)。只要在创建session前,设置一个相同的appdomain的id,这样就能确保取session和放置session都到同一个 appdomain中,这个id可以随意设置。如下所示(转自:http://sai5d.blog.163.com/):

public class ShareSessionModule : IHttpModule
    {

        #region IHttpModule 成¨|员

        void IHttpModule.Dispose()
        {
            //throw new Exception("The method or operation is not implemented.");
        }

        void IHttpModule.Init(HttpApplication context)
        {
            //throw new Exception("The method or operation is not implemented.");
            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, ".test.com");
            context.EndRequest += new EventHandler(this.EndRequest);

        }

        private void EndRequest(object sender, EventArgs args)
        {
            HttpApplication application = sender as HttpApplication;

            for (int i = 0; i < application.Response.Cookies.Count; i++)
            {

                application.Response.Cookies[i].Domain = ".test.com";
            }
        }

        #endregion
    }

第三步:将自定义HttpModule加入Web.config

<httpModules>
   <add name="CookieTest" type="WebApplication1. ShareSessionModule,WebApplication1"/>
</httpModules>

参考文档

http://sai5d.blog.163.com/blog/static/62225483201010211393132/

https://msdn.microsoft.com/zh-cn/library/h6bb9cz9(VS.80).aspx

时间: 2024-10-17 10:06:17

Asp.Net StateServer实现共同域名下Session共享的相关文章

Asp.Net 跨域,Asp.Net MVC 跨域,Session共享

比如 http://www.test.com 和 http://m.test.com 简单粗暴的方法 Web.Config <system.web> <!--其他配置 省略……--> <httpCookies domain="test.com" /><!--同一顶级域名--> </system.web> <handlers> <!--其他配置 省略……--> <!--<remove name

Session共享的解决方案

http://www.cnblogs.com/xinhaijulan/archive/2010/08/21/1805116.html 1.客户端SessionID值唯一: 对于不同的域名:主域名.子域名.跨站点域名或跨服务器域名,用户在打开页面时会产生不同的SessionID, 为了使这些站点在用户登录时只登录一次,那我们就要解决SessionID的问题,必须使SessionID在这些共享Session的站点中只产生一次.而SessionID是存储在客户端的cookie之中键值为ASP.NET_

memcache相同主域名下的session共享

本配置适合具有相同主域名的多台服务器进行session共享. 例如:www.lee.com , bbs.lee.com(多个子域名). 配置session保存在memcache: ini_set("session.save_handler", "memcache"); ini_set("session.save_path", "tcp://127.0.0.1:11211"); **多个memcache服务器用逗号分隔: **i

Asp.Net集群中Session共享

今天遇到了这个问题,于是研究了一下.要解决这个问题,首先就要明白一些Session的机理.Session在服务器是以散列表形式存在的,我们都知道Session是会话级的,每个用户访问都会生成一个Session.那么服务器是怎么区分不同用户的Session?又是怎么将不同用户的Session与不同的用户绑定的呢?下面我们来研究一下,以下纯属我个人的理解,如有错误请指证. Session在服务器端是以散列表的形式存在的,区分每一个Session是通过SessionID来实现的,所以可以说这个Sess

ASP.NET中Cookie跨域的问题及解决代码

ASP.NET中Cookie跨域的问题及解决代码 http://www.liyumei.net.cn/post/share18.html Cookies揭秘  http://www.cnblogs.com/zhangziqiu/archive/2009/08/06/cookies-javascript-aspnet.html 最近在项目开发中遇到一个很棘手的问题,一个用户在顶级域名登录后,跳转到自己所拥有的二级域名下管理二级网站时,cookie丢失了,一直找解决办法找了整整两天,百度谷歌一大堆,

asp.net 二级域名session共享

1.自定义类 namespace SessionShare{ public class CrossDomainCookie : IHttpModule { private string m_RootDomain = string.Empty;#region IHttpModule Memberspublic void Dispose() {}public void Init(HttpApplication context) { m_RootDomain = ConfigurationManage

Asp.net mvc与PHP的Session共享的实现

最近在做的一个ASP.NET MVC的项目,要用到第三方的php系统,为了实现两个系统的互联互通.决定将两者的session打通共享.让asp.net mvc 和php 都能正常访问和修改Session内容. 在决定实现之前,先搜索了一下院子里有没有相类似的文章,对于跨语言的程序互通,有两种方案: (1)       SSO单点登录,其实就是把用户名和密码传给另一个系统在另一个系统上自动创建session 来解决. (2)       还有就是用同一套Session,在数据库或缓存上架设sess

PHP多台服务器跨域SESSION共享

网站业务规模和访问量的逐步发展,原本由单台服务器.单个域名的迷你网站架构已经无法满足发展需要. 此时我们可能会购买更多服务器,并且启用多个二级子域名以频道化的方式,根据业务功能将网站分布部署在独立的服务器上:或通过负载均衡技术 (如:DNS轮询.Radware.F5.LVS等)让多个频道共享一组服务器. OK,头脑中我们已经构思了这样的解决方案,不过进入深入开发后新的技术问题又随之而来: 我们把网站程序分布部署到多台服务器上,而且独立为几个二级域名,由于Session受实现原理的局限(PHP中S

URL资源跨域访问 跨域使用session信息

SilverLight 出于对安全性的考虑默认情况下对URL的访问进行了严格的限制,只允许访问同一子域下的URL资源. 下表列出了Silverlight 2.0 中 URL 访问规则:   WebClient对象 Media.images.ASX XAML 文件.Font 文件 流媒体 允许的协议 HTTP, HTTPS HTTP, HTTPS, FILE HTTP, HTTPS, FILE HTTP 跨协议访问 不允许 不允许 不允许 不允许来自HTTPS的访问 跨Web域访问 不允许 如果不