我无法理解认证的不同元素.每种方法似乎都被某人反对,虽然并不总是有明确的理由.我正在为一个可以访问数据库的公司构建一个网络应用程序,所以我想确保它是安全的.
所以有三个地方我曾经常常用来存储信息.
> FormsAuthentication.SetAuthCookie().这将存储一个将与浏览器一起使用的会话cookie,客户端上没有任何敏感信息.但是,它只能存储一个值. This stackoverflow回答显示了一种在这里存储多个值的方法,但是给出它的人说不使用它,虽然不是为什么.
> FormsAuthenticationTicket.我不知道这个信息在哪里存储,但它允许一个简单的存储多个值的方法.保护它,根据documentation要求调用Encrpty()来存储和decrypt()来检索.这似乎很浪费,但我知道什么.
> Session [“SomeRef”] = new CustomObject().这个question的第二个答案解释了如何做到这一点,但对它的评论称它是危险的,因为它可能被盗.这看起来像我最好的方法,因为信息仍然存储在服务器上,并且可以存储多个值.
解决方法
> SetAuthCookie可以以存储多个值的方式实现.但实际上,您通常无法存储足够的数据来避免数据库查找.最好存储用户名(唯一标识符),并在请求期间加载更多信息.您的问题建议您不要存储敏感信息.您应该假定Cookie中发送的所有信息都可以被解密和读取,您应该采取预防措施,以免恶意使用该信息.所有会话cookie都可能被盗,我会解释一下为什么.
> FormsAuthenticationTicket是与SetAuthCookie相同的API,但在框架的较低级别.使用SetAuthCookie,Encrypt()和Decrypt()应该会发生(这是默认配置.)这不是浪费,而是使用方法1,因为它更容易.
>会话有一些限制.值得注意的是,默认情况下是依赖于过程.这意味着当服务器重新启动或涉及多个Web服务器时,会话丢失,您必须再次进行身份验证.使用默认内存会话存储(InProc)时,使用速度最快,速度最快.您可以使用sql存储或专用会话服务器来克服流程依赖性.
所有这三种方法都被认为是危险的,因为所有基于cookie的身份验证系统都是危险的:因为cookie的值可以通过无线网络嗅探并重用以接管会话.这被称为sidejacking,它也适用于情景1和2.阻止这种情况的方法是实现HTTPS.然后,cookie转换(和其他一切)在网络级加密,不能被盗.
TLDR;使用SetAuthCookie和HTTPS
注意为了清楚,这个答案已经被编辑好几次了.