当formauthenticated用户未经过身份验证时捕获的事件

时间:2009-01-26 17:47:10

标签: asp.net forms-authentication

我基本上是在寻找与FormsAuthentication_OnAuthenticate相反的事件。我想在用户注销时从数据库中删除一些值。我尝试将它放入Session_End事件中,但似乎用户已经在执行时已经消失了。

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

4 个答案:

答案 0 :(得分:2)

Session_End不是为了防火 - 例如,如果你没有使用InProc会话,那么它根本不会被激活。如果您的应用程序再循环或死亡,它将不再触发。

您最好的选择是将此代码放在一个可以从多个地方调用的共享方法中:

  1. LoginStatus控件中,您可以设置LoggingOut事件 - 在那里调用您的方法来处理明智退出的人。
  2. 如果您正在使用InProc会话,请在Session_End事件中,但请务必检查它们是否已经注销(如您所见)。
  3. 如果您没有使用InProc会话,则需要更具创意。或许可以看一下偶尔发生的事件(可能在Session_Start上,无论如何都会触发),并清除那些上次活动时间早于会话超时的用户(如Greg所述)。
  4. 不幸的是,Membership class为您提供了一些有用的详细信息,但不是全部:

    GetNumberOfUsersOnline
    

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

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

    可悲的是,这些都没有一个属性只能根据计数返回“活跃用户”。

    查看MembershipUser的成员,没有“IsOnline”属性 - 只有LastLogonDate和LastActivtyDate - 由于网络的断开性质,这可能与你将要获得的一样好。

答案 1 :(得分:0)

我想你可以通过点击按钮或链接或类似的东西登出。为什么不把代码放在同一个事件/块中。在您放置FormsAuthentication.SignOut()调用的位置附近。

答案 2 :(得分:0)

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

我不确定这是你想要的。会话和身份验证是两回事。如果您的身份验证技术是向用户提供FormsAuthenticationTicket(在cookie内)并且该票证已过期,则通过此票证控制验证的到期时间。它不会在服务器上主动管理。提供用户制作故障单的每个请求,然后服务器确定用户是否仍然经过身份验证。

最重要的是,您可以检测用户会话何时到期,但您可能无法确定其身份验证何时到期,除非两个到期值都相同。

答案 3 :(得分:0)

如果您正在使用SQL提供程序,则aspnet_Users表具有“LastActivityDate”列。如果将其与表单身份验证的超时值进行比较,则可能会出现一个绝对未登录的用户列表。如果他们使用“注销”链接手动注销,则计数会很低。