MVC3和身份验证

Kye*_*ica 12 authentication session-cookies asp.net-mvc-3

好吧,我是网络开发的新手,所以我可能会错误地看到这些术语中的一些.我提前道歉.

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

所以我看到通常用于存储信息的三个地方.

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

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

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

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

BC.*_*BC. 18

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

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

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

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

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

TLDR; 使用SetAuthCookie和HTTPS

注意为了清楚起见,已对此答案进行了多次编辑.