1

我的 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
4

3 回答 3

2

Session_End 不可靠。

我建议在 Session_Start 上创建一条记录,记录 Session 的创建时间,并在 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

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

于 2010-02-01T22:49:49.013 回答
1

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

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

于 2010-02-01T22:43:31.337 回答
0

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

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

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

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

于 2010-02-01T22:40:57.897 回答