Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
        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("重置密码失败,验证码错误或链接已失效,请稍后重试"));
        }