3

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

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

4

4 回答 4

2

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

最好的办法是将此代码放在可以从许多地方调用的共享方法中:

  1. 在您的LoginStatus控件中,您可以设置LoggingOut事件 - 在那里调用您的方法来处理明智地注销的人。
  2. 如果您在 Session_End 事件中使用 InProc 会话,但请确保检查它们是否已经注销(如您所见)。
  3. 如果您不使用 InProc 会话,则需要更多创意。也许看看有一个不时触发的事件(可能在 Session_Start 上无论如何都会触发),该事件会通过并清除那些上次活动时间早于会话超时的用户(如 Greg 所述)。

不幸的是,Membership 类为您提供了一些有用的细节,但不是全部:

GetNumberOfUsersOnline

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

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

遗憾的是,这些都没有根据计数只返回“活跃用户”的属性。

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

于 2009-01-26T20:55:24.017 回答
0

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

于 2009-01-26T17:49:46.937 回答
0

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

我不确定这是你想要的。会话和身份验证是两个不同的东西。如果您的身份验证技术正在向用户(在 cookie 中)提供 FormsAuthenticationTicket 并且该票证具有到期时间,那么身份验证的到期时间是通过该票证控制的。它不会在服务器上主动管理。提供用户发出票证的每个请求,然后服务器确定用户是否仍然通过身份验证。

底线是,您可以检测用户的会话何时到期,但您可能无法确定他们的身份验证何时到期,除非两个到期值相同。

于 2009-01-26T18:11:52.927 回答
0

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

于 2009-01-26T18:37:02.393 回答