2014-06-13 42 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()。不知道为什么该代码不在默认项目模板中。 –