我有一个名为 Eventlog 的表,该表已经包含有关用户连接的数据:例如,当用户调用此操作时:
public ActionResult Login(string username, string password)
{
}
我测试用户是否已经存在于数据库中
如果是,我使用
Session["user"] = username
或FormsAuthentication.SetAuthCookie(username, true);
设置用户 session然后我在事件日志表上记录了一条记录:用户 X 在 Y 点连接
这很好用,但我还需要有关用户注销的信息。我可以做与注销操作类似的事情,我想它也能正常工作,但大多数人不使用注销按钮,他们只关闭浏览器,如何实现用户注销事件用户关闭浏览器时的这种情况:用户 X 已在 Y 点断开连接。 Session_End() 不能满足这种情况下的需要。
最佳答案
您必须接受网络技术的局限性。一旦您将响应发送给用户代理,服务器就无法知道请求发生了什么。用户可能会优雅地关闭用户代理。 UA 可能会崩溃。用户可能会失去互联网连接。他的电脑可能会崩溃。所有这一切都可能发生在客户端甚至收到响应之前。这就是您正在处理的环境。拥抱它而不是与之抗争。
如果跟踪注销对您很重要,您可以使用以下几种技术:
- 依赖 session 超时。如果您选择的超时时间足够短,则可能足以满足您的安全要求。我认为这是首选方式,因为它简单且经过验证。
- 使用脚本从 UA 向服务器发送心跳。您可以使用“ping”请求、长时间调用等。但是,请注意随之而来的性能影响、对服务器的请求数量以及实现的复杂性。
- 使用 SignalR 等现有框架建立客户端到服务器的连接,并让客户端 checkin 服务器。这基本上是第二种选择,您的手动工作更少。
所有这些都不会让您拦截用户注销或连接丢失,但如果客户端停止响应,您就知道连接已中断(以多种可能的方式之一)。因此,您不应将其注册为“用户已注销”,而应注册为“用户已断开连接”。
关于c# - "Logging out"用户关闭浏览器事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42002389/