ASP.Net Identity 2.0 AccessFailedCount не увеличивается

Вчера вечером я работал над новым проектом с использованием FormsAuthentication и настраивал билет для включения маркера безопасности, поэтому, если пользователь выходит из системы в одном браузере, он выходит из системы во всех них. Рассматривая последнюю итерацию ASP.net Identity, похоже, что эта функциональность уже встроена.

Я создал новое тестовое веб-приложение MVC 5 с включенными индивидуальными учетными записями. Регистрация и аутентификация работали прямо из коробки.

Однако я заметил, что неудачные попытки входа не увеличивали поле AccessFailedCount в таблице AspNetUsers. И поскольку это не увеличивалось, я мог бы попробовать столько неудачных попыток входа в систему, сколько захотел, не закрыв учетную запись.

Как включить функции AccessFailedCount и блокировки в ASP.net Identity 2.0?

Ответ 1

Вы должны обрабатывать это вручную. Метод CheckPassword вызывает метод PasswordHasher.VerifyHashedPassword для проверки пароля, но он не обновляет счет неудачного доступа, если предоставленный пароль не соответствует существующему.

Вот пример метода проверки подлинности, который поддерживает блокировку:

UserManager<User> userManager = new UserManager<User>(new UserStore());

if (userManager.SupportsUserLockout && userManager.IsLockedOut(userId))
    return;

var user = userManager.FindById(userId);
if (userManager.CheckPassword(user, password))
{
    if (userManager.SupportsUserLockout && userManager.GetAccessFailedCount(userId) > 0)
    {
        userManager.ResetAccessFailedCount(userId);
    }

    // Authenticate user
}
else
{
    if (userManager.SupportsUserLockout && userManager.GetLockoutEnabled(userId))
    {
        userManager.AccessFailed(userId);
    }
}

Ответ 2

Существует также PasswordSignInAsync, который принимает аргумент "shouldLockout". Установка этого параметра в значение true приведет к автоматическому приращению неудачных попыток входа в систему.

var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: true);

Ответ 3

Для .NET Core 2.1 mustLockout теперь называется lockoutOnFailure

Таким образом, ваш входящий вызов должен выглядеть так, чтобы увеличить число неудачных попыток входа:

var result = await SignInManager.PasswordSignInAsync(loginModel.Email, loginModel.Password, loginModel.RememberMe, lockoutOnFailure: true);

Это также сбрасывает неудачные попытки входа в систему после успешного входа пользователя.