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