如何使用ASP.Net在没有Logout的情况下显式关闭浏览器时如何跟踪注销详细信息

时间:2013-04-13 08:22:33

标签: c# asp.net

我正在尝试制作用户的登录详细信息。

我将以下列存储在数据库表中:

IPAddress, LoginTime, LogOutTime, LoginPlace

我可以在用户登录并手动注销(通过点击Logout按钮)时成功获取详细信息

我的问题是当用户未点击Logout或会话已过期或直接关闭浏览器时,我无法跟踪记录。

我正在考虑在Session_End文件中的Global.asax事件中添加代码以进行跟踪。但我怎么能跟踪会话?

这是一个很好的解决方案吗?

任何建议将不胜感激。

提前致谢。

3 个答案:

答案 0 :(得分:0)

通过在任何名为UpdateLastVisited的控制器/动作中放置某种辅助方法?

UpdateLastVisited看起来像。

            UpdateLastVisited(this.User)
                {  
                       "UPDATE [dbo].[User] set LastVisited = @date WHERE Id = @userId";
                        AddParameters etc..
                 }

答案 1 :(得分:0)

在保存用户的IPAddress时,您应该记住以下几点:

  1. 如果您正在为Intranet开发此站点,并且用户拥有动态分配了IP地址的计算机,那么您的逻辑肯定会出错。
  2. 如果您正在开发Internet的站点,您获得的IP地址是ISP的IP地址。要解决这个问题,你必须使用某种ActiveX(不建议)。
  3. 如果你仍然决定继续2,那么你将会回到1,因此4是更好的选择。
  4. 要么不对具有依赖IP地址的Web应用程序进行编码,要么确保为Intranet编写此应用程序并将静态IP地址分配给计算机。
  5. 话虽如此,在浏览器关闭时注明用户的实际问题而不注销:

    1. 编写基于HTTP的Web服务,该服务是Web应用程序的一部分。公开一个Web方法说“Logout”并在javascript的Window.Close()事件上使用AJAX调用此方法。
    2. 如果您不想继续使用WebService,可以在Window.close()上使用javascript调用您的注销网页。
    3. 即使您使用上述两种方法之一,也要记住在服务器端代码中使用会话超时。 我希望这有帮助。

答案 2 :(得分:0)

  

但我该如何跟踪会话?

ASP.NET Session明确定义为附加到特定用户的对象:

  

ASP.NET会话状态在有限时间窗口内将来自同一浏览器的请求标识为会话,并提供了在该会话期间持久保存变量值的方法。

因此,根据定义,当您访问Session时,它将附加到用户,而ASP.NET将为您保持同步。现在,利用这些信息,我建议您在Session_Start期间存储您的信息:

protected void Session_Start(Object sender, EventArgs e)
{
    var session = HttpContext.Current.Session;

    session["IPAddress"] = Request.UserHostAddress;
    session["LoginTime"] = DateTime.Now;

    // you'll need to plug in here how you're going to determine this
    session["LoginPlace"] = "something";
}

然后在Session_End中你可以这样做:

protected void Session_Start(Object sender, EventArgs e)
{
    HttpContext.Current.Session["LogOutTime"] = DateTime.Now;

    // and now here you can persist those values to the database because
    // the session has ended
}

然后我会建议你在注销时做一些不同的事情。而不是设置这些值并将它们持久化到数据库,就像你说你现在一样,这样做:

HttpContext.Current.Session.Abandon();

将强制Session_End加注,这将为您的代码提供一致性。此外,它立即清理服务器上的会话。请注意,当用户退出"时,除非您实际上已经杀死他们的会话,否则它在服务器上仍然有效,直到超时为止。