2011-11-22 67 views
1

我有一个特定的请求,只允许一个用户因为web应用程序性质而在时间使用asp.net应用程序。时间只有一个asp.net web应用程序的用户

我试图通过使用应用程序状态来使用某种会话计数器,它在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,但在上描述的情况下,我们将有一个锁becase的sessionCounter已经是2,如果第一个或第二个用户试图登录,它将无法验证,因为sessioncounter大于1。

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

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

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

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

第二个用户试图登录.DB标志被检查并且因为它已经被提出,所以他不能访问应用程序。如果我再设置一个条件来检查是否从上次插入的时间戳已经过去了一段时间,例如30分钟,我可以允许第二个用户访问应用程序而不管数据库标志,但这不是好的解决方案,因为我必须等待这段时间。

这个问题的最佳解决方案是什么? .net框架中是否有全局变量可供我们检查总在线用户数量(我没有使用成员资格提供程序)?

+1

你有没有尝试这里的方法是什么? http://stackoverflow.com/questions/380167/limiting-number-of-users-accessing-asp-net-website –

+0

谢谢。有效。我不知道我可以从session_start response.redirect。 – Zzz

+0

有一个很好的技巧来解决这个问题......我正在写入sysdate和用户名每隔5s到应用程序状态与ajax ..如果其他用户试图访问此页我检查是否有一段时间(例如5分钟)已从通过应用程序状态写入的最后日期传递过来。如果有人偶然关闭浏览器,则JavaScript将停止将sysdate写入应用程序状态,并且下一个用户将不得不等待一段时间才能访问此页面 – Zzz

回答

3

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

Limiting Connections to Manage Resources (IIS 6.0)

enter image description here

+0

这是很好的解决方案,但我可以不会使用它,因为我必须与其他一些应用程序共享IIS网站,并且将连接限制为1会导致其他应用程序连接受限。 – Zzz

+0

您可以限制每个应用程序的连接。 –

相关问题