【问题标题】:MVC3 and AuthenticationMVC3 和身份验证
【发布时间】:2011-10-18 19:39:45
【问题描述】:

好的,我是 Web 开发的新手,所以我可能会弄错其中一些术语。我提前道歉。

我无法理解身份验证的不同元素。似乎有人建议不要使用每种方法,尽管并非总是有明确的理由。我正在为可以访问数据库的公司构建 Web 应用程序,因此我想确保它是安全的。

所以我见过三个常用的存储信息的地方。

  1. FormsAuthentication.SetAuthCookie()。这存储了一个会话 cookie,该 cookie 将随浏览器过期,客户端上没有任何敏感信息。但是,它只能存储一个值。 Thisstackoverflow 的答案显示了一种在这里存储多个值的方法,但是给出它的人说不要使用它,尽管不是为什么。

  2. FormsAuthenticationTicket。我不知道这些信息存储在哪里,但它允许使用一种简单的方法来存储多个值。根据documentation,保护它需要调用 Encrpty() 来存储,并调用 decrypt() 来检索。这看起来很浪费,但我知道什么。

  3. Session["SomeRef"] = new CustomObject()。 question 中的第二个答案解释了如何执行此操作,但对其的评论称它很危险,因为它可能被盗。这对我来说似乎是最好的方法,因为信息仍然存储在服务器上,并且可以存储多个值。

我找不到这些方法的任何比较,也找不到关于在验证用户身份后存储多条信息的“最佳实践”方式的良好解释。该信息只是用户的姓名和他们的用户 ID。

【问题讨论】:

  • 顺便说一句,如果用户名是唯一的,则不需要存储用户 ID。只需向该数据库列添加唯一索引,查找速度就像使用 ID 一样快。
  • 是的,但我想要各种显示用途的名称,以及用于在编辑期间记录“更新用户”信息的 ID。
  • 这个问题值得更多的支持; +1

标签: asp.net-mvc-3 authentication session-cookies


【解决方案1】:

这里有一些进一步的说明,可以帮助您做出决定。

  1. SetAuthCookie 可以以存储多个值的方式实现。然而,在实践中,您通常无法存储足够的数据来避免数据库查找。最好存储用户名(唯一标识符)并在请求期间加载更多信息。正如您的问题所暗示的,您不应在其上存储敏感信息。您应该假设在 cookie 中发送的所有信息都可以被解密和读取,并且您应该采取预防措施以防止该信息被恶意使用。所有会话 cookie 都可能被盗,我稍后会解释原因。

  2. FormsAuthenticationTicket 与 SetAuthCookie 的 API 相同,但在框架中处于较低级别。使用 SetAuthCookie,Encrypt() 和 Decrypt() 无论如何都应该发生(这是默认配置。)这不是浪费,而是使用方法 1,因为它更容易。

  3. 会话有一些限制。值得注意的是,默认情况下它是依赖于进程的。这意味着当服务器重新启动或涉及多个 Web 服务器时,您的会话将丢失,您必须再次进行身份验证。使用默认内存会话存储 (InProc) 时,它是最容易使用和最快的。您可以使用 sql 存储或专用会话服务器来克服进程依赖性。

所有三种方法都被认为是危险的,原因与所有基于 cookie 的身份验证系统都很危险的原因相同:因为 cookie 的值可以通过无线嗅探并重新用于接管会话。这被称为sidejacking,它也适用于场景 1 和 2。防止这种情况的方法是实现 HTTPS。然后,cookie 传输(以及其他所有内容)在网络级别被加密并且不能被窃取。

TLDR;使用 SetAuthCookie 和 HTTPS

注意为了清楚起见,此答案已被多次编辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-08
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    相关资源
    最近更新 更多