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("用户登录失败,请稍后重试"); }
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("用户登录失败,请稍后重试")); }