Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TwoFactorAuthenticatorSignInAsync always return failed

I'm trying to setup Two Factor Authentication on my Blazor server app using Twillio. I'm able to send the code using

            var token = await _signInManager.UserManager.GenerateChangePhoneNumberTokenAsync(user, user.PhoneNumber);

        PhoneNumber = user.PhoneNumber;
        ReturnUrl = returnUrl;
        RememberMe = rememberMe;

        var message = "Your security code is: " + token;

But when I try to verify it using the code below, I always get result.failed. I have no idea why. The user I'm testing with has 2FA enabled and the phone number is valid.

        public async Task<IActionResult> OnPostAsync(bool rememberMe, string returnUrl = null)
    {
        if (!ModelState.IsValid)
        {
            return Page();
        }

        returnUrl = returnUrl ?? Url.Content("~/");

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

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

        var r = _signInManager.UserManager.GetValidTwoFactorProvidersAsync(user);
        var result = await _signInManager.TwoFactorAuthenticatorSignInAsync(authenticatorCode, rememberMe, Input.RememberMachine);

        if (result.Succeeded)
        {
            _logger.LogInformation("User with ID '{UserId}' logged in with 2fa.", user.Id);

            return LocalRedirect(returnUrl);
        }
        else if (result.IsLockedOut)
        {
            _logger.LogWarning("User with ID '{UserId}' account locked out.", user.Id);
            return RedirectToPage("./Lockout");
        }
        else
        {
            _logger.LogWarning("Invalid authenticator code entered for user with ID '{UserId}'.", user.Id);
            ModelState.AddModelError(string.Empty, "Invalid authenticator code.");
            return Page();
        }
    }
like image 524
user179185 Avatar asked Jul 29 '26 08:07

user179185


1 Answers

You have to use same provider that you used at sending the code.

So lets say you used TokenOptions.DefaultEmailProvider or TokenOptions.DefaultPhoneProvider ..etc at sending :

var code = await _userManager.GenerateTwoFactorTokenAsync(
    user, TokenOptions.DefaultEmailProvider);

Then replace this line

 var result = await _signInManager.TwoFactorAuthenticatorSignInAsync(
        authenticatorCode, rememberMe, Input.RememberMachine);

with this one

var result = await _signInManager.TwoFactorSignInAsync(
        TokenOptions.DefaultEmailProvider, 
        authenticatorCode, rememberMe, Input.RememberMachine);
like image 50
TECNO Avatar answered Jul 31 '26 23:07

TECNO



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!