ASP.Net Identity 2.0 AccessFailedCount不递增

Sam*_*Sam 16 c# asp.net authentication asp.net-mvc asp.net-identity

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

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

然而,我注意到,失败的登录尝试不递增AccessFailedCount领域AspNetUsers表.由于这不会增加,我可以尝试尽可能多的失败登录尝试,而不会让帐户被锁定.

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

mez*_*tou 25

您必须手动处理此问题.该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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,我希望这不是一个手动过程.由于所有分散的配置,泄漏的抽象以及您必须手动实现的内容,我很难看到旧的FormsAuthentication系统上ASP.net身份的价值(除非您使用外部身份验证提供程序). (10认同)
  • 版本2.1中的SignInManager将提供更高级别的PasswordSignIn API,隐藏了锁定/ twofactor等许多复杂性. (7认同)
  • 确实,正如@HaoKung所说,在我刚刚开始一个新项目的v2.2.1中,有一行`var result = await SignInManager.PasswordSignInAsync(model.UserName,model.Password,model.RememberMe,shouldLockout:false); `只是将'false`改为`true`,对于那些像我一样降落在这里并需要它的人. (3认同)

Fre*_*son 14

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

var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: true);
Run Code Online (Sandbox Code Playgroud)

  • 如果用户成功登录,您似乎仍需要调用ResetAccessFailedCountAsync()。不知道为什么该代码不在默认项目模板中。 (2认同)

Ste*_*nJM 7

对于 .NET Core 2.1,shouldLockout现在被命名为lockoutOnFailure

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

var result = await SignInManager.PasswordSignInAsync(loginModel.Email, loginModel.Password, loginModel.RememberMe, lockoutOnFailure: true);
Run Code Online (Sandbox Code Playgroud)

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