Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET-记录审核跟踪的用户会话开始/结束时间-Global.ASAX?_Asp.net_Global Asax_Audit - Fatal编程技术网

ASP.NET-记录审核跟踪的用户会话开始/结束时间-Global.ASAX?

ASP.NET-记录审核跟踪的用户会话开始/结束时间-Global.ASAX?,asp.net,global-asax,audit,Asp.net,Global Asax,Audit,我的ASP.NET intranet web应用程序使用Windows身份验证,我想记录以下详细信息: 1) Windows ID 2) 会话开始时间 3) 会话停止时间 4) 正在浏览到的URL(可选) 我已经在Global.ASAX的“Session_Start”方法中设置了一些基本的代码来记录会话开始时间(见下文),但到目前为止仅此而已。我觉得这是一种原始的方法,有“更好”的方法。所以我有两个问题: 1) 这样做对吗?如果没有,还有什么其他选择? 2) 如果这是正确的方法,我是否只需要在“

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

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

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

1) 这样做对吗?如果没有,还有什么其他选择?

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

Dim connsql作为新的System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionString(“MyConnectionstring”).ConnectionString)
Dim cmdsql作为System.Data.SqlClient.SqlCommand=connsql.CreateCommand
cmdsql.CommandText=“BeginUserSession”
cmdsql.CommandType=Data.CommandType.StoredProcess
尝试
cmdsql.Parameters.Add(“@windowsid”,System.Data.SqlDbType.VarChar,30,“windowsid”)
cmdsql.Parameters(“@windowsid”).Value=Session(“UserInfo”).identity.name
如果是connsql.State System.Data.ConnectionState.Open,则是connsql.Open()
cmdsql.ExecuteNonQuery()
connsql.Close()
特例
最后
如果connsql.State Data.ConnectionState.Closed,则connsql.Close()
结束尝试
'存储的过程记录开始时间

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

  • 用户可以关闭浏览器,这不一定会结束会话。
  • 然后他们可以返回到您的站点,因此可能有多个会话。 您可以尝试在IIS中设置混乱,以便在不活动后很快终止会话,但这不是一个好主意


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

    您的方法可以说很简单,但这完全可以——这取决于要求是什么。如果您需要记录一整套应用程序错误和警告,请考虑实现类似Log4Net的功能。否则我不会说你做的有什么不对


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

    会话结束不可靠

    我建议您在会话开始时创建一个记录,记录会话创建的时间,在会话结束时,使用会话结束的时间更新该记录

    要处理大多数被动放弃的会话,请使用应用程序_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
    
    这将带回您的会话审核日志

    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