ASP.Net Identity 2.0 AccessFailedCount not incrementing



昨晚我在一个使用FormsAuthentication的新项目上工作,并自定义票证以包含安全令牌,因此如果用户在一个浏览器中注销,它将在所有浏览器中注销。从最新版本的ASP.net Identity来看,它似乎已经内置了这个功能。

我创建了一个新的测试MVC 5 web应用程序,启用了个人帐户。注册和认证工作开箱即用。

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

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

您必须手动处理。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);
    }
}

PasswordSignInAsync也接受一个" shouldlock "参数。将此设置为true将自动增加登录失败次数

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

对于。net Core 2.1 shouldlock 现在被命名为lockoutOnFailure

所以你的login调用应该像这样增加失败的登录尝试:

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

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

相关内容

  • 没有找到相关文章

最新更新