我正在尝试使用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);
}
答案 0 :(得分:0)
我自己解决了这个问题。
我只是直接使用以下方法来验证两因素令牌。
UserManager.VerifyTwoFactorTokenAsync(...)
由于SignInManager依赖于HttpContext
,因此它使用IAuthenticationService
提供程序来处理2FA请求,因此您需要查看{{1 }}。就我而言,IdentityConstants.TwoFactorUserIdScheme
由IAuthenticationHandlerProvider
处理。
虽然是JWT令牌,但毫无疑问。