我必须设计一个CMS,其中一组凭据只能使用一次。因此,如果用户已从他的计算机登录,则在该用户退出之前,没有人可以使用其他位置的凭据登录。
现在使用asp.net成员资格提供程序,IsOnline方法返回一个反映超时窗口与上一个活动日期的布尔值。这对我来说不是一个可行的选择,因为如果用户在登录后关闭浏览器,IsOnline仍然是真的。但他的会话将被销毁(假设他没有使用“记住我”),所以如果他试图登录其他地方就会说“抱歉你还在登录”。
这样做有什么硬性和快速的选择吗?
我正在考虑强迫用户“记住”,所以当他登录布尔时,“IsReallyOnline”将被设置为true,反之亦然,当他退出时..虽然这个选项有它的局限性,(人们关闭cookies,没有注销和关闭浏览器然后sum1其他来和浏览器到网站,他登录等....)它似乎是现在最可行的?
有什么建议吗?
提前致谢
答案 0 :(得分:1)
快速选项:将IsOnline存储为会话。 检查会话是否为真,然后允许。如果没有,请不要允许。
如果用户关闭浏览器,他将在会话中注销。
答案 1 :(得分:1)
你真的要求的东西不在网络的范围内。根据定义,HTTP协议是无状态的,这意味着在任何时候;服务器永远不需要知道客户端是否仍然存在。 Web服务器编程语言的新旧实现(例如php / asp.net mvc)大部分都避免存储关于连接/活动客户端的任何状态。
要问自己的一些事情包括:
用户在不导致回发的情况下在页面上“活动”多长时间?基于Javascript的页面可能允许用户在发生任何类型的回发之前以交互方式使用页面很长一段时间。
用户是通过代理还是缓存服务器?在这种情况下,来自“不同”用户的多个请求可能来自同一台计算机。
您的应用程序是仅在一台计算机上运行,还是在服务器场上运行?您需要确保负载平衡(例如)不会将不同的用户放到允许多次登录的不同服务器上。
用户如何在同一台计算机上合法使用两种不同的浏览器?这是允许的吗?
有人可能会建议您的问题源于尝试根据您的要求使用错误的技术吗?也许编写一个使用直接连接到服务器的客户端应用程序会更“安全”? (是的,我理解这是一个巨大的麻烦,但如果您的一个用户/一个登录要求是绝对的,也许您可以探索这条大道?)
好吧,网络解决方案
对于以http为中心的解决方案,您可以尝试使用javascript计时器每隔X秒向服务器发出一个请求,以指示会话仍处于活动状态。只要浏览器打开并且网络连接有效,您就应该获得这些“ping”。会话由httprequest传递的cookie保持打开状态。
您将能够对“ping”页面进行编码,以将用户详细信息存储到应用程序对象或您选择的某个成员资格提供程序中,然后在客户端尝试登录时询问此提供程序。
这需要在会话或其他一些机制上花费相对较短的时间来确保崩溃的浏览器不会长时间锁定您的合法用户。
请注意:如果用户没有打开javascript,这将会非常失败(不要以为他们会有!)