阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

解决asp.net负载均衡时Session共享的问题

427次阅读
没有评论

共计 4713 个字符,预计需要花费 12 分钟才能阅读完成。

每个客户端在访问网站时,都会创建相应的 Session,用来保存客户的状态信息,网站如果做了负载均衡,session 共享是要做的,IIS 对于 session 的存储有五种模式

一、ASP.Net session 存储方式

1、InProc 模式 (进程内模式)。为默认设置。

会话状态存储在 Web 服务器上的内存中。

2、StateServer 模式 (状态服务器模式)。

会话状态存储在一个名为 ASP.Net 状态服务的单独进程中。这确保了在重新启动 Web 应用程序时会保留会话状态,并让会话状态可用于网路场中的多个 Web 服务器。

3、SQL Server 模式。

会话状态存储到一个 SQL Server 数据库中。这确保了在重新启动 Web 应用程序时会保留会话状态,并让会话状态可用于网路场中的多个 Web 服务器。

4、Custom 模式

此模式允许您指定自定义存储提供程序。

5、Off 模式

此模式禁止会话状态。

二、使用 StateServer 存储 session

      如果网站做了负载均衡,对于 session 存储就只能选择 2、3、4 了,下面先来介绍一下 StateServer 模式,首先得开启状态服务

解决 asp.net 负载均衡时 Session 共享的问题

然后再对 web 站点的“会话状态”进行设置

解决 asp.net 负载均衡时 Session 共享的问题

启用本机的状态服务

解决 asp.net 负载均衡时 Session 共享的问题

会自动在 web.config 里生成配置文件(如果不能生成就手动添加)

<sessionState mode=”StateServer”stateConnectionString=”tcpip=loopback:42424″ timeout=”20″ />
 

但是这里就存在一个问题,如果每台服务器都照上面配置,各服务器的 Session 都存储在本机的 StateServer 里面,还是没有启动共享的作用,这里就需要让一台 StateServer 共享出来让其他服务器访问,并将 Session 存储到上面,运行 regedit → 打开注册表 → 找到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters 节点 → 将 AllowRemoteConnection 的键值设置成“1”(1 为允许远程电脑的连接,0 代表禁止)

解决 asp.net 负载均衡时 Session 共享的问题

 

也可以修改 StateServer 的端口

解决 asp.net 负载均衡时 Session 共享的问题

 

接下来将其它服务器中 web.config 的配置文件进行修改(sessionState 指向开启了允许远程访问的 StateServer)

<sessionState mode=”StateServer”stateConnectionString=”tcpip=10.16.5.30:22222″ timeout=”20″ />
 

用 StateServer 这种共享式的 session 存储方式不仅有安全隐患,而且像上面那台共享的 StateServer 只要重启服务器,所有的 session 都会丢失,所以这种 session 存储方式不是很完美,用 StateServer 存储 sesssion 比较适合单机 IIS 开启多进程的。

解决 asp.net 负载均衡时 Session 共享的问题

三、使用 SQL server 存储 session

      要做保证安全并且不会因为重启服务器导致 session 丢失,那就要用 sql server 来存储 session,ASP.NET 2.0 版本后微软提供了 aspnet_regsql.exe 工具可以方便的配置 Session 数据库. 该工具位于 Web 服务器上的系统根目录 Microsoft.NETFramework 版本号文件夹中

cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319
aspnet_regsql.exe  -ssadd -sstype c -d <Database Name> -S <SQL Server IP> -U <User Name> -P <Password>
aspnet_regsql.exe  -ssadd -sstype c -d ASPState -S 10.16.5.36 -U sa -P HAha789
 

注:<Database Name> 为数据库名为 ASPState,<SQL Server IP> 为数据库实例名像 IBM-PC\SQLEXPRESS(若数据库不是 2005 的不要写 ip 地址,否则会连接失败),<User Name> 为 sa(或与 sa 同等权限的),<Password> 为 sa 用户名的密码会话定义成功,但是会提示在 web 应用中进行相应的配置,此时查看 SQLServer 会发现增加了数据库 ASPState,但是没有表。

