TwoFactorAuthenticatorSignInAsync 始终返回失败

问题描述 投票:0回答:1

我正在尝试使用 Twillio 在我的 Blazor 服务器应用程序上设置双因素身份验证。我可以使用

发送代码
            var token = await _signInManager.UserManager.GenerateChangePhoneNumberTokenAsync(user, user.PhoneNumber);

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

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

但是当我尝试使用下面的代码验证它时,我总是得到 result.failed。我不知道为什么。我正在测试的用户已启用 2FA 并且电话号码有效。

        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();
        }
    }
c# asp.net-core blazor asp.net-core-identity two-factor-authentication
1个回答
4
投票

您必须使用与发送代码时相同的提供商。

所以假设您在发送时使用了

TokenOptions.DefaultEmailProvider
TokenOptions.DefaultPhoneProvider
..等 :

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

然后替换这条线

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

有了这个

var result = await _signInManager.TwoFactorSignInAsync(
        TokenOptions.DefaultEmailProvider, 
        authenticatorCode, rememberMe, Input.RememberMachine);
© www.soinside.com 2019 - 2024. All rights reserved.