【问题标题】:Authentication Cookie身份验证 Cookie
【发布时间】:2009-11-03 15:58:24
【问题描述】:

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

只保存用户名...这是正确且安全的方法吗?或者我应该保存整个用户对象(如果这实际上可能的话)?

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

【问题讨论】:

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


    【解决方案1】:

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

    1. 使用令牌
    2. 哈希令牌存储在数据库中时。
    3. 制作 cookie HttpOnly

    可以通过 CSPRNG 生成令牌,以确保自动登录 cookie 不会被伪造。

    对数据库中的令牌进行哈希处理可以防止在您的数据库遭到破坏的情况下窃取用户帐户。 (请记住,此时的令牌与密码等效。)

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

    【讨论】:

    • 令牌是随机生成的数字或无法猜测的一段文本。
    • 谢谢,但我怎样才能制作一个 cookie HttpOnly?
    • Cookie['whatever'].HttpOnly = true;
    【解决方案2】:

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

    将 cookie 编辑为其他人的用户名会很容易,瞧!您现在被授权为该用户。

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

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

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

    【讨论】:

      【解决方案3】:

      如果您将用户名存储在 cookie 中,那么其他人很容易更改它。

      更好的方法是在 cookie 中存储会话 ID(您已生成)并将用户名之类的内容挂在服务器中。

      【讨论】:

      • 会话ID及其用户名/用户是否应该保存在数据库中?
      • 是的——因此您可以使用会话 ID 作为键进入包含您需要的所有会话相关信息的表中,例如用户。由于您生成了 ID(可能以 GUID 的形式),因此某人将无法通过修改 cookie 值来伪造其他用户的会话。
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-28
        • 2023-04-05
        • 2016-03-02
        • 2020-02-27
        • 2011-08-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多