我使用 aspnetboilerplate (MVC) 并希望实现忘记密码功能,以允许用户使用登录屏幕上的链接重置自己的密码。
我想这可以通过生成密码重置代码来工作,然后通过电子邮件将其发送给用户。用户点击链接并被带到允许他们重置密码的屏幕。
我停留在初始阶段。在注意到尝试登录时返回了用户对象后,我开始使用登录操作的副本。从这里我尝试设置密码重置代码。
[HttpPost]
[UnitOfWork]
public virtual async Task<JsonResult> ForgotPassword(ForgotPasswordViewModel forgotPasswordModel, string returnUrl = "", string returnUrlHash = "")
{
returnUrl = NormalizeReturnUrl(returnUrl);
if (!string.IsNullOrWhiteSpace(returnUrlHash))
{
returnUrl = returnUrl + returnUrlHash;
}
var loginResult = await _logInManager.LoginAsync(forgotPasswordModel.UsernameOrEmailAddress, "ForgotPassword", GetTenancyNameOrNull());
loginResult.User.SetNewPasswordResetCode();
switch (loginResult.Result)
{
case AbpLoginResultType.Success:
return Json(loginResult);
default:
throw _abpLoginResultTypeHelper.CreateExceptionForFailedLoginAttempt(loginResult.Result, forgotPasswordModel.UsernameOrEmailAddress, GetTenancyNameOrNull());
}
}
之后检查 AbpUser 表
loginResult.User.SetNewPasswordResetCode();
我看不到用户的任何密码重置代码,它们都是空的。
有人可以指出我正确的方向。
提前致谢
感谢下面的回答是正确的,只是为了完成下面的工作。显然忽略了最后的json返回
public virtual async Task ForgotPassword(ForgotPasswordViewModel forgotPasswordModel, string returnUrl = "", string returnUrlHash = "") { //var user = await GetUserByChecking(emailAddress);
var user = await _userManager.FindByEmailAsync(forgotPasswordModel.UsernameOrEmailAddress);
if (user == null)
{
throw new UserFriendlyException("User not found!");
}
user.SetNewPasswordResetCode();
//Send an email to user with the below password reset code
/* Uri.EscapeDataString(user.PasswordResetCode) */
return Json("");
}