我们已经自定义了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
}
}
否则,您还可以使用密码重置流并生成令牌,然后立即使用以重置用户密码(而无需实际涉及用户)。因此,您基本上将链GeneratePasswordResetTokenAsync
和ResetPasswordAsync
链。当然,这仅应出于维护原因:
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 将能够看到他们的新密码用纯文本。 - 旧密码在数据库中暴露在数据库中,并且很可能(希望?!)大量备份,即使您认为系统安全,也可能并不是完美的。而且仍然有一些人可以访问数据库,并且可以直接或间接将这些密码暴露于其他密码(有或没有良好意图)。您不应该足够信任自己的系统,没有什么都不会出错。用户不必相信您的密码安全。您应该告诉他们制作一个新密码并清除其旧密码 - 比晚更早。