所以,我正在一个巨大的.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();
我可以查询我的数据库..也许是饼干?任何想法将不胜感激
答案 0 :(得分:1)
数据库为此信息提供了一个中央,持久的位置。您可以使用自定义数据结构,或者ASP.Net SQL会话可能符合您的要求(详见下文)。
没有确定的方法可以始终确切知道用户的会话何时结束。例如,您可以侦听Session End事件,但它只会触发进程内会话,并且根本不会启动(例如操作系统可能会崩溃)。
无论如何,如果你正在建立一个“巨大的系统”,你不应该设计反对使用进程内会话,因为它不会向上扩展。开始考虑基于SQL的会话状态,它更具可伸缩性(并且可以为您提供足够的信息来确定大约有多少用户处于活动状态)。
我想知道会话是否是一个好习惯。那段代码 作品。但我一直在阅读很多文章弃用的用法 ASP.NET MVC应用程序的会议。
至于会话是好事还是坏事 - 一如既往 - 取决于它的使用方式。正确设计的MVC应用程序可以呈现相当复杂的视图,而无需保留状态。部分原因是由于对AJAX的强大支持(无需重新加载页面)和优雅的模型绑定(可以采用复杂的Request.Form并将其转换为完整的模型)。
相反,将重复使用的信息的小片段放入会话状态,使用它来避免将敏感数据发送到客户端,使用它来使用户流动更顺畅等,没有任何内在错误。
在高安全性方案中要注意session fixation攻击。会话可能不合适和/或可能需要进一步手动保护。
有一点需要注意的是,ASP.Net会锁定会话。当一次发出多个请求时,这可能会导致非常真实的性能问题。通常,这不是问题,但考虑一个包含十几个AJAX小部件的页面,这些小部件都从使用会话的控制器或端点请求数据。这些将相互竞争(第一手经验)。
MVC提供了一种简单的方法来将控制器标记为只需要只读访问Session,从而消除了这个问题。但是,对Session的任何读/写活动仍将被序列化,因此请做好相应的计划。
从业务角度来看,知道会话已经过期并且工作已经停止并不总是很重要(您是否关心他们停止使用该网站,或者他们的会话超时?)这可以通过检查来可靠地解决最后修改了实体的时间戳并警告用户。警告,不要锁定。在我看来,你很少/永远不会根据Web应用程序中的登录/注销来锁定记录(太容易陷入锁定状态)。