2009-07-15 57 views
0

我必须设计一个CMS只能使用一次的凭据。因此,如果用户从他的计算机登录,则没有人可以使用其他位置的凭据登录,直到该用户注销。正确的100%IsOneline实现asp.net成员

现在使用asp.net成员资格提供程序,IsOnline方法返回一个布尔值,它反映了超时窗口与上一个活动日期的关系。这对我来说不是一个可行的选择,因为如果用户在登录后关闭浏览器,IsOnline仍然是真实的。但是他的会话将被破坏(假设他没有使用记住我),所以如果他尝试登录到其他地方,它会说“对不起,你仍然登录”。

有没有这样做的硬和快速的选择..?

我正在考虑迫使用户被“记住”,所以当他登录一个布尔型的“IsReallyOnline”时,他将被设置为true,反之亦然。尽管此选项有其局限性,关闭cookies,不注销和关闭浏览器,然后sum1 else来到浏览器的网站,他登录等....)它似乎是现在最可行的?

有什么建议吗?

在此先感谢

回答

1

你确实在寻求一些不在网络范围之内的东西。 HTTP协议根据定义是无状态的,意味着在任何时候;服务器从不需要知道客户端是否仍然存在。 Web服务器编程语言(例如php/asp.net mvc)的更新/更旧的实现大部分都避开存储关于连接/活动客户端的任何状态。

有些东西要问自己,包括:

多久可以在用户处于“有效”的网页上,而不会导致回发?基于Javascript的页面可以允许用户在任何类型的回发发生之前交互地使用页面一段时间。

用户是否会通过代理或缓存服务器?在这种情况下,来自“不同”用户的多个请求可能来自同一台机器。

您的应用程序只能在一台机器上运行,或者可能是服务器场?您需要确保负载均衡(例如)不会将不同用户放到允许多次登录的不同服务器上。

合法使用两台不同浏览器的用户在同一台​​机器上如何?这是允许的吗?

有人可能会建议你的问题来自于根据你的要求尝试使用错误的技术吗?也许编写一个使用直接连接到你的服务器的客户端应用程序会更“安全”? (是的,我明白这是巨大的麻烦,但如果你的一个用户/一个登录要求是绝对的,也许你可以探索这条大道?)

哦好吧,网络解决方案

对于HTTP中心的解决方案,你可以尝试一个JavaScript计时器发出请求到服务器每X秒,以表明该会话仍处于活动状态。只要浏览器打开并且网络连接有效,您应该可以获得这些“ping”。会话由httprequest传递的cookie保持打开状态。

您可以编写的“平”页面给用户详细信息存储到任何应用程序对象或您所选择的一些成员提供再询问此提供商每当客户端尝试登录。

这在会话或其他机制上需要相对较短的超时时间,以确保崩溃的浏览器不会长时间锁定合法用户。

请注意:如果用户没有打开javascript,请重新启动(不要假设他们会有!)

1

快速选项:将IsOnline存储为会话。 检查会话是否为真,然后允许。如果不是,不要允许。

如果用户关闭浏览器,他将在会话中被注销。