У меня есть логин, который использует функции аутентификации asp.net и блокирует пользователей вне системы, если они несколько раз неправильно вводят свой пароль.
Когда пользователь неправильно вводит свой пароль, [Поле AccessFailedCount] увеличивается на 1 каждый раз (в таблице dbo.AspNetUsers), как и предполагалось.
Однако при последней попытке (скажем, 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);
}
Когда пользователь неправильно вводит свой пароль, случай «Отказ» получает удар 4 раза, затем случай «LockedOut» получает удар, и [AccessFailedCount] сбрасывается до 0.
Кажется, это происходитгде-то в методе PasswordSignInAsync, так как счетчик уже установлен в 0 до того, как будут затронуты случаи.
Есть ли способпредотвратить такое поведение (вообще)?Я бы заподозрил, что в любом случае поле [AccessFailedCount] следует сбрасывать, только если пользователь успешно вошел в систему, но оно сбрасывается, даже когда пользователь получает сообщение об ошибке, в котором говорится, что он не может войти в систему в течение установленного периода времени.
Похоже, это встроенная функция аутентификации asp.net, но я не уверен, как предотвратить сброс поля [AccessFailedCount].