在命令行下运行如下命令:aspnet_regsql.exe  -ssadd -sstype p -S <SQL Server IP> -U <User Name> -P <Password>

aspnet_regsql.exe  -ssadd -sstype p -S 10.16.5.36 -U sa -P HAha789
 

解决 asp.net 负载均衡时 Session 共享的问题

该命令对此应用进行了持久化操作。这时会看到 ASPState 数据库里面多了两张表,ASPStateTempSession 就可以用来保存 Session,接下来要对 web 站点的“会话状态”进行设置

解决 asp.net 负载均衡时 Session 共享的问题

ASPStateTempSessions 表中的 SessionID , 包括两个部分:网站生成的 24 位 SessionID 及 8 位 AppId 组成,对于不同的站点,其 AppId 和 AppName 也不同,在能够在不同站点下 Session 共享,就得保证这个 32 位的 SessionID 一致,所以可以通过修改存储过程 TempGetAppID,使其得到的 SessionID 与 AppName 无关,修改 TempGetAppID 如下

解决 asp.net 负载均衡时 Session 共享的问题

修改 web.config(在数据库中为 ASPState 单独分配一个帐户)

<sessionState mode="SQLServer" sqlConnectionString="data source=10.16.5.36;user id=sa;password=HAha789" cookieless="false" timeout="20"></sessionState>
 

这样就实现了 sql server 对 session 的存储,当然也可以用 memcache 来存储 session

 

四、ASP.NET 错误,验证视图状态 MAC 失败

      但在在网站登录访问时却报错了“ASP.NET 错误,验证视图状态 MAC 失败”,baidu 了一下,大部分人都说是在页里或 web.config 里加 EnableEventValidation=”false” EnableViewStateMac=”false” ViewStateEncryptionMode=”Never” 这些属性的设置。但是这并不从根本上解决问题,相反这样做了反而更加不安全。不能说出错就不用了?出错得解决问题,得从根本上解决问题。

 

分析错误原因:

ASP.NET 中有很多涉及到加密的东西,比如 ViewState,比如 FormsAuthenticationTicket,这些东西都是要传送到客户端的,加密才能保障其安全性。加密就得有个私钥,但这个私钥我们并没有指定啊,那是因为 ASP.NET 自动生成的。但是如果是在网络场或群集中,或者在某些做了 CDN 加载的虚拟主机中,由于涉及到多台服务器 ASP.NET 就无法为各台机器自动生成相同的私钥,这就造成了这个服务器产生的数据,那台服务器解析不出来。于是就出错了。怎么办?既然 ASP.NET 在多台服务器上无法自动随机生成相同的私钥,那只有我们自己指定了。

MachineKey 生成工具,自动生成代码

https://www.fishlee.net/tools/machinekeygenerator

将生成的 Machinekey 插入到 web.config 中:

<system.web>
<machineKey validationKey="A89B01ED6C356FCFEEB884EA523D7827F719C7A9F26BCC808A109C516D57DF91D2D7612127F06957C6643913DB893F66492A2FB85D44805735BA96DF41071B0F" decryptionKey="E9F179A7EF94763ABD9A79B07BA61F49550235125FADEF942BD2045B2A9803C8" validation="SHA1" decryption="AES" />
</system.web>
 

MachineKey 的作用:

ASP.net 使用 forms authentication 时的 cookie 数据的加密和解密。以确保这部分数据不会被篡改 viewstate 数据的加密和解密。以确保这部分数据不会被篡改。使用进程外 session(out-of-process session)时,对会话状态标识进行验证。利用 SessionStateMode 的 SQLServer 来实现 session 共享,毕竟是微软的东西,具有一定的局限行,只能是 sql server。其实 session 共享可以用其他的数据库,比如 memcache、redis

 

五、ASP.NET 状态数据库 FAQ

1、如果把 SESSION 值存放到数据库中去,用户关闭了程序那怎么样清空数据库里的 SESSION 值呢?

   实际 ASP.NET 在创建状态数据库的时候会在 SQL Server 代理(SQL Server Agent)的作业中添加一个作业,名称为 < 状态数据库名 >_Job_DeleteExpiredSessions。如果打开 SQL Server 代理服务数据库可以通过添加的状态记录的超时时间字段(Exprires)定期对超时的状态数据进行删除。

