Ejemplo n.º 1
0
        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());
        }
Ejemplo n.º 2
0
        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("验证码错误"));
            }
        }