public async Task <Result> LoginVerifyPhone(LoginTwoFactorParam model) { var user = await _signInManager.GetTwoFactorAuthenticationUserAsync(); if (user == null) { return(Result.Fail("Error")); } var userFactors = await _userManager.GetValidTwoFactorProvidersAsync(user); if (!userFactors.Any(c => c == model.SelectedProvider)) { return(Result.Fail("Error")); } var code = await _userManager.GenerateTwoFactorTokenAsync(user, model.SelectedProvider); if (model.SelectedProvider == "Phone") { var phone = await _userManager.GetPhoneNumberAsync(user); var send = await _smsSender.SendCaptchaAsync(phone, code); if (!send.Success) { return(Result.Fail(send.Message)); } } else if (model.SelectedProvider == "Email") { var email = await _userManager.GetEmailAsync(user); var message = "Your security code is: " + code; await _emailSender.SendEmailAsync(email, "Security Code", message); } else { return(Result.Fail("Error")); } return(Result.Ok()); }
public async Task <Result> LoginTwoFactor(LoginTwoFactorParam model, string returnUrl = null) { var user = await _signInManager.GetTwoFactorAuthenticationUserAsync(); if (user == null) { return(Result.Fail("Error")); } // The following code protects for brute force attacks against the two factor codes. // If a user enters incorrect codes for a specified amount of time then the user account // will be locked out for a specified amount of time. var result = await _signInManager.TwoFactorSignInAsync(model.SelectedProvider, model.Code, model.RememberMe, model.RememberBrowser); if (result.IsLockedOut) { return(Result.Fail("用户已锁定,请稍后重试")); } else if (result.IsNotAllowed) { return(Result.Fail("用户邮箱未验证或手机未验证,不允许登录")); } else if (result.Succeeded) { // 如果双因子验证通过,则暂时设置false // 如果异地登录则设置true // 注意:双因子验证通过后,即便设置为true,在不切换用户的前提下,也不会再次进行双因子验证 await _userManager.SetTwoFactorEnabledAsync(user, false); var token = await _tokenService.GenerateAccessToken(user); return(Result.Ok(new { token, name = user.FullName, phone = user.PhoneNumber, email = user.Email, returnUrl })); } else { return(Result.Fail("验证码错误")); } }