解决 asp.net 负载均衡时 Session 共享的问题

2、ASPStateTempSessions 表中的 SessionId 字段如何使用?

数据库中此表的 SessionID 字段的值,由 SessionID 和 AppID 共同组成,最后 8 位为 AppID 所以,后 8 位之前一定是 SessionID。例如,存储在数据库中的值为 ”ekr30c3mwvnc3145yrswew3a037e5e5a”,后 8 位的 ”037e5e5a” 为 AppID,而前面的 ”ekr30c3mwvnc3145yrswew3a” 为应用程序中你可以使用 Session.SessionID 获得的字符串。

解决 asp.net 负载均衡时 Session 共享的问题

3、如何判断 Session 何时被更新的?

Session 记录被更新时会同时更新 Expires 和 LockDateLocal,Expires 字段为 UTC 时间,如果想通过本地之间进行比较判断还是需要使用 LockDateLocal。

4、获得 Web.config 配置文件节点信息的程序?

” 获得 Web.config 文件配置实例

Dim configuration As System.Configuration.Configuration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(“~/web.config”)

” 获得状态配置节点实例

Dim mSessionStateSection As System.Web.Configuration.SessionStateSection = CType(configuration.GetSection(“system.web/sessionState”),System.Web.Configuration.SessionStateSection)

” 获得状态模式

Response.Write(mSessionStateSection.Mode)

” 获得状态超时时间

Response.Write(mSessionStateSection.Timeout)

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计4713字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19351
评论数
4
阅读量
7988627
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
星哥带你玩飞牛NAS-1:安装飞牛NAS

星哥带你玩飞牛NAS-1:安装飞牛NAS

星哥带你玩飞牛 NAS-1:安装飞牛 NAS 前言 在家庭和小型工作室场景中,NAS(Network Atta...
开发者福利:免费 .frii.site 子域名,一分钟申请即用

开发者福利:免费 .frii.site 子域名,一分钟申请即用

  开发者福利:免费 .frii.site 子域名,一分钟申请即用 前言 在学习 Web 开发、部署...
星哥带你玩飞牛NAS硬件03:五盘位+N5105+双网口的成品NAS值得入手吗

星哥带你玩飞牛NAS硬件03:五盘位+N5105+双网口的成品NAS值得入手吗

星哥带你玩飞牛 NAS 硬件 03:五盘位 +N5105+ 双网口的成品 NAS 值得入手吗 前言 大家好,我...
从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统 大家好,我是星哥。公司的项目文档存了一堆 ...
星哥带你玩飞牛NAS硬件 01:捡垃圾的最爱双盘,暴风二期矿渣为何成不老神话?

星哥带你玩飞牛NAS硬件 01:捡垃圾的最爱双盘,暴风二期矿渣为何成不老神话?

星哥带你玩飞牛 NAS 硬件 01:捡垃圾的最爱双盘,暴风二期矿渣为何成不老神话? 前言 在选择 NAS 用预...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸 前言 作为天天跟架构图、拓扑图死磕的...
150元打造低成本NAS小钢炮,捡一块3865U工控板

150元打造低成本NAS小钢炮,捡一块3865U工控板

150 元打造低成本 NAS 小钢炮,捡一块 3865U 工控板 一块二手的熊猫 B3 工控板 3865U,搭...
Prometheus:监控系统的部署与指标收集

Prometheus:监控系统的部署与指标收集

Prometheus:监控系统的部署与指标收集 在云原生体系中,Prometheus 已成为最主流的监控与报警...
颠覆 AI 开发效率!开源工具一站式管控 30+大模型ApiKey,秘钥付费+负载均衡全搞定

颠覆 AI 开发效率!开源工具一站式管控 30+大模型ApiKey,秘钥付费+负载均衡全搞定

  颠覆 AI 开发效率!开源工具一站式管控 30+ 大模型 ApiKey,秘钥付费 + 负载均衡全...
星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的 NAS 中! 大家对「数据安全感」的需求越来越高 ...