MVC3和身份验证

时间:2011-06-22 15:29:29

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

好的,我是网络开发的新手,所以我可能会错误地解决这些问题。我提前道歉。

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

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

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

  2. 的FormsAuthenticationTicket。我不知道这些信息存储在何处,但它允许存储多个值的简单方法。根据{{​​3}}确保安全,需要调用Encrpty()来存储,并解密()来检索。这看起来很浪费,但我知道什么。

  3. Session [“SomeRef”] = new CustomObject()。这个documentation中的第二个答案解释了如何做到这一点,但对它的评论称它很危险,因为它可能被盗。这看起来对我来说是最好的方法,因为信息仍然存储在服务器上,并且可以存储多个值。

  4. 我找不到这些方法的任何比较,或者在验证用户之后存储多条信息的“最佳实践”方式的良好解释。信息只是用户名和他们的userId。

1 个答案:

答案 0 :(得分:18)

以下是一些帮助您做出决定的进一步说明。

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

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

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

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

    TLDR;使用SetAuthCookie和HTTPS

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