当时只有一个asp.net Web应用程序用户

时间:2011-11-22 18:08:15

标签: asp.net concurrency global-asax

由于Web应用程序的性质,我有一个特定的请求,只允许一个用户使用asp.net应用程序。

我尝试使用Application状态使用某种会话计数器来实现这一点,会话计数器在session_start上递增并在session_end上递减,但问题是会话在应用程序显示登录表单时立即启动(因为表单身份验证)。

如果第一个用户浏览器显示login.aspx,则调用global.asax中的session_start,并将sessioncounter增加为1. SessionCounter现在等于1.

如果另一个用户浏览器也显示login.aspx,则在第一个用户通过身份验证之前,将调用global.asax中的session_start并将sessioncounter增加为1. SessionCounter现在等于2.

我的想法是仅在SessionCounter< = 1时验证用户。但在上面描述的情况下,我们将有一个锁,因为sessionCounter已经是2,如果第一个或第二个用户尝试登录,它将无法进行身份验证,因为sessioncounter大于1。

第二个问题是在身份验证超时之前会话超时。如果第一个用户的会话超时,并且在那个时刻第二个用户尝试登录第二个用户将成功进入应用程序。但是如果第一个用户因为他的身份验证没有超时而进行一些回发会发生什么。将启动新会话,将调用session_Start事件处理程序,会话计数器将增加,但用户仍将登录,因为用户已经过身份验证。

最好的方法是什么?是否可以避免应用程序状态,因为如果未使用会话对象,ASP.net 3.5已知在session_Start之后立即调用session_end的问题。

我已经考虑过使用一些数据库标志,但是我会遇到另一个问题。如果用户在重置此标志之前关闭浏览器会发生什么。我可以在举旗时插入一些时间戳。然后我会有以下情况:

第一个用户登录。引发DB标志并插入时间戳。第一个用户忘记注销,只关闭浏览器。

第二个用户尝试登录。检查DB标志,因为它已经被提升,他无法访问应用程序。如果我再设置一个条件来检查从最后插入的时间戳开始是否已经过了一段时间,例如30分钟,我可以允许第二个用户访问应用程序而不管DB标志,但这不是一个好的解决方案因为我必须等待这段时间。

这个问题的最佳解决方案是什么? .net框架中是否有可用的全局变量,它允许我们检查总在线用户数(我不使用会员提供商)?

1 个答案:

答案 0 :(得分:3)

您应该可以通过限制连接数量并添加自定义错误页面来处理403.9 (Forbidden - Too Many Users)错误,从而通过IIS执行此操作。

Limiting Connections to Manage Resources (IIS 6.0)

enter image description here