c# - "Logging out"用户关闭浏览器事件

标签 c# asp.net asp.net-mvc

我有一个名为 Eventlog 的表,该表已经包含有关用户连接的数据:例如,当用户调用此操作时:

public ActionResult Login(string username, string password)
{

}
  • 我测试用户是否已经存在于数据库中

  • 如果是,我使用 Session["user"] = usernameFormsAuthentication.SetAuthCookie(username, true); 设置用户 session

  • 然后我在事件日志表上记录了一条记录:用户 X 在 Y 点连接

这很好用,但我还需要有关用户注销的信息。我可以做与注销操作类似的事情,我想它也能正常工作,但大多数人不使用注销按钮,他们只关闭浏览器,如何实现用户注销事件用户关闭浏览器时的这种情况:用户 X 已在 Y 点断开连接。 Session_End() 不能满足这种情况下的需要。

最佳答案

您必须接受网络技术的局限性。一旦您将响应发送给用户代理,服务器就无法知道请求发生了什么。用户可能会优雅地关闭用户代理。 UA 可能会崩溃。用户可能会失去互联网连接。他的电脑可能会崩溃。所有这一切都可能发生在客户端甚至收到响应之前。这就是您正在处理的环境。拥抱它而不是与之抗争。

如果跟踪注销对您很重要,您可以使用以下几种技术:

  1. 依赖 session 超时。如果您选择的超时时间足够短,则可能足以满足您的安全要求。我认为这是首选方式,因为它简单且经过验证。
  2. 使用脚本从 UA 向服务器发送心跳。您可以使用“ping”请求、长时间调用等。但是,请注意随之而来的性能影响、对服务器的请求数量以及实现的复杂性。
  3. 使用 SignalR 等现有框架建立客户端到服务器的连接,并让客户端 checkin 服务器。这基本上是第二种选择,您的手动工作更少。

所有这些都不会让您拦截用户注销或连接丢失,但如果客户端停止响应,您就知道连接已中断(以多种可能的方式之一)。因此,您不应将其注册为“用户已注销”,而应注册为“用户已断开连接”。

关于c# - "Logging out"用户关闭浏览器事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42002389/

相关文章:

c# - 是否可以使用 Automapper 将多个 DTO 对象映射到单个 ViewModel?

asp.net-mvc - ASP.NET MVC 身份默认实现

c# - 将多个对象作为参数传递给 mvc 6 操作

c# - 在运行时添加属性

c# - 通过接口(interface)创建假对象

c# - 最小化响应/请求数据包

asp.net - .NET Framework 4.0 是否需要重新启动?

c# - GetFontData 在 ASP.NET 应用程序中返回 -1 (GDI_ERROR),但在控制台应用程序中不返回。什么会导致这个?

c# - 使用 installshield 创建安装文件时 Windows 窗体的 Microsoft Access 数据库的位置

c# - 在 ASP.NET 中执行 HttpWebRequest 时如何使用客户端的 IP