代码之家  ›  专栏  ›  技术社区  ›  Aaron Palmer

当formsauthenticated用户未经身份验证时要捕获的事件

  •  3
  • Aaron Palmer  · 技术社区  · 17 年前

    我基本上是在寻找与正式认证相反的事件。我想在用户注销时从数据库中删除一些值。我试着把它放到Session_End事件中,但似乎在执行这个时用户已经离开了。

    更新: 如果我无法确定某个特定用户何时被取消身份验证(即,由于会话超时),那么是否有方法获取当前所有已验证用户的列表?如果可以,那么在会话结束时,我可以从数据库中删除与当前经过身份验证的用户无关的记录。

    4 回复  |  直到 17 年前
        1
  •  2
  •   Zhaph - Ben Duguid    17 年前

    会话\u End不保证触发-例如,如果您不使用InProc会话,那么它根本不会触发。如果您的应用程序再次被回收或死亡,它将不会启动。

    1. 在你的 LoginStatus 控件,您可以设置 LoggingOut 事件-在那里调用您的方法以明智地处理注销的人。
    2. 如果您不使用InProc会话,则需要更具创造性。也许可以看看有一个时不时触发的事件(也许是在Session_Start上,不管触发与否),它会通过并清除那些上次活动时间早于会话超时的用户(如Greg所述)。

    不幸的是 Membership class

    GetNumberOfUsersOnline
    

    这将“获取当前访问应用程序的用户数”-很好,但唯一能够获取用户数的方法是:

    GetAllUsers      // Gets all the users from the storage provider (can be paged)
    FindUsersByName
    FindUsersByEmail
    

    不幸的是,所有这些都没有一个属性只能根据计数返回“活动用户”。

    查看MembershipUser的成员,没有“IsOnline”属性—只有LastLogonDate和LastActivityDate—由于web的断开连接特性,这可能是您将要得到的最好结果。

        2
  •  0
  •   DCNYAM    17 年前

    我会想象你让他们通过点击按钮或链接或类似的方式注销。为什么不把代码放在同一个事件/块中呢。靠近放置FormsAuthentication.SignOut()调用的位置。

        3
  •  0
  •   Jim Petkus    17 年前

    Global.asax中有一个Session_End处理程序,您可以在其中放置会话到期时要执行的文件。

    我不确定这是你想要的。会话和身份验证是两件不同的事情。如果您的身份验证技术向用户(在cookie中)提供FormsAuthenticationTicket,并且该ticket已过期,那么身份验证的过期将通过该ticket进行控制。它将不会在服务器上进行主动管理。将提供用户发出的每个请求,然后服务器确定用户是否仍然经过身份验证。

        4
  •  0
  •   Greg    17 年前

    如果您使用的是SQL提供程序,则aspnet_Users表有一个“LastActivityDate”列。如果将其与表单身份验证的超时值进行比较,您可以得到一个用户列表,其中肯定没有登录。如果他们使用“注销”链接手动注销,您的计数将很低。

    推荐文章