4

我使用 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("");
}
4

1 回答 1

7
public class AccountAppService: IAccountAppService 
{    
    public UserManager UserManager {get; set; }

    public async Task SendPasswordResetCode(string emailAddress)
    {    
        var user = await UserManager.FindByEmailAsync(emailAddress);

        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) */  
    }   
}
于 2019-07-30T05:58:19.320 回答