Подтвердить что ты не робот

Asp.NET Identity Custom SignInManager

В моем приложении я хотел бы добавить дополнительные условия для входа пользователей. Например, администратору разрешено "блокировать" учетную запись пользователя по какой-либо причине. Когда учетная запись заблокирована, пользователь не может войти в систему. Обратите внимание, что это отличается от "блокировки" из-за нескольких неудачных попыток входа в систему. Состояние блокировки может быть удалено администратором.

Я вижу, что шаблон по умолчанию создает ApplicationSignInManager, который имеет значение по умолчанию.

public class ApplicationSignInManager : SignInManager<User, string>

Действие "Вход" из контроллера "Account" вызывает

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

Итак, моя попытка переопределить эту функцию

public override async Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout)
{
    User user = this.UserManager.FindByName(userName);
    if (null != user)
    {
        if (true == user.AccountLocked)
        {
            return (SignInStatus.LockedOut);
        }
    }

    var result = await base.PasswordSignInAsync(userName, password, isPersistent, shouldLockout);

    return (result);
}

Есть две проблемы с этим. Во-первых, это предполагает, что "userName" уникально для каждого пользователя. Хотя это можно было бы с уверенностью предположить.

Во-вторых, функция возвращает практически SignInStatus, который определяется идентификатором Asp.net. Я не могу изменить, чтобы вернуть что-либо еще, чтобы сообщить правильную причину, по которой логин может выйти из строя.

Может ли кто-нибудь предоставить хорошие решения?

4b9b3361

Ответ 1

Почему бы просто не создать другой метод вместо переопределения? Ваш метод вернет все, что вам нужно знать - вернуть объект, который будет знать, действительно ли учетная запись действительно зарегистрирована или отключена администратором (я думаю, что "отключено" - лучшее имя для этого - избегает путаницы). И измените свои контроллеры на использование своего нового метода вместо стандартного PasswordSignIn.

Что касается уникальности имени пользователя - да, имена пользователей уникальны - это единственный способ входа в систему. В противном случае, если есть 2 учетных записей с одинаковым именем пользователя, как система узнает, какая учетная запись пытается использовать пароль?