我基本上是在寻找与 FormsAuthentication_OnAuthenticate 相反的事件。当用户注销时,我想从数据库中删除一些值。我尝试将其放入 Session_End 事件中,但似乎在执行时用户已经离开了。
更新:如果我无法确定特定用户何时被取消身份验证(即,由于会话超时),那么有没有办法获取所有当前经过身份验证的用户的列表?如果可以,那么在 Session_End 中,我可以从数据库中删除与当前经过身份验证的用户无关的记录。
我基本上是在寻找与 FormsAuthentication_OnAuthenticate 相反的事件。当用户注销时,我想从数据库中删除一些值。我尝试将其放入 Session_End 事件中,但似乎在执行时用户已经离开了。
更新:如果我无法确定特定用户何时被取消身份验证(即,由于会话超时),那么有没有办法获取所有当前经过身份验证的用户的列表?如果可以,那么在 Session_End 中,我可以从数据库中删除与当前经过身份验证的用户无关的记录。
Session_End 不保证触发 - 例如,如果您不使用 InProc 会话,那么它根本不会触发。如果您的应用程序再次回收或死亡,它不会触发。
最好的办法是将此代码放在可以从许多地方调用的共享方法中:
不幸的是,Membership 类为您提供了一些有用的细节,但不是全部:
GetNumberOfUsersOnline
这将“获取当前访问应用程序的用户数”。- 很棒,但唯一能吸引用户的方法:
GetAllUsers // Gets all the users from the storage provider (can be paged)
FindUsersByName
FindUsersByEmail
遗憾的是,这些都没有根据计数只返回“活跃用户”的属性。
查看 MembershipUser 的成员,没有“IsOnline”属性 - 只有 LastLogonDate 和 LastActivtyDate - 由于网络的断开连接性质,这可能与您将获得的一样好。
我想你让他们通过点击按钮或链接或类似的东西注销。为什么不把代码放在同一个事件/块中。在您放置 FormsAuthentication.SignOut() 调用的位置附近。
Global.asax 中有一个 Session_End 处理程序,您可以在其中放置您想要在会话到期时执行的内容。
我不确定这是你想要的。会话和身份验证是两个不同的东西。如果您的身份验证技术正在向用户(在 cookie 中)提供 FormsAuthenticationTicket 并且该票证具有到期时间,那么身份验证的到期时间是通过该票证控制的。它不会在服务器上主动管理。提供用户发出票证的每个请求,然后服务器确定用户是否仍然通过身份验证。
底线是,您可以检测用户的会话何时到期,但您可能无法确定他们的身份验证何时到期,除非两个到期值相同。
如果您使用 SQL 提供程序,aspnet_Users 表有一个“LastActivityDate”列。如果将其与表单身份验证的超时值进行比较,您可能会得出一个绝对未登录的用户列表。如果他们使用“注销”链接手动注销,您的计数会很低。