ASP.NET - 审计跟踪的日志用户会话开始/结束时间 - Global.ASAX?

时间:2010-02-01 22:34:51

标签: asp.net global-asax audit

我的ASP.NET Intranet 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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

您的方法可以简单描述,但这可能完全没问题 - 这取决于要求是什么。如果您需要记录一整套应用程序错误和警告,请查看实现Log4Net之类的内容。否则我不会说你在做什么有什么问题。

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

答案 2 :(得分:0)

我不确定你是否可以准确地结束会话,因为

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

你可以尝试搞乱IIS中的设置以在不活动后很快杀死会话,但这不是一个好主意。

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