ASP.Net Identity 2.0 AccessFailedCount不递增

时间:2014-06-13 14:12:12

标签: c# asp.net asp.net-mvc authentication asp.net-identity

昨晚,我正在使用FormsAuthentication开发一个新项目,并且正在自定义故障单以包含安全令牌,因此如果用户在一个浏览器中注销,则会在所有这些项目中注销。在查看ASP.net Identity的最新版本时,看起来它已经内置了这个功能。

我创建了一个新的测试MVC 5 Web应用程序,启用了个人帐户。注册和身份验证开箱即用。

但是,我注意到失败的登录尝试没有增加 AspNetUsers 表中的 AccessFailedCount 字段。由于这不会增加,我可以尝试尽可能多的失败登录尝试,而不会将帐户锁定。

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

3 个答案:

答案 0 :(得分:22)

您必须手动处理此问题。 CheckPassword方法调用PasswordHasher.VerifyHashedPassword方法来验证密码,但是当提供的密码与现有密码不匹配时,它不会更新访问失败计数。

以下是支持锁定的身份验证方法示例:

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

答案 1 :(得分:11)

还有PasswordSignInAsync接受“shouldLockout”参数。将此设置为true将自动增加失败的登录尝试次数

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

答案 2 :(得分:0)

对于.NET Core 2.1,应该锁定现在被命名为 lockoutOnFailure

因此,您的登录呼叫应如下所示,以增加失败的登录尝试次数:

var result = await SignInManager.PasswordSignInAsync(loginModel.Email, loginModel.Password, loginModel.RememberMe, lockoutOnFailure: true);

一旦用户成功登录,这还将重置失败的登录尝试