簡體   English   中英

MVC 5 Identity 2.0鎖定不起作用

[英]MVC 5 Identity 2.0 lockout doesn't work

我需要永久阻止用戶。 我不明白為什么這段代碼不起作用。

這行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();
}

這條線

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);
}

函數SetLockoutEnabled不會鎖定用戶,它會為用戶啟用鎖定功能

你需要

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

它將記錄故障,並在啟用鎖定並達到故障計數時鎖定用戶。

在Login操作中將shouldLockout值設置為true(默認情況下為false)

            // 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM