mvc site,保存登录凭据的最安全方式

时间:2011-08-23 03:30:23

标签: asp.net-mvc permissions security security-roles

好吧,我有这样的困境,我应该如何在mvc中保存登录凭据,同时避免对数据库的影响。我知道我可以轻松使用Forms Authentication来保存用户实例,但这是否可取?

目前我的方式是将User Id存储在cookie中,然后每当调用一个“需要”登录访问权限的动作时我就会访问该{{1}}。在访问操作之前,将使用用户ID来检索“新”用户实例。这在每个Action上都是相同的,我不会将用户存储在cookie中,因为我觉得一旦cookie被泄露,用户的所有内容都将可用于黑客(Userid,电子邮件,角色等)

因此,如果我有大量的操作需要登录,这将在我的带宽上很难。您如何看待我使用的方法?我是否应该更改它以使所有User对象以短暂超时存储在cookie中?任何想法都非常感谢。 谢谢!

3 个答案:

答案 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值转换。

相关问题