【问题标题】:How to audit when a user leaves an ASP.NET app如何在用户离开 ASP.NET 应用程序时进行审核
【发布时间】:2010-09-17 03:10:57
【问题描述】:

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

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

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

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

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

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

谢谢!

【问题讨论】:

    标签: asp.net events audit


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我做了类似的事情,我使用基于 sql 的会话处理,并在表中有一个最后访问的列来保存我的会话数据。每次修改会话记录时都会运行一个存储过程,该过程会清除任何未使用的会话行的表,其不活动时间超过预定义的 TIMEOUT 值。
      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-14
        • 2012-05-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多