ASP.NET核心身份,更新现有的纯文本密码



我们已经自定义了ASP.NET核心来使用我们的学生表而不是Aspnetuser表。一切对新学生都很好。但是我们需要更新现有学生的密码。当学生登录时,我想做这样的事情(在AccountController Login方法中),或者可以一次性地完成……

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
    ViewData["ReturnUrl"] = returnUrl;
    if (ModelState.IsValid)
    {
        // Require the user to have a confirmed email before they can log on.
        var user = await _userManager.FindByEmailAsync(model.Email);
        if (user != null)
        {
            if (user.PasswordHash == null)
            {
                user.EmailConfirmed = true;
                user.UserName = model.Email;
                user.NormalizedEmail = model.Email.ToUpper();
                user.NormalizedUserName = user.NormalizedEmail;
                //user.PasswordHash = ?;
                //user.SecurityStamp = ?;
                //update user in database.
            }
            //continue on with login process
        }
    }
}

以下代码(来自Register方法)创建了一个新用户,并将其添加到数据库中。这不是我们想要的。

var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
var result = await _userManager.CreateAsync(user, model.Password);
if (result.Succeeded)
    // …

您会发现usermanager拥有为用户设置密码所需的任何东西。虽然您可以直接使用内部密码哈希尔,但要浏览用户管理器,请确保用户实体在密码方面正确更新。因此,您可以依靠用户管理器来"做正确的事情"。

如果用户没有密码,则可以使用AddPasswordAsync设置它:

var user = await _userManager.FindByEmailAsync(model.Email);
if (user != null && !(await _userManager.HasPasswordAsync(user)))
{
    // retrieve plaintext password
    var originalPassword = GetPlainTextPassword(user);
    var result = await _userManager.AddPasswordAsync(user, originalPassword);
    if (!result.Succeeded)
    {
        // handle error
    }
}

否则,您还可以使用密码重置流并生成令牌,然后立即使用以重置用户密码(而无需实际涉及用户)。因此,您基本上将链GeneratePasswordResetTokenAsyncResetPasswordAsync链。当然,这仅应出于维护原因:

var user = await _userManager.FindByEmailAsync(model.Email);
if (user != null)
{
    // retrieve plaintext password
    var originalPassword = GetPlainTextPassword(user);
    // retrieve token
    var resetToken = await _userManager.GeneratePasswordResetTokenAsync(user);
    // reset password
    var result = await _userManager.ResetPasswordAsync(user, resetToken, originalPassword);
    if (!result.Succeeded)
    {
        // handle error
    }
}

无论如何,我仍然建议您积极地要求用户自己重置密码。只需从数据库中删除纯文本密码,然后保留空密码。这样,用户将不得不先重置密码(您应该添加一个注释以解释他们必须在第一次登录之前必须这样做),> noboy 将能够看到他们的新密码用纯文本。 - 旧密码在数据库中暴露在数据库中,并且很可能(希望?!)大量备份,即使您认为系统安全,也可能并不是完美的。而且仍然有一些人可以访问数据库,并且可以直接或间接将这些密码暴露于其他密码(有或没有良好意图)。您不应该足够信任自己的系统,没有什么都不会出错。用户不必相信您的密码安全。您应该告诉他们制作一个新密码并清除其旧密码 - 比晚更早。

相关内容

  • 没有找到相关文章

最新更新