webforms会话值现在应该存储在MVC承载令牌中吗?

时间:2014-08-27 13:36:29

标签: asp.net asp.net-mvc session asp.net-session

在我以前的工作(ASP.NET webforms)中,我使用HttpContext.Current.Session对象来保存当前用户会话的安全相关用户数据,例如

Session("userID") = 4525
Session("customerId") = 123
Session("importantValue") = "ABC"

在WebAPI 2上学到了很多,我现在开始学习MVC。我一直在阅读MVC应该避免Session和/或HttpContext.Current ...

  1. Synchronization and overhead
  2. Session pollutes HTTP
  3. Application collision
  4. AppPool recycling
  5. ......但是对于简单的替代方案并不是很清楚。有人说使用TempData而其他人使用cookies,但两者都有缺点。

    我的应用程序数据库很重,所以我想避免命中数据库为每个请求重新读取这些值。在WebAPI2中,有持有者令牌被序列化为cookie。 Identity令牌是否足够安全以保存此数据并避免用户篡改(如果通过SSL使用)?

1 个答案:

答案 0 :(得分:2)

伙计,我不知道"使用TempData代替会话"想法来自,但我真的想追踪源头并用钝器击中它们。 TempData 会话。它使用引擎盖下的会话存储。唯一的区别是您放在那里的数据只能存活到下一个请求,而Session中的数据会一直存在,直到会话到期为止。否则,它完全相同

也就是说,围绕这个问题进行了很多辩论,其中很多都是误导的,只会导致进一步的混乱。然而,辩论的关键在于会议是非常糟糕的事情。但是,如果你需要添加一个国家概念,那么别无选择。

请参阅,HTTP作为协议是无状态。每个请求都是一个唯一的实体,不受任何其他请求的影响。 Web API,因为你提到它,不会使用会话,因为它是什么叫做" REST兼容",因为它遵循REST的指导原则。而且,REST本身是在HTTP之后建模的,也是无状态的。但是,毕竟这是真实的生活,你仍然需要做一些事情,比如验证请求。因此,auth令牌之类的东西会在请求查询字符串或正文中或通过HTTP标头发送。我认为这仍然是"会话",因为传统会话的工作方式大致相同:你传递了一些" token"使用请求,您的会话ID,以及服务器使用它来识别您之前请求中的同一客户端。

所以,实际上,当人们争论会议时,他们并不是在讨论会话本身的概念,而是真正地如何使用/滥用会议,即使他们没有&#39意识到他们正在讨论的内容。

我已经看到其他人争论使用像Redis或其他NoSQL选项而不是会话这样的优点,但是你只是在争论会话提供商,而不是会话。< / p>

就个人而言,我认为在MVC项目中使用Session没有任何问题,只要您正确使用 即可。它非常适合为经过身份验证的用户创建状态。每当您想要从站点请求新页面时,必须再次登录,这将非常烦人。除此之外,我几乎不管它。实际应该在多个请求中保留的内容非常少。