“用户已经记录了”HttpContext或Request DB

时间:2012-08-16 18:47:58

标签: c# asp.net-mvc asp.net-mvc-3 session-cookies

所以,我正在一个巨大的.NET MVC 3系统中工作。因为许多用户可以同时登录。我只是用HttpContext写了一个“嘿,还有人用这个键登录”的方法。但是,这是最佳做法吗?查询DB是否更好?

我写的:

     MvcApplication.SessionsLock();

        if (!force && MvcApplication.Sessions.Values.Any(p => p.ID.Equals(acesso.id_usuario.ToString(CultureInfo.InvariantCulture)) && p.Valid))
            throw new BusinessException("There's another user logged with this key. Continue ?");

     MvcApplication.SessionsUnlock();

我可以查询我的数据库..也许是饼干?任何想法将不胜感激

1 个答案:

答案 0 :(得分:1)

存储

数据库为此信息提供了一个中央,持久的位置。您可以使用自定义数据结构,或者ASP.Net SQL会话可能符合您的要求(详见下文)。

没有确定的方法可以始终确切知道用​​户的会话何时结束。例如,您可以侦听Session End事件,但它只会触发进程内会话,并且根本不会启动(例如操作系统可能会崩溃)。

无论如何,如果你正在建立一个“巨大的系统”,你不应该设计反对使用进程内会话,因为它不会向上扩展。开始考虑基于SQL的会话状态,它更具可伸缩性(并且可以为您提供足够的信息来确定大约有多少用户处于活动状态)。

Session Pro / Con

  

我想知道会话是否是一个好习惯。那段代码   作品。但我一直在阅读很多文章弃用的用法   ASP.NET MVC应用程序的会议。

至于会话是好事还是坏事 - 一如既往 - 取决于它的使用方式。正确设计的MVC应用程序可以呈现相当复杂的视图,而无需保留状态。部分原因是由于对AJAX的强大支持(无需重新加载页面)和优雅的模型绑定(可以采用复杂的Request.Form并将其转换为完整的模型)。

相反,将重复使用的信息的小片段放入会话状态,使用它来避免将敏感数据发送到客户端,使用它来使用户流动更顺畅等,没有任何内在错误。

在高安全性方案中要注意session fixation攻击。会话可能不合适和/或可能需要进一步手动保护。

有一点需要注意的是,ASP.Net会锁定会话。当一次发出多个请求时,这可能会导致非常真实的性能问题。通常,这不是问题,但考虑一个包含十几个AJAX小部件的页面,这些小部件都从使用会话的控制器或端点请求数据。这些将相互竞争(第一手经验)。

MVC提供了一种简单的方法来将控制器标记为只需要只读访问Session,从而消除了这个问题。但是,对Session的任何读/写活动仍将被序列化,因此请做好相应的计划。

业务考虑因素

从业务角度来看,知道会话已经过期并且工作已经停止并不总是很重要(您是否关心他们停止使用该网站,或者他们的会话超时?)这可以通过检查来可靠地解决最后修改了实体的时间戳并警告用户。警告,不要锁定。在我看来,你很少/永远不会根据Web应用程序中的登录/注销来锁定记录(太容易陷入锁定状态)。