[英]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.