ASP.NET身份验证更改密码

103

我需要管理员能够修改用户的密码。因此,管理员不应该输入用户的当前密码,而是应该有能力设置一个新密码。我查看了ChangePasswordAsync方法,但是这个方法要求输入旧密码,因此这个方法对于这个任务来说不合适。因此,我通过以下方式实现了它:

    [HttpPost]
    public async Task<ActionResult> ChangePassword(ViewModels.Admin.ChangePasswordViewModel model)
    {
        var userManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
        var result = await userManager.RemovePasswordAsync(model.UserId);
        if (result.Succeeded)
        {
            result = await userManager.AddPasswordAsync(model.UserId, model.Password);
            if (result.Succeeded)
            {
                return RedirectToAction("UserList");
            }
            else
            {
                ModelState.AddModelError("", result.Errors.FirstOrDefault());
            }
        }
        else
        {
            ModelState.AddModelError("", result.Errors.FirstOrDefault());
        }
        return View(model);
    }

它能工作,但理论上我们可能会在AddPasswordAsync方法上收到错误。因此,旧密码将被删除但新密码未设置。这不好。有没有办法在“一个事务”中完成它? 附注:我看到了带有重置令牌的ResetPasswordAsync方法,似乎更安全(因为用户不会出现不稳定情况),但无论如何,它都需要2个操作。


2
这个问题的关键在于要在一个事务中完成。如果您愿意分两个事务来完成,并且不断尝试直到第二个成功,那么您会满意吗?如果不行,您可能需要编写自己的更改密码实现。 - Shaun Luttin
11个回答

-3

是的,你是正确的。通过token重置密码是一种首选方法。 以前,我创建了一个完整的.NET Identity包装器,代码可以在这里找到。它可能对你有帮助。你也可以在这里找到NuGet。我还在博客中解释了这个库这里。此包装器易于使用为NuGet,并在安装期间创建所有所需的配置。


请提供内容而非外部链接的答案。如果这些链接因任何原因失效,那么这个答案将完全无用。此外,您正在回答一个超过两年的问题,而且没有提供任何额外的价值。 - shortstuffsushi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接