MVC网站,保留登录凭据的最安全方式是什么?

3

好的,我有一个关于如何在MVC中保存登录凭据并尽量避免对数据库的影响的困境。我知道我可以轻松地使用Forms Authentication来保存用户实例,但这是可行的吗?

目前我的做法是将User Id存储在cookie中,每次调用需要“登录访问”的操作时都会访问它。在访问操作之前,User Id将被用于检索一个“新”的用户实例。这在每个操作上都是相同的,我不会将用户存储在cookie中,因为我觉得一旦cookie被攻击者获取,关于用户的所有信息都将对他们可用(Userid、电子邮件、角色等)。

如果我有大量需要登录的操作,那么这将对我的带宽造成困难。你认为我使用的方法怎么样?我应该将所有的用户对象都存储在cookie中,并设置较短的超时时间吗?非常感谢任何想法。


请花时间对您的问题进行格式化。使用段落/换行和适当的标点符号/句子结构。我相信很多人都忽略了你的问题的答案,因为他们不想花时间从你的话语中解析出真正的问题。FAQ(http://stackoverflow.com/faq)是学习如何提问的好地方。 - Omar
看看 Jayantha 做的编辑;向他们学习。 - Omar
3个回答

3

看起来你正在尝试解决带宽问题。这表明你不应该在cookie中存储超过必要的内容(例如:会话ID)。

使用cookie存在两个主要问题(还有其他问题): 1)每次请求都会发送cookie。 2)你可以存储的信息数量有限。

总的来说,信任用户提供给你的任何内容(包括加密cookie)都是不好的。

你预计网站将有多少并发用户?请记住,数据库将能够缓存某些调用。此外,如果你使用像nhibernate这样的ORM,那么你将在那里获得第二级缓存。如果一切都失败了,你可以使用内存中的会话管理吗?

我对将用户ID放入cookie的最大问题是该密钥的熵值。假设你的用户ID是电子邮件地址。作为攻击者,我所要做的就是猜测一个在你的系统中有效的用户ID,然后我将“自动”成为该用户。人们使用会话ID然后检索用户的原因是理论上会话ID更难猜测。

我的建议是,如果你处于负载平衡的情况下,请使用数据库会话管理。如果没有,请使用内存中的管理。它很快。内存很便宜。除非你为每个用户存储了10 MB的数据,并且有成千上万的用户,否则你应该没问题。

正如Ken所述,你应该使用MVC提供的标准[authorize]标签而不是创建自己的方法。


好的,我存储的userid是数字,我将使用它来查询电子邮件和角色凭据。起初,我预计大约会有50-100个并发用户。我认为它不会达到10 MB,所以你认为我现在使用每次访问操作都要打数据库的方式就可以了吗?请查看下面Ken对我的设置的回复..非常感谢! - gdubs
如果你只存储用户的电子邮件和角色,那么使用内存实现就足够了。你现在做的有点是过早优化。先实现一个版本,然后进行负载测试以查看其性能。如果不符合你的标准(比如页面加载时间少于5秒),那么就调整一下,看看是否可以实现这个目标... - CtrlDot

1

听起来你已经实现了基于表单的身份验证和类似于 [Authorize] 属性的东西。

如果我有很多需要登录的操作,那么对我的带宽来说会很困难

表单身份验证使用 cookie 并且已经集成到系统中。如果你不想将用户信息存储在 SQLServer 中,还有很多其他选择。

听起来你正在尝试实现已经完成的事情。在我看来,让我们把安全问题留给懂安全的人。除非你有证据表明你的解决方案需要其他东西,否则我建议在提供的框架内工作!


我实际上正在使用普通的[authorize]标记,只是添加了一个actionfilter来覆盖onactionexecuting。我已经在使用formsauthentication,但我只存储用户ID,而不是整个用户详细信息,这意味着每次尝试访问操作时仍然需要查询数据库以获取用户角色凭据。即使我删除了actionfilter,由于我的安全性是基于角色的,除非我将角色存储在cookie中,否则我仍然必须访问数据库...除非有一种安全的缓存方式。 - gdubs

0

FormsAuthenticationTicket 对象上有一个 UserData 属性,可以用于存储除用户名以外的其他附加数据。

我曾经有一个类似的需求的项目。我将值存储为像查询字符串一样编码的 NameValueCollection

 "email=myemail@some.com&roles=Somebody&roles=Special" 

还有一个方便的HttpUtility.ParseQueryString()方法,可用于从UserData属性中获取值。

您可以使用FormsAuthentication.Encrypt和FormsAuthentication.Decrypt将票据转换为Cookie值并从中获取。


有趣...我会研究一下。但是,FormsAuthentication不是自动加密数据吗?我在想,如果我直接存储用户上下文而不是创建那个字符串,会怎样? - gdubs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接