ASP.NET MVC4使用cookie记住登录密码 - 安全方式?

时间:2012-03-23 07:39:37

标签: cookies login passwords asp.net-mvc-4

我希望登录框的功能可以自动填写用户名和密码,如果用户之前已经在网站上并且之前已成功登录。我看到这在许多网站上实现,所以我认为这是一种方法,可以在不产生安全风险的情况下实现这一点。

编辑:根据帖子,这是一个浏览器功能,不应该在代码中实现,因为它永远不能安全地存储密码。

编辑代码以反映我只存储用户名的新方向。但是,我不知道该寻找什么,看它是否有效。我尝试登录然后注销,然后再次进入登录屏幕,但是当视图加载时,用户名框仍然是空白的。不确定它是代码还是我测试错误的方式。

登录POST:

        [HttpPost]
    public ActionResult Login(LoginModel model)
    {

        if (ModelState.IsValid)
        {
            if (Membership.ValidateUser(model.UserName, model.Password))
            {
                FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);                    
                return Json(new { ok = true, message = "Login successful." });
            }
        }

        return Json(new { ok = false, message = "The username or password you entered is invalid. Please try again." });
    }

登录GET:

[HttpGet]
    public ActionResult Login(string path)
    {
        LoginModel model = new LoginModel();

        HttpCookie authCookie = System.Web.HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName.ToString()];
        if (authCookie != null)
        {
            FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
            if (authTicket != null & !authTicket.Expired)
            {
                model.UserName = authTicket.UserData;
            }
        }

        return PartialView(path, model);
    }

3 个答案:

答案 0 :(得分:2)

您的代码存在几个问题。第一个是您将cookie添加到Request对象,而不是将其添加到Response => Response.Cookies.Add(authCookie);

第二个问题是您正在创建一个非持久性cookie,这意味着它只能通过浏览器会话生存。一旦用户关闭浏览器,它将永远消失,因为它从未存储在客户端计算机上。要创建persistent cookie,您需要为其指定过期日期,这显然会对应此Cookie在客户端计算机上保留多长时间。例如,如果你想记住5天:

HttpCookie authCookie = new HttpCookie("authCookie", "cookieValue")
{
    Expires = DateTime.Now.AddDays(5)
};

另一个问题是,您只在密码中存储密码的MD5哈希,并且您希望以后能够使用FormsAuthentication.Decrypt解密密码,这是不可能的。此方法可以解密使用Encrypt方法加密的值。

最重要的问题是安全性:你永远不应该在任何地方存储任何密码相关的东西。用户名应该足够了。浏览器提供了记住给定站点密码的可能性。我建议你使用这个功能,而不是做你正在做的事情。

另一种可能性是在用户登录时发出持久性身份验证cookie,这样即使他关闭浏览器,他也会被记住为您在此身份验证cookie中指定的有效期进行身份验证。

答案 1 :(得分:0)

您不需要用户的实际密码来确保他以前登录过。您甚至不应该在数据库中保存实际密码。您通常只保存该密码的盐渍哈希。当用户登录时,您将为该密码创建一个哈希值,并将其与存储在数据库中的哈希值进行比较。如果匹配,则输入正确的密码。

至于在cookie中存储登录信息,我会在cookie中存储该密码哈希的盐渍哈希。在GET中,您只需创建存储密码哈希的盐渍哈希,并将其与cookie中的哈希进行比较。如果匹配,则登录cookie有效。这样你就不会在任何地方存储任何用户密码。

为了使这更加安全,登录页面应该通过SSL加以保护,否则密码至少会以未加密的方式传输。

答案 2 :(得分:-2)

如果您使用的是SQL,则可以在用户首次登录时生成随机数。将此号码存储在Users表中,也可以作为用户计算机上的cookie存储。然后,用户可以通过将随机数与存储在服务器上的随机数进行比较来进行身份验证。

为登录加时间戳是个好主意,所以它会在一段时间后过期。