使用Asp.Net Core Identity Core为单个页面应用程序实现2FA

时间:2019-07-13 06:34:27

标签: c# single-page-application asp.net-core-identity

我正在尝试使用Asp.Net Core Identity为SPA实施2FA。但是我被卡住了。

Authenticate2fa方法的完整代码可以在说明的末尾找到。

在代码中,以下行对于user始终为空值。我认为SignInManager.PasswordSignInAsync()中发生了一些魔术,但是即使我引用了源代码,也无法找到魔术的位置。

var user = await _signInManager.GetTwoFactorAuthenticationUserAsync();

因此await _signInManager.TwoFactorAuthenticatorSignInAsync(authenticatorCode, false, false);无效。

关于如何为MVC实施2FA,有一份正式文档,但是我找不到与SPA相关的任何内容。

我在正确的轨道上还是我想念什么?

    [HttpPost]
    [Route("authenticate2fa")]
    public async Task<IActionResult> Authenticate2fa([FromBody]LoginModel loginModel)
    {
        if (ModelState.IsValid)
        {
            var loginResult = await _signInManager.PasswordSignInAsync(loginModel.Username, loginModel.Password, isPersistent: false, lockoutOnFailure: false);

            if (!loginResult.Succeeded && !loginResult.RequiresTwoFactor)
            {
                return BadRequest("user-password-error");
            }

            var user = await _signInManager.GetTwoFactorAuthenticationUserAsync();
            if(user == null)
            {
                return BadRequest("unable-to-load-2fa-user");
            }

            var authenticatorCode = loginModel.TwoFactorCode.Replace(" ", string.Empty).Replace("-", string.Empty);
            var result = await _signInManager.TwoFactorAuthenticatorSignInAsync(authenticatorCode, false, false);

            if (result.Succeeded)
            {
                return Ok(await GenerateAuthenticatedUser(user));
            }
            else if (result.IsLockedOut)
            {
                return BadRequest("account-locked");
            }
            else
            {
                return BadRequest("invalid-2fa-code");
            }
        }

        return BadRequest(ModelState);
    }

1 个答案:

答案 0 :(得分:0)

我自己解决了这个问题。

我只是直接使用以下方法来验证两因素令牌。

UserManager.VerifyTwoFactorTokenAsync(...)

由于SignInManager依赖于HttpContext,因此它使用IAuthenticationService提供程序来处理2FA请求,因此您需要查看{{1 }}。就我而言,IdentityConstants.TwoFactorUserIdSchemeIAuthenticationHandlerProvider处理。

虽然是JWT令牌,但毫无疑问。