【问题标题】:ASP.NET - Log User Session Start/End Times for Audit Trail - Global.ASAX?ASP.NET - 记录审计跟踪的用户会话开始/结束时间 - Global.ASAX?
【发布时间】:2011-01-11 22:35:20
【问题描述】:

我的 ASP.NET 内网 Web 应用程序使用 Windows 身份验证,我想记录以下详细信息:

1) Windows ID
2) 会话开始时间
3) 会话停止时间
4) 正在浏览的 URL(可选)

我在 Global.ASAX 的“Session_Start”方法中有一些基本的代码设置来记录会话开始时间(见下文),但到目前为止就是这样。我觉得这是一种原始方法,并且有“更好”的方法可以做到这一点。所以我真的有两个问题:

1) 这是做这件事的正确方法吗?如果不是,还有哪些其他选择?

2)如果这是正确的方法,我是否只需要在“Session_End”方法中删除一些代码来记录他们退出的时间,这就是一个完整的解决方案?当他们关闭打开网站的浏览器选项卡时,是否总是调用此方法,或者他们是否必须关闭整个浏览器(我没有注销功能)?用户可以通过什么方式跳过此会话结束方法(或针对这种情况开始)?

    Dim connsql As New System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings("MyConnectionstring").ConnectionString)
    Dim cmdsql As System.Data.SqlClient.SqlCommand = connsql.CreateCommand
    cmdsql.CommandText = "BeginUserSession"
    cmdsql.CommandType = Data.CommandType.StoredProcedure
    Try
        cmdsql.Parameters.Add("@windowsid", System.Data.SqlDbType.VarChar, 30, "windowsid")
        cmdsql.Parameters("@windowsid").Value = Session("UserInfo").identity.name
        If connsql.State <> System.Data.ConnectionState.Open Then connsql.Open()
        cmdsql.ExecuteNonQuery()
        connsql.Close()

    Catch ex As Exception

    Finally
        If connsql.State <> Data.ConnectionState.Closed Then connsql.Close()
    End Try
    'Stored Proc records start time

【问题讨论】:

    标签: asp.net global-asax audit


    【解决方案1】:

    Session_End 不可靠。

    我的建议是在 Session_Start 上创建记录会话创建时间的记录,并在 Session_End 中更新记录的结束时间。

    要处理大多数被动放弃的会话,请使用 Application_BeginRequest 更新记录以记录用户“最后一次出现”的时间。

    然后,您需要确定一种标记已被动放弃的会话的方法。这将是特定于站点/应用程序的。可以简单地选择在会话被视为放弃之前必须经过的分钟数 - 例如 10 分钟。

    那么你有一个查询:

    SELECT Username,
           SessionStart,
           SessionEnd,
           LastSeenOn,
           DATEDIFF(mi, SessionStart, ISNULL(SessionEnd, LastSeenOn)) DurationMinutes
    FROM   SessionAudit
    WHERE  SessionEnd IS NOT NULL
    OR     DATEDIFF(mi, LastSeenOn, getdate()) > 10
    

    这将带回您的会话审核日志。

    【讨论】:

      【解决方案2】:

      您的方法可以描述为简单,但这完全可以 - 归结为需求是什么。如果您需要记录一整套应用程序错误和警告,请考虑实现类似 Log4Net 的东西。否则我不会说你所做的有什么问题。

      如果在超时值中指定的时间内没有用户活动,或者当您在代码中显式调用 Session.Abandon() 时,会话将结束。由于 HTTP 的无状态特性,无法判断用户是否离开了您的站点、关闭了浏览器或以其他方式停止与他们的会话进行交互。

      【讨论】:

        【解决方案3】:

        我不确定你能否准确地捕捉到会话的结束,因为

        1. 用户可以关闭他们的浏览器,这不一定会结束会话。
        2. 然后他们可以返回您的站点,因此可能有多个会话。

        您可以尝试在 IIS 中设置设置以在不活动后很快终止会话,但这不是一个好主意。

        另外...如果用户并非都在内部网络上,您将无法控制他们是否拥有“Windows ID”。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-10-25
          • 2018-05-30
          • 2014-10-30
          • 2012-06-18
          • 1970-01-01
          • 2020-07-15
          • 1970-01-01
          相关资源
          最近更新 更多