在ASP.NET Identity 2.0中更改AspNetUsers表中的电子邮件或密码

时间:2015-02-12 23:04:39

标签: asp.net-mvc

我已经将ForgotPassword(带有令牌重置)实现到我的MVC 5应用程序中。我们正在生产中。虽然这在大多数情况下都有效,但是我们的许多终端用户年龄都很大,当他们无法登录并需要重置时会感到困惑。因此,在这些情况下,我正在考虑让我们的管理员能够重置用户的密码并在手机上为他们提供新密码。数据不那么敏感。

我试过了:

    public ActionResult ResetPassword()
    {     UserManager<IdentityUser> userManager =
            new UserManager<IdentityUser>(new UserStore<IdentityUser>());

        var user = userManager.FindByEmail("useremail.samplecom");

        userManager.RemovePassword(user.Id);
        userManager.AddPassword(user.Id, "newpassword");
}

我收到一个神秘的错误,指出无效的列电子邮件,无效的列电子邮件已确认......

我也试过了userManager.ResetPassword(),但放弃了这个想法,因为它需要一个令牌重置。我想绕过它。

我没看到什么?

提前致谢。

2 个答案:

答案 0 :(得分:5)

  

我也试过了userManager.ResetPassword(),但放弃了这个想法,因为它需要一个令牌重置。我想绕过它。

如何生成令牌并将其传递给重置例程呢?

var userManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
var code = await userManager.GeneratePasswordResetTokenAsync("username");
var result = await userManager.ResetPasswordAsync("username", code, "your new password");
if (!result.Succeeded)
{
    //password does not meet standards
}

这里的想法是,您只是模仿/绕过将令牌发送给客户端的常规例程(通过电子邮件)并拥有他们点击通话的链接ResetPasswordAsync

答案 1 :(得分:3)

我不完全确定这是否适用于您的实现,但我在一个用例中使用以下代码成功,该用例与您的要求基本相同。不同之处在于我不会让任何用户重置自己的密码。这始终是管理员的任务。

我绕过ApplicationUserManager并直接在表中编辑信息,只使用Entity Framework。

// I created an extension method to load the user from the context
// you will load it differently, but just for completeness
var user = db.LoadUser(id);

// some implementation of random password generator
var password = General.Hashing.GenerateRandomPassword();
var passwordHasher = new Microsoft.AspNet.Identity.PasswordHasher();

user.PasswordHash = passwordHasher.HashPassword(password);

db.SaveChanges();
相关问题