2014-06-13 41 views
10

昨晚我正在使用FormsAuthentication創建一個新項目,並且正在自定義包含安全令牌的票據,所以如果用戶在一個瀏覽器中註銷,它將在所有這些註銷中註銷。在查看ASP.net Identity的最新版本時,它看起來已經內置了此功能。ASP.Net Identity 2.0 AccessFailedCount不會遞增

我創建了一個新的測試MVC 5 Web應用程序,並啓用了個人帳戶。開箱即用的註冊和認證工作。

然而,我注意到,失敗的登錄嘗試沒有在AspNetUsers表遞增AccessFailedCount場。而且由於這並沒有增加,我可以嘗試儘可能多的失敗登錄嘗試,因爲我沒有將帳戶鎖定。

如何在ASP.net Identity 2.0上啓用AccessFailedCount和Lockout功能?

回答

15

你必須手動處理。 CheckPassword方法調用PasswordHasher.VerifyHashedPassword方法驗證密碼,但當提供的密碼與現有密碼不匹配時,它不會更新訪問失敗計數。

下面是支持鎖定的authenticate方法的一個示例:

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

謝謝,我希望這不是一個手動過程。由於所有零散配置,漏洞抽象以及必須手動實現的內容,我很難看到ASP.net Identity的價值超過舊版FormsAuthentication系統(除非您正在使用外部auth提供商)。 – Sam

+5

版本2.1中的SignInManager是什麼將提供一個更高級別的PasswordSignIn API,它隱藏了大量的鎖定/雙因子等複雜性。 –

+1

@HaoKung在v2.2.1中說過,我剛剛開始一個新項目,有這樣一行'var result = await SignInManager.PasswordSignInAsync(model.UserName,model.Password,model.RememberMe,shouldLockout:false);'只要將'false'改爲'true',對於那些像我一樣登陸這裏的人來說,需要這個。 – RoLYroLLs

6

還有它接受一個「shouldLockout」參數的PasswordSignInAsync。設置爲true會自動遞增失敗的登錄嘗試

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

如果用戶成功登錄,您似乎仍需要調用ResetAccessFailedCountAsync()。不知道爲什麼該代碼不在默認項目模板中。 –