2015-05-26 2 views
3

Мне нужно заблокировать пользователя навсегда. Я не понимаю, почему этот код не работает.MVC 5 Identity 2.0 блокировки не работает

Эта строка UserManager.IsLockedOut(user.Id); всегда возвращает false вместо true.

Возможно, необходимо поставить эту строку UserManager.UserLockoutEnabledByDefault = true; на этапе регистрации пользователя?

using (var _db = new ApplicationDbContext()) 
{ 
    UserStore<DALApplicationUser> UserStore = new UserStore<DALApplicationUser>(_db); 
    UserManager<DALApplicationUser> UserManager = new UserManager<DALApplicationUser>(UserStore); 
    UserManager.UserLockoutEnabledByDefault = true; 
    DALApplicationUser user = _userService.GetUserByProfileId(id); 
    bool a = UserManager.IsLockedOut(user.Id); 
    UserManager.SetLockoutEnabled(user.Id, true); 

    a = UserManager.IsLockedOut(user.Id); 
    _db.SaveChanges(); 
} 

ответ

14

Линия

UserManager.SetLockoutEnabled(user.Id, true); 

не блокировки или разблокировки учетной записи. Этот метод используется для постоянного включения или отключения блокировки процесса для данной учетной записи пользователя. Как бы то ни было, вы делаете вызов, который в основном устанавливает эту учетную запись пользователя, чтобы быть связанной правилами блокировки аккаунта. Выполнение вызова с помощью второго параметра, как false т.е.

UserManager.SetLockoutEnabled(user.Id, false); 

позволит вам настроить учетную запись пользователя, которая освобождается от правил блокировки - это может быть полезно для учетной записи администратора.

Вот код для UserManager.IsLockedOutAsync:

/// <summary> 
///  Returns true if the user is locked out 
/// </summary> 
/// <param name="userId"></param> 
/// <returns></returns> 
public virtual async Task<bool> IsLockedOutAsync(TKey userId) 
{ 
    ThrowIfDisposed(); 
    var store = GetUserLockoutStore(); 
    var user = await FindByIdAsync(userId).WithCurrentCulture(); 
    if (user == null) 
    { 
     throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, Resources.UserIdNotFound, 
      userId)); 
    } 
    if (!await store.GetLockoutEnabledAsync(user).WithCurrentCulture()) 
    { 
     return false; 
    } 
    var lockoutTime = await store.GetLockoutEndDateAsync(user).WithCurrentCulture(); 
    return lockoutTime >= DateTimeOffset.UtcNow; 
} 

Как вы можете видеть, для пользователя классифицироваться как заблокированный, блокировка должна быть включена, как описано выше, и пользователь должен иметь значение LockoutEndDateUtc, которое больше или равно текущей дате.

Таким образом, чтобы «навсегда» заблокировать учетную запись, вы можете сделать следующее:

using (var _db = new ApplicationDbContext()) 
{ 
    UserStore<DALApplicationUser> UserStore = new UserStore<DALApplicationUser>(_db); 
    UserManager<DALApplicationUser> UserManager = new UserManager<DALApplicationUser>(UserStore); 
    UserManager.UserLockoutEnabledByDefault = true; 
    DALApplicationUser user = _userService.GetUserByProfileId(id); 

    bool a = UserManager.IsLockedOut(user.Id); 

    //user.LockoutEndDateUtc = DateTime.MaxValue; //.NET 4.5+ 
    user.LockoutEndDateUtc = new DateTime(9999, 12, 30); 
    _db.SaveChanges(); 

    a = UserManager.IsLockedOut(user.Id); 
} 
8

Функция SetLockoutEnabled не заблокирует пользователя, он включает функцию блокировки для пользователя

вам нужно

UserManager.DefaultAccountLockoutTimeSpan = TimeSpan.FromHours(1); // lockout for 1 hour 
UserManager.MaxFailedAccessAttemptsBeforeLockout = 5; // max fail attemps 
UserManager.AccessFailedAsync(user.Id); // Register failed access 

Он запишет неудачу, и заблокирует пользователя если включена блокировка и достигнута ошибка.

5

Установите значение shouldLockout к истинным в вашем Вход действия (это ложь по умолчанию)

  // To enable password failures to trigger account lockout, change to shouldLockout: true 
      var result = await SignInManager.PasswordSignInAsync(vm.Email, vm.Password, vm.RememberMe, shouldLockout: true); 
Смежные вопросы