重置ASP.NET标识密码失败

时间:2014-05-18 07:39:43

标签: asp.net asp.net-mvc asp.net-identity

我正在使用ASP.NET MVC5身份,并希望用户只需输入电子邮件就可以重置密码

只有固定数量的用户,并且已经设置了这些用户,包括电子邮件地址。如果用户访问该网站,他们可能会点击“发送我的密码”链接,该链接应将有效密码发送到存入的电子邮件中。

我想管理员没有简单的方法来接收当前密码,所以我认为有必要重置密码然后创建邮件:

    [HttpPost]
    [AllowAnonymous]
    public JsonResult RecoverPassword(string usersEmail)
    {
        try
        {
            //"db" is my Context..
            var um = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(db));
            var user = db.Users.Where(x => x.Email == usersEmail).First();
            Random rnd = new Random();
            int rndNumber = rnd.Next(100, 999);
            string Password = "MostSecurePasswordInTheWorld" + rndNumber + ".";
            um.RemovePassword(user.Id);
            um.AddPassword(user.Id, Password);
            db.SaveChanges();
            //send mail
            ...

这可能有一些弱点(每个知道某个用户的有效电子邮件的人都可能会重置它,密码是通过邮件发送的,自动生成的密码是弱的等等)。但最大的弱点是.. 密码无法重置

我在调试中没有遇到任何错误,并且有点无能为力。这可能是什么问题?是我来自的“用户”

var user = db.Users.Where(x => x.Email == usersEmail).First();

这里不需要用户对象吗?

3 个答案:

答案 0 :(得分:1)

您需要在将密码保存到数据库之前对其进行哈希处理。使用UserManager类来访问密码保存功能,而不是尝试使用实体类直接操作它。

我还建议您向用户发送一个链接,他们可以将自己的密码重置为他们自己选择的密码。

通常我在系统中实现的方法是在数据库中保留一个表,以便发送所有密码重置电子邮件。该表包含日期时间时间戳字段以及确认号,它基本上是随机生成的GUID,当然还有目标电子邮件地址的字段。然后,您可以将确认编号和目标电子邮件地址放在电子邮件中包含的重置链接的查询字符串中。当用户点击该链接时,系统会检查它是否是有效的确认号码电子邮件对以及是否已过期,然后再继续提示您的用户输入新密码。

答案 1 :(得分:1)

身份用户管理器功能中的一个常见问题是您无法访问它所使用的dbContext,因此您无法持久保存所需内容。

看看这个SO答案,它展示了如何使用户管理器dbContext易于使用

Updating user data - ASP.NET Identity

答案 2 :(得分:0)

以下是使用名为article on adding password reset using SimpleMembership的开源项目的SimpleSecurity。这提供了有关ASP.NET MVC中密码重置的一般设计的信息。使用ASP.NET Identity在SimpleSecurity项目中实现了相同的功能。您可以为控制器find the source code here。看一下ResetPassword方法。