public async Task <Result> ResetPasswordByEmail([FromBody] ResetPasswordPutParam param) { var user = await _userManager.FindByNameAsync(param.UserName); if (user == null) { throw new Exception("用户不存在"); } if (!user.IsActive) { throw new Exception("用户已禁用"); } var result = await _userManager.ResetPasswordAsync(user, param.Code, param.Password); if (result.Succeeded) { // 通过邮箱找回密码时,如果邮箱未确认,则自动确认 if (!user.EmailConfirmed) { user.EmailConfirmed = true; await _userManager.UpdateAsync(user); } _tokenService.RemoveUserToken(user.Id); return(Result.Ok()); } return(Result.Fail(result.Errors?.FirstOrDefault()?.Description)); }
public async Task <Result> ResetPasswordByPhone([FromBody] ResetPasswordPutParam param) { var user = await _userManager.FindByNameAsync(param.UserName); if (user == null) { throw new Exception("用户不存在"); } if (!user.IsActive) { throw new Exception("用户已禁用"); } if (string.IsNullOrWhiteSpace(user.PhoneNumber)) { throw new Exception("用户未绑定手机,无法通过手机找回密码"); } //5分钟内的验证码 var sms = _smsSendRepository .Query(c => c.PhoneNumber == user.PhoneNumber && c.IsSucceed && !c.IsUsed && c.TemplateType == SmsTemplateType.Captcha && c.CreatedOn >= DateTime.Now.AddMinutes(-5)).OrderByDescending(c => c.CreatedOn).FirstOrDefault(); if (sms == null) { return(Result.Fail("验证码不存在或已失效,请重新获取验证码")); } if (sms.Value != param.Code) { return(Result.Fail("验证码错误")); } //设置验证码被使用 sms.IsUsed = true; await _smsSendRepository.SaveChangesAsync(); //重新生成重置密码的令牌 var code = await _userManager.GeneratePasswordResetTokenAsync(user); var result = await _userManager.ResetPasswordAsync(user, code, param.Password); if (result.Succeeded) { _tokenService.RemoveUserToken(user.Id); return(Result.Ok()); } return(Result.Fail("重置密码失败,验证码错误或链接已失效,请稍后重试")); }