我们在当前网站上通过短信使用双因素身份验证。一旦用户验证了他们的电话号码,我们认为要求偶尔进行随机检查作为额外的安全层是个好主意。
要启用此功能,我将其放在控制器上的Login方法中:
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: true);
switch (result)
{
// other cases
case SignInStatus.RequiresVerification:
int challengeFrequency = Convert.ToInt16(ConfigurationManager.AppSettings["ChallengeFrequency"]);
Random rnd = new Random();
if (rnd.Next(1, challengeFrequency + 1) == 1)
{
return RedirectToAction("SendCode", new { returnUrl = returnUrl });
}
else
{
var token = await UserManager.GenerateTwoFactorTokenAsync(user.Id, "Phone Code");
await SignInManager.TwoFactorSignInAsync("Phone Code", token, false, false);
return RedirectToLocal(returnUrl);
}
}
但是当用户未提出质疑时,这会导致他们必须先登录两次才能进入网站。
单步执行代码我可以看到它正在按预期生成电话验证令牌。我理解对TwoFactorSignInAsync的调用应该等到登录过程完成后再继续。但是在第一遍User.Identity.IsAuthenticated
是假的,而在第二遍,它是真的。
为什么第一次尝试时无法登录用户,但第二次尝试成功?