>ok 因此,我遇到了这样的困境,即我应该如何在 MVC 中保存登录凭据,同时避免对数据库造成尽可能多的打击。 我知道我可以轻松地使用Forms Authentication
来保存用户实例,但是否建议这样做?
目前,我的做法是将User Id
存储在一个cookie
中,然后每次调用"需要"登录访问权限的操作时,我都会访问该。在访问操作之前,用户 ID 将用于检索"新"用户实例。这在每个操作中都是一样的,我不会将用户存储在 cookie 中,因为我觉得一旦 cookie 遭到入侵,黑客就可以使用有关用户的所有内容(UserID、电子邮件、角色等(
因此,如果我有大量的操作需要登录,这对我的带宽来说将是困难的。您如何看待我使用的方法?我是否应该将其更改为在短时间内将所有用户对象存储在 cookie 中?任何想法都非常感谢。谢谢!!
您似乎正在尝试解决带宽问题。 仅此一项就表明您不应该在 cookie 中存储超过您必须存储的(即:会话 ID(。
使用cookie有两个主要问题(除其他外(。1(他们在每个请求上发送2(您可以存储的信息量有限。
一般来说,信任用户给你的任何内容(包括加密的cookie(都是不好的。
您预计您的网站上有多少并发用户? 请记住,数据库将能够缓存某些调用。 此外,如果您使用的是像 nhibernate 这样的 ORM,您将在那里获得第二级缓存。 如果所有其他方法都失败了,您可以使用内存中会话管理吗?
我将userid放入cookie中遇到的最大问题是该键的熵。 假设您的用户 ID 是一封电子邮件。 作为攻击者,我所要做的就是猜测一个在您的系统中有效的用户ID,我将"自动"成为该用户。 人们使用sessionID然后检索用户的原因是,理论上sessionID更难猜测。
我的建议是,如果您处于负载平衡状态,请使用数据库会话管理。 如果没有,请使用内存中。 它很快。 内存很便宜。 除非您在会话中为每个用户存储 10 MB 的数据,并且您有 10000 个用户,否则您应该没问题。
正如 Ken 所说,您可能应该使用 MVC 提供的标准 [授权] 标签,而不是创建自己的方法。
听起来您几乎实现了基于表单的身份验证,并且与[Authorize]属性相当。
因此,如果我有大量的操作需要登录,这对我的带宽来说将是困难
的
表单身份验证使用 Cookie 并烘焙到系统中。如果您不想将用户信息存储在SQLServer中,还有很多其他选项。
听起来您正在尝试实现已经完成的事情。在我看来,让我们把安全的东西留给了解安全的人。我建议在提供的框架内工作,除非您有证据证明您的解决方案需要其他东西!
FormsAuthenticationTicket 对象上有一个 UserData 属性,可用于存储用户名以外的其他数据。
我有一个项目也有类似的需求。我将值存储为像查询字符串一样编码的 NameValueCollection:
"email=myemail@some.com&roles=Somebody&roles=Special"
(还有一个方便的 HttpUtility.ParseQueryString(( 方法,可用于从 UserData 属性中获取值(
您可以使用 FormsAuthentication.Encrypt 和 FormsAuthentication.Decrypt 将票证转换为 Cookie 值和从 Cookie 值转换票证。