我的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
答案 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)
我不确定你是否可以准确地结束会话,因为
你可以尝试搞乱IIS中的设置以在不活动后很快杀死会话,但这不是一个好主意。
另外......如果用户不在内部网络中,您将无法控制他们是否拥有“Windows ID”。