同一域名下不同应用如何实现Session跨应用共享?
同域名多站点Session共享解决方案
默认ASP.NET的Session机制存在三层隔离规则,所以跨独立应用无法直接读取到其他站点的Session值:
- Session依赖的SessionID Cookie默认路径为当前应用的虚拟目录,不同子路径的站点不会互传对应Cookie
- 每个独立应用默认使用随机生成的machineKey做数据加密解密,无法识别其他应用生成的加密SessionID
- 默认InProc(进程内)模式的Session存储在当前应用的进程内存中,不同应用的内存数据完全隔离
按以下步骤配置即可实现跨站点Session读取:
第一步:统一SessionID Cookie配置
在两个站点的web.config文件中添加相同的Cookie规则,指定Cookie作用域为根域名和根路径:<system.web> <httpCookies domain="test.com.tw" path="/" /> <sessionState cookieName="ASP.NET_SessionId" timeout="20" /> </system.web>第二步:配置完全一致的machineKey
在两个站点web.config的system.web节点下添加相同的machineKey配置,用于统一SessionID的加密解密逻辑:<machineKey validationKey="自行生成的32位及以上长度的十六进制随机字符串" decryptionKey="自行生成的16位及以上长度的十六进制随机字符串" validation="SHA1" decryption="AES" />注意:不要使用公开的示例密钥,需自行生成符合长度要求的随机密钥,避免出现安全漏洞
第三步:切换为统一的进程外Session存储
替换默认的进程内存储方案,任选一种统一存储方式即可:- ASP.NET状态服务:先开启系统自带的
ASP.NET State Service服务,两个站点配置相同的状态服务连接:
<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" cookieless="false" timeout="20" />- SQL Server存储:先通过
aspnet_regsql.exe工具初始化Session数据库,两个站点配置相同的数据库连接:
<sessionState mode="SQLServer" sqlConnectionString="data source=你的数据库地址;user id=登录账号;password=登录密码" cookieless="false" timeout="20" />- 分布式缓存存储:如使用Redis等分布式缓存,安装对应的Session提供组件后,两个站点配置相同的缓存连接即可。
- ASP.NET状态服务:先开启系统自带的
配置完成后需重启两个站点的应用程序池,清理浏览器原有Cookie后再测试,避免旧缓存数据干扰测试结果。
内容的提问来源于stack exchange,提问作者鄭有維
相关产品推荐
相关产品推荐

