public async Task <Result> LoginPhone(LoginPhoneParam model, string returnUrl = null)
        {
            var phone = model.Phone;

            //5分钟内的验证码
            var sms = await _accountService.ValidateGetLastSms(phone, model?.Code);

            //设置验证码被使用
            sms.IsUsed = true;
            await _smsSendRepository.SaveChangesAsync();

            var user = await _userManager.Users.FirstOrDefaultAsync(c => c.PhoneNumber == phone);

            if (user == null)
            {
                return(Result.Fail("用户不存在"));
            }
            if (!user.IsActive)
            {
                return(Result.Fail("用户已禁用"));
            }

            //如果手机没有验证,则自动验证
            if (!user.PhoneNumberConfirmed)
            {
                user.PhoneNumberConfirmed = true;
                await _userManager.UpdateAsync(user);
            }

            var isLockedOut = await _userManager.IsLockedOutAsync(user);

            if (isLockedOut)
            {
                throw new Exception("用户已锁定,请稍后重试");
            }

            if (!await _signInManager.CanSignInAsync(user))
            {
                throw new Exception("用户不允许登录,请稍后重试");
            }

            // 如果手机没有验证,则自动验证
            if (!user.PhoneNumberConfirmed)
            {
                user.PhoneNumberConfirmed = true;
                await _userManager.UpdateAsync(user);
            }

            // 如果用手机登录且双因子=true时,则设置双因子=false
            if (user.TwoFactorEnabled)
            {
                await _userManager.SetTwoFactorEnabledAsync(user, false);
            }

            // 重置错误次数计数器
            var failedCount = await _userManager.GetAccessFailedCountAsync(user);

            if (failedCount > 0)
            {
                await _userManager.ResetAccessFailedCountAsync(user);
            }

            var token = await _tokenService.GenerateAccessToken(user);

            var loginResult = new LoginResult()
            {
                Token  = token,
                Avatar = user.AvatarUrl,
                Email  = user.Email,
                Name   = user.FullName,
                Phone  = user.PhoneNumber
            };

            return(Result.Ok(loginResult));

            //var userFactors = await _userManager.GetValidTwoFactorProvidersAsync(user);
            //if (!userFactors.Any(c => c == nameof(model.Phone)))
            //    return Result.Fail("手机未验证,不允许用手机登录");
            //var isLockedOut = _userManager.IsLockedOutAsync(user);

            //var signInResult = await _shopSignInManager.SignInCheck(user);
            //if (signInResult == null || signInResult.Succeeded)
            //{
            //    //如果返回null,说明被允许登录
            //    //如果用手机登录且双因子=true时,则设置双因子=false
            //    if (user.TwoFactorEnabled)
            //    {
            //        await _userManager.SetTwoFactorEnabledAsync(user, false);
            //    }
            //    var token = await _tokenService.GenerateAccessToken(user);
            //    var loginResult = new LoginResult()
            //    {
            //        Token = token,
            //        Avatar = user.AvatarUrl,
            //        Email = user.Email,
            //        Name = user.FullName,
            //        Phone = user.PhoneNumber
            //    };
            //    return Result.Ok(loginResult);
            //}
            //else if (signInResult.IsLockedOut)
            //{
            //    return Result.Fail("用户已锁定,请稍后重试");
            //}
            //return Result.Fail("用户登录失败,请稍后重试");
        }
Exemple #2
0
        public async Task <Result> LoginPhone(LoginPhoneParam model, string returnUrl = null)
        {
            var phone = model.Phone;

            //5分钟内的验证码
            var sms = _smsSendRepository
                      .Query(c => c.PhoneNumber == phone && 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 != model.Code)
            {
                return(Result.Fail("验证码错误"));
            }

            //设置验证码被使用
            sms.IsUsed = true;
            await _smsSendRepository.SaveChangesAsync();

            var user = await _userManager.Users.FirstOrDefaultAsync(c => c.PhoneNumber == phone);

            if (user == null)
            {
                return(Result.Fail("用户不存在"));
            }
            if (!user.IsActive)
            {
                return(Result.Fail("用户已禁用"));
            }

            //如果手机没有验证,则自动验证
            if (!user.PhoneNumberConfirmed)
            {
                user.PhoneNumberConfirmed = true;
                await _userManager.UpdateAsync(user);
            }

            //var userFactors = await _userManager.GetValidTwoFactorProvidersAsync(user);
            //if (!userFactors.Any(c => c == nameof(model.Phone)))
            //    return Result.Fail("手机未验证,不允许用手机登录");
            //var isLockedOut = _userManager.IsLockedOutAsync(user);

            var signInResult = await _shopSignInManager.SignInCheck(user);

            if (signInResult == null || signInResult.Succeeded)
            {
                //如果返回null,说明被允许登录
                //如果用手机登录且双因子=true时,则设置双因子=false
                if (user.TwoFactorEnabled)
                {
                    await _userManager.SetTwoFactorEnabledAsync(user, false);
                }
                var token = await _tokenService.GenerateAccessToken(user);

                var loginResult = new LoginResult()
                {
                    Token  = token,
                    Avatar = user.AvatarUrl,
                    Email  = user.Email,
                    Name   = user.FullName,
                    Phone  = user.PhoneNumber
                };
                return(Result.Ok(loginResult));
            }
            else if (signInResult.IsLockedOut)
            {
                return(Result.Fail("用户已锁定,请稍后重试"));
            }
            return(Result.Fail("用户登录失败,请稍后重试"));
        }