我有一个使用asp.net身份验证功能的登录名,如果用户多次错误输入密码,它将把用户锁定在系统之外。
当用户错误输入密码时,[AccessFailedCount]字段每次(在dbo.AspNetUsers表中)按预期递增1。
但是,在错误消息出现在屏幕上以显示用户已被锁定之前,他们进行了最后一次尝试(例如第5次),[AccessFailedCount]重置为0,这使我无法看到该用户有多少次帐户无法登录。
被击中的代码块如下:
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, true);
switch (result)
{
case SignInStatus.Success:
return RedirectToLocal(returnUrl);
case SignInStatus.LockedOut:
var lockoutMessage = WebConfigurationManager.AppSettings["LockoutMessage"];
ModelState.AddModelError("", lockoutMessage);
return View(model);
case SignInStatus.RequiresVerification:
return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
case SignInStatus.Failure:
default:
ModelState.AddModelError("", "Please check your credentials and try again.");
// Incorrect login info.
return View(model);
}
当用户错误地输入密码时,“ Failure”用例被击中4次,然后“ LockedOut”用例被击中,[AccessFailedCount]被重置为0。
这似乎发生在PasswordSignInAsync方法中的某处,因为在命中案件之前,计数已经设置为0。
是否有任何方法可以防止这种行为的发生?我会怀疑,如果有的话,[AccessFailedCount]字段仅应在用户成功登录后才重置,但是即使用户收到错误消息说他们无法在设定的时间段内登录,该字段也将重置。 / p>
它似乎是asp.net身份验证功能的内置功能,但是我不确定如何防止重置[AccessFailedCount]字段。
答案 0 :(得分:0)
当我开始阅读您的问题时,我的猜测是,当用户输入错误的密码时,“ AccessFailedCount”将增加1,直到达到特定阈值(例如5)为止。到达阈值后,它将返回0,重置并重新设置。帐户确实被锁定。
通过更改LockoutEndDateUtc来实现锁定。我建议检查阈值的检查值。还要注意LockoutEndDateUtc和LockoutEnabled字段。
答案 1 :(得分:0)
AccessFailed
在设计“失败”周期结束时重置为0
。
一旦达到最大尝试次数,AccessFailed
将重置为0
,然后再次设置LockoutEndDateUtc
。您只能访问每个fail
周期内失败尝试的次数。