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