【问题标题】:Proper 100% IsOnline implementation for asp.net membership正确 100% IsOnline 实施 asp.net 会员
【发布时间】:2009-07-15 10:15:07
【问题描述】:

我必须设计一个 CMS,其中一组凭据只能使用一次。因此,如果用户从他的计算机登录,则在该用户注销之前,没有人可以使用他的凭据从另一个位置登录。

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

是否有任何硬性和快速的选择来执行此操作..?

我正在考虑强制用户被“记住”,所以当他登录时,布尔值“IsReallyOnline”将设置为 true,反之亦然。虽然这个选项有它的局限性,(人们关闭cookie,不注销并关闭浏览器,然后 sum1 会出现并且浏览器访问该站点并且他已登录等....)这似乎是目前最可行的?

有什么建议吗?

提前致谢

【问题讨论】:

    标签: c# asp.net-membership membership


    【解决方案1】:

    您确实是在寻求网络范围之外的东西。根据定义,HTTP 协议是无状态的,这意味着在任何时候;服务器永远不需要知道客户端是否仍然存在。 Web 服务器编程语言(例如 php / asp.net mvc)的新/旧实现在很大程度上避免存储有关已连接/活动客户端的任何状态。

    要问自己的一些事情包括:

    用户可以在页面上“活跃”多长时间而不导致回发?基于 Javascript 的页面可能允许用户在任何类型的回发发生之前以交互方式使用页面相当长的一段时间。

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

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

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

    有人可能会认为您的问题是由于您的要求尝试使用了错误的技术?也许编写一个使用直接连接到您的服务器的客户端应用程序会更“安全”? (是的,我知道这很麻烦,但如果您的一个用户/一个登录要求是绝对的,也许您可​​以探索这个途径?)

    好的,一个网络解决方案

    对于以 http 为中心的解决方案,您可以尝试使用 javascript 计时器每隔 X 秒向您的服务器发出请求,以指示会话仍然处于活动状态。只要浏览器打开并且网络连接有效,您就应该得到这些“ping”。会话由 httprequest 传递的 cookie 保持打开状态。

    您将能够对“ping”页面进行编码,以将用户详细信息存储到应用程序对象或您选择的某些成员资格提供程序中,然后在客户尝试登录时询问该提供程序。

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

    请注意:如果用户没有打开 javascript,这将非常失败(不要假设他们会打开!)

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-22
        • 1970-01-01
        • 1970-01-01
        • 2019-03-07
        • 1970-01-01
        • 2012-02-19
        • 2019-02-01
        • 2011-02-19
        相关资源
        最近更新 更多