在ASP.NET中,我正在寻找一种方法来审核离开我的应用程序的用户。具体来说,当用户的会话因任何原因被放弃/销毁时,我想在SQL Server的审计表中插入一个“注销”记录(不一定是因为调用了session.abandon)
我有一个'SessionHelper'类来管理会话setter / getters。
我已尝试在Global.asax的Session_End中回帖,但即使在超时到期后它也从未触发此事件。
我已经尝试在SessionHelper类中重写'finalize'并在类被销毁时执行此操作,但它也没有触发该事件。
我尝试在SessionHelper中实现IDisposable,但我不知道在哪里调用它以便始终调用它。
审核退出ASP.NET应用程序的用户的正确方法是什么?
谢谢!
答案 0 :(得分:2)
请注意“正确的方法”,但这是我过去的做法。
具有与数据库中的用户记录关联的“活动”日期时间戳。每次用户访问页面时,都会更新到当前时间。如果有人在15分钟内没有访问该页面,则该用户被记录为“注销”事件,并且时间戳设置为NULL。
答案 1 :(得分:2)
只有拥有InProc会话才会触发Session_End事件。 SQL或状态服务器会话管理不会触发此事件。如果可以,请返回InProc会话并使用此活动。
除此之外,你不会得到很好的解决方案。 ASP.NET没有提供查看服务器上当前会话列表的方法(至少,StackOverflow的用户不知道,因为我已经问过这个问题),所以你不能使用一个作业来检查它们何时被销毁。
下一个最好的方法是为用户存储一个“上次访问时间”,并使用它来检测会话的超时。这样的工作的实现很复杂(例如,如果用户快速登录/退出,您可能会错过注销事件)...
所以这里没有完美的解决方案。
答案 2 :(得分:1)
即使您确实让会话事件正常工作,当用户离开您的网站/应用时,您的注销记录也是一个明智的猜测。您可能使用的一种技术是在用户登录时将注销时间放入数据库中,并在使用系统时使用将来的时间更新记录。这是我最近编写的会话表的一般模式:
[Id] [Uid] [LoginInOn] [ExpiresOn]
1 johndoe 10/14/2008 10:47 10/14/2008 11:07
在此表中,我只是在用户与应用程序交互时不断更新ExpiresOn列(当前时间+20分钟)。如果他们尝试在ExpiresOn之后进行交互,那么我知道他们闲置了20分钟并强行重新登录。出于报告目的,我知道如果当前时间大于ExpiresOn,则用户已注销。你可以比这更复杂。例如,我将数据从上面列出的会话表中移出到具有常规流程的报表。这只是为了保持会话表的小,因为很多东西都与它交互。