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

Asp.net webforms会话值现在应该存储在MVC承载令牌中吗?,asp.net,asp.net-mvc,session,asp.net-session,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。我经常读到Session和/或HttpContext。当前的应该避免使用MVC …但对于简单的替

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

Session("userID") = 4525
Session("customerId") = 123
Session("importantValue") = "ABC"
我在WebAPI 2上已经学了很多,现在开始学习MVC。我经常读到
Session
和/或
HttpContext。当前的
应该避免使用MVC

  • …但对于简单的替代方案没有太多的明确性。有些人说使用
    TempData
    ,而有些人说使用cookie,但两者都有缺点


    我的应用程序是数据库密集型应用程序,因此我希望避免在每次请求中重读这些值时访问数据库。在WebAPI2中,存在被序列化为cookie的承载令牌。身份令牌是否足够安全以保存此数据并避免用户篡改(如果通过SSL使用)?

    伙计,我不确定“使用
    TempData
    而不是会话”的想法是从哪里来的,但我真的很想找到源代码并用钝器击中它们<代码>临时数据
    是会话。它使用引擎盖下的会话存储。唯一的区别是,您放在那里的数据只保留到下一个请求,而放在
    会话中的数据保留到会话到期。否则,情况完全一样

    也就是说,围绕这个问题有很多争论,其中很多都被误导了,只会导致进一步的混乱。然而,辩论的关键是,会议是相当可怕的事情。但是,如果你需要添加一个国家的概念,那真的没有其他选择

    请参阅,HTTP作为协议是无状态的。每个请求都是唯一的实体,不受之前或之后的任何其他请求的影响。正如您所提到的,WebAPI不使用会话,因为它被称为“REST兼容”,因为它遵循REST的指导原则。而且,REST本身是以HTTP为模型的,也是无状态的。然而,这毕竟是现实生活,您仍然需要执行诸如验证请求之类的操作。因此,像auth令牌之类的东西可以在请求查询字符串或正文中发送,也可以通过HTTP头发送。我认为这仍然是“会话”,因为传统会话的工作方式基本相同:您将一些“令牌”与请求一起传递,您的会话id,服务器使用它来识别您是以前请求中的同一客户机

    所以,事实上,当人们争论会话时,他们不是在争论会话本身的概念,而是在争论会话是如何被使用/滥用的,即使他们没有意识到这正是他们争论的问题

    我看到其他人争论使用Redis或其他NoSQL选项而不是会话的优点,但你只是在争论会话提供程序,而不是会话


    就我个人而言,我认为在MVC项目中使用
    会话
    没有什么错,只要您正确地使用它。它非常适合为经过身份验证的用户创建状态。每次你想从一个站点请求一个新页面时,都必须再次登录,这将是非常烦人的。不过,除此之外,我基本上不会去管它。实际上应该在多个请求之间持久化的东西很少。

    这不是一个容易的问题,因为开发人员的“品味”各不相同。如果您知道自己在做什么,那么使用
    会话
    对象没有坏处。请链接到声称您永远不应该使用会话的来源。应该有考虑,但永远不要说永远。如果所说的信息来源不能激励你为什么不应该使用该课程,不要继续阅读它们。在某些场景中,你不应该使用会话是有充分理由的,但这些场景是否适用于你,取决于你自己。反复听到的原因是“会话劫持”。但通过一些调整,这可以完全消除。另一个是需要存储的数据量。您拥有数百兆字节的数据,那么使用现有的缓存机制可能会更好。ValidateAntiForgeryToken
    是否克服了会话劫持?我只存储了几个整数值。@EvilDr:没有设计任何反伪造令牌来防止跨站点请求伪造(CSRF)。某些第三方试图在您的网站上创建自己的表单版本,但仍将其发布到表单发布的位置。反伪造令牌必须与post一起传递才能使其有效,并且第三方无法预测任何给定请求的令牌将是什么。这与课程无关。这是一个很好的答案,谢谢。说到你的最后一点,在
    会话
    中除了说
    User.Identity.Name
    角色
    之外,应该做什么?我猜基于cookie的身份验证令牌足够强大,可以存储在客户端设备上,而不必担心它们被黑客攻击(我认为ASP.NET cookie受AES保护,然后仅通过SSL交付)?我个人使用的一个例子是在电子商务情况下存储“促销”代码。如果用户来自包含促销代码的链接,我会将其保存到会话中,以便在他们签出时应用。老实说,我想不出还有多少其他的例子,我已经明确地使用了
    会话
    (除了通过身份验证隐式使用),这应该告诉你它的使用应该是多么罕见。