2

在 ASP.NET 中,我正在寻找一种方法来审核离开我的应用程序的用户。具体来说,当用户的会话因任何原因被放弃/破坏时(不一定是因为对 session.abandon 的调用),我想在 SQL Server 的审计表中插入一条“注销”记录

我有一个管理会话设置器/获取器的“SessionHelper”类。

我已经尝试在 Global.asax 的 Session_End 中发回消息,但即使在超时过期后它也从未触发过此事件。

我尝试在 SessionHelper 类中覆盖“finalize”,并在该类被销毁时在那里执行它,但它也没有触发该事件。

我会尝试在 SessionHelper 中实现 IDisposable,但我不知道在哪里调用它,以便它总是被调用。

审核离开 ASP.NET 应用程序的用户的正确方法是什么?

谢谢!

4

3 回答 3

2

请注意“正确的方式”,但这是我过去的做法。

具有与数据库中的用户记录关联的“活动”日期时间戳。每次用户访问页面时,该页面都会更新为当前时间。如果有人在 15 分钟内没有访问该页面,则该用户被记录为“注销”事件,并且时间戳设置为 NULL。

于 2008-10-14T15:48:30.627 回答
2

仅当您有 InProc 会话时才会触发 Session_End 事件。SQL 或状态服务器会话管理不会触发此事件。如果可以,请返回 InProc 会话并使用此事件。

除此之外,您不会得到很好的解决方案。ASP.NET 不提供查看服务器上当前会话列表的方法(至少,StackOverflow 的用户不知道,因为我已经问过这个问题),所以你不能使用工作来检查它们何时被销毁。

下一个最好的事情是为您的用户在某处存储“最后访问时间”,并使用它来检测会话超时。但是,这样的作业的实现很复杂(例如,如果用户快速登录/注销,您可能会错过注销事件)......

所以这里没有完美的解决方案。

于 2008-10-14T15:59:26.517 回答
1

即使您确实让会话事件正常工作,您的注销记录充其量也将是用户离开您的站点/应用程序的智能猜测。您可能会使用的一种技术是在用户登录时将注销时间放入数据库中,并在他们使用系统时继续使用未来时间更新记录。这是我最近使用的会话表的一般模式:

[Id]  [Uid]    [LoginInOn]        [ExpiresOn]  
 1    johndoe  10/14/2008 10:47   10/14/2008 11:07  

在此表中,我只是在用户与应用程序交互时不断更新 ExpiresOn 列(当前时间 + 20 分钟)。如果他们尝试在 ExpiresOn 之后进行交互,那么我知道他们空闲了 20 分钟并强制重新登录。出于报告目的,如果当前时间大于 ExpiresOn,我知道用户已注销。你可以得到比这更复杂的。例如,我将我的数据从上面列出的会话表中移到具有常规流程的报告表中。这只是为了保持会话表很小,因为有很多东西与之交互。

于 2008-10-14T15:53:41.660 回答