验证Cookie

时间:2009-11-03 15:58:25

标签: c# asp.net asp.net-mvc authentication

我正在为我的Web应用程序编写一个数据库身份验证系统,这是在ASP.NET MVC中编写的。当有人授权时,应将其用户名保存在cookie中。仅使用HttpResponse.Cookies`来保存其值为用户名的cookie是否安全?难道不是可以伪造的吗?

仅保存用户名...这是正确而安全的方式吗?或者我应该保存整个User对象(如果这实际可能)?

谢谢你,对不起我的英语。

4 个答案:

答案 0 :(得分:5)

不,保存用户名是非常不安全的,因为它很容易被伪造。以下是我的指导原则:

  1. 使用令牌
  2. 哈希令牌存储在数据库中时。
  3. 使Cookie HttpOnly
  4. 可以通过CSPRNG生成令牌,以确保自动登录cookie不会伪造。

    在数据库受到攻击的情况下,在数据库中散列令牌会阻止用户帐户窃取。 (请记住,此时的令牌是密码等效的。)

    HTTP-Only cookie可防止可能窃取cookie的XSS攻击。

答案 1 :(得分:1)

不,在cookie中保存用户名以标记其授权的用户不是正确的方式,并且它绝对不安全。

将cookie编辑为别人的用户名非常容易,瞧!您现在已被授权为该用户。

相反,您应该在cookie中存储一些非特定于用户的信息,但特定于用户会话。您可以从浏览器字符串创建一个值(以某种方式加扰以使其不那么明显)并将值存储在cookie和服务器上的会话数据中。当用户发送下一个请求时,您可以验证该值是否来自同一会话和相同的浏览器配置。

它当然不是完全安全的,因为你可以欺骗cookie数据和浏览器字符串,但它比将用户名放在cookie中要安全得多,并且比仅仅依赖会话ID更安全。

要获得真正安全的身份验证,您必须使用SSL。

答案 2 :(得分:0)

如果您将用户名存储在Cookie中,那么有人可以轻松更改该用户名。

更好的方法是在cookie中存储会话ID(您已经生成)并挂起服务器中的用户名等用户名。

答案 3 :(得分:0)

使用内置表单身份验证框架来处理世界的HTTP传输端,并避免重新发明轮子。

PS:在有人downvotes之前,请记住FormsAuthentication!=使用SqlMembershipProvider。