Example #1
0
        public async Task <IActionResult> OnPostTwoFactor([FromForm] InputTwoFactorModel InputTwoFactor)
        {
            if (!ModelState.IsValid)
            {
                return(new PartialViewResult
                {
                    ViewName = "./LoginTwoFactor",
                    ViewData = new ViewDataDictionary <InputTwoFactorModel>(ViewData, new InputTwoFactorModel())
                });
            }

            string returnUrl  = (string)TempData.Peek("ReturnUrl");
            bool   rememberMe = (bool)TempData.Peek("RememberMe");;

            var user = await _signInManager.GetTwoFactorAuthenticationUserAsync();

            if (user == null)
            {
                throw new InvalidOperationException($"Unable to load two-factor authentication user.");
            }

            var authenticatorCode = InputTwoFactor.TwoFactorCode.Replace(" ", string.Empty).Replace("-", string.Empty);


            var result = await _signInManager.VerifyTwoFactorAuthenticatorSignInAsync(authenticatorCode, rememberMe, InputTwoFactor.RememberMachine);

            if (result.Succeeded)
            {
                _logger.LogInformation("User with ID '{UserId}' logged in with 2fa.", user.Id);
                TempData["RememberMachine"]   = InputTwoFactor.RememberMachine;
                TempData["AuthenticatorCode"] = authenticatorCode;

                return(new PartialViewResult
                {
                    ViewName = "LoginPassword",
                    ViewData = new ViewDataDictionary <InputPasswordModel>(ViewData, new InputPasswordModel())
                });
            }
            else if (result.IsLockedOut)
            {
                return(BuildLockoutResult());
            }
            else
            {
                _logger.LogWarning("Invalid authenticator code entered for user with ID '{UserId}'.", user.Id);
                ModelState.AddModelError(string.Empty, "Invalid authenticator code.");
                return(new PartialViewResult
                {
                    ViewName = "./LoginTwoFactor",
                    ViewData = new ViewDataDictionary <InputTwoFactorModel>(ViewData, new InputTwoFactorModel())
                });
            }
        }