ASP.NET单一登录-分配会话的答案

时间:2020-03-06 14:54:41  来源:igfitidea点击:

我们有5个平衡的Web服务器,带有各种网站。
我试图实现的是确保单次登录。
即同一个用户帐户在任何给定时间都不能多次登录同一个网站。

我正在考虑解决此问题的方法是在服务器之间共享会话,以便我可以控制将哪个会话分配给哪个帐户。然后,我可以控制自己的登录名。如果用户登录并且已经有一个分配给其用户帐户的会话,那么我可以使第一个会话到期或者拒绝登录。

我不想失去平衡服务器的好处,因此不能选择使用单个Sql Server作为会话状态服务器,或者使用单个服务器来处理登录。

分布式会话(类似于Scaleout Sofware)是否是实现此目标的正确方法?

还是有另一种机制可以处理我从未意识到的单点登录?

解决方案

我们在这里有两套问题:
1)在Web场方案中仅允许一个连接的用户
2)检测用户注销
要解决第一个问题,唯一的解决方案是使用某种中央服务器来存储ASP.Net会话或者某种其他集中式用户状态,从而为某种用户状态提供中央存储。此中央存储可以是使用会话状态的本机管理的SQL Server(顺便说一句,Oracle也来自Oracle 11,可以支持会话存储),AspState服务或者外部解决方案,例如ScaleOut(如我们所说)或者其开源替代memcached (请参阅https://sourceforge.net/projects/memcacheddotnet/)。或者,我们可以设计一个简单的集中式Web服务,以检查SQL Server数据库中的活动登录,这样,我们还可以快速创建有关已登录用户等的报告工具。
我认为,真正的问题在于第二部分,我们需要维护网络世界中可用的不同"错误注销"方案(例如,由于崩溃而关闭浏览器或者在不注销的情况下关闭应用程序),为应用程序提供某种方式来与启用了旧会话的用户正常工作(如我们所说,仅使第一个会话过期就可以)。
还请记住,使用状态服务器(例如SQL Server)不会使我们失去平衡的服务器,如果要使用这种方法来使Web场环境和共享会话有效,则唯一的问题在于性能(如果会话状态变大),并且如果我们还没有适当的许可证,则使用SQL Server涉及的成本。