如何在用户离开ASP.NET应用程序时进行审核

如何在用户离开ASP.NET应用程序时进行审核,asp.net,events,audit,Asp.net,Events,Audit,在ASP.NET中,我正在寻找一种方法来审核离开我的应用程序的用户。具体来说,当用户的会话由于任何原因(不一定是因为调用session.advand)而被放弃/销毁时,我希望在SQL Server的审核表中插入一条“logout”记录 我有一个“SessionHelper”类,它管理会话设置器/获取器 我已尝试在Global.asax中的会话_End中发回,但即使超时过期,它也从未触发此事件 我尝试过在SessionHelper类中重写'finalize',并在类被销毁时在那里执行,但它也没有触

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

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

我已尝试在Global.asax中的会话_End中发回,但即使超时过期,它也从未触发此事件

我尝试过在SessionHelper类中重写'finalize',并在类被销毁时在那里执行,但它也没有触发该事件

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

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

谢谢大家!

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


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

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

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

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

只有在您有InProc会话时,才会触发Session\u End事件。SQL或状态服务器会话管理将不会触发此事件。如果可以,请返回InProc会话并使用此事件

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

下一个最好的方法是将“上次访问时间”存储在用户的某处,并使用它来检测会话超时。不过,此类作业的实现非常复杂(例如,如果用户快速登录/注销,您可能会错过注销事件)


因此,这里没有完美的解决方案。

我做了类似的事情,我使用基于sql的会话处理,并在表中有一个上次访问的列保存会话数据。每次修改会话记录时都会运行一个存储过程,该过程会清除表中超过预定义超时值的未使用会话行。