【问题标题】:asp.net Authentication access failed resetting by itselfasp.net 身份验证访问失败自行重置
【发布时间】:2018-10-15 00:36:36
【问题描述】:

我有一个使用 asp.net 身份验证功能的登录名,如果用户多次输入错误的密码,则会将用户锁定在系统之外。

当用户输入错误的密码时,[AccessFailedCount] 字段按预期每次递增 1(在 dbo.AspNetUsers 表中)。

但是,在他们最后一次尝试(比如第 5 次)时,在错误消息显示在屏幕上以向用户显示他们已被锁定之前,[AccessFailedCount] 重置回 0,这使我无法看到该用户多少次帐号登录失败。

被命中的代码块如下:

        var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, true);
        switch (result)
        {
            case SignInStatus.Success:
                return RedirectToLocal(returnUrl);
            case SignInStatus.LockedOut:
                var lockoutMessage = WebConfigurationManager.AppSettings["LockoutMessage"];
                ModelState.AddModelError("", lockoutMessage);
                return View(model);
            case SignInStatus.RequiresVerification:
                return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
            case SignInStatus.Failure:
            default:
                ModelState.AddModelError("", "Please check your credentials and try again.");
                // Incorrect login info.
                return View(model);
        }

当用户输入错误的密码时,“Failure”案例被命中 4 次,然后“LockedOut”案例被命中,[AccessFailedCount] 被重置为 0。

这似乎发生在 PasswordSignInAsync 方法的某个地方,因为在遇到案例之前计数已经设置为 0。

有没有办法(完全)防止这种行为发生?我会怀疑如果有的话,[AccessFailedCount] 字段只有在用户成功登录时才应重置,但即使用户收到错误消息说他们在设定的时间段内无法登录,它也会重置。

它看起来像是 asp.net 身份验证功能的内置功能,但我不确定如何防止 [AccessFailedCount] 字段被重置。

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-identity


    【解决方案1】:

    当我开始阅读您的问题时,我的猜测是,当用户输入错误的密码时,“AccessFailedCount”会增加 1,直到达到特定阈值(例如 5)。达到阈值时它会返回 0,重置,然后账号真的被锁了。

    锁定是通过更改 LockoutEndDateUtc 来实现的。我建议检查阈值的 exat 值。还要留意 LockoutEndDateUtc 和 LockoutEnabled 字段。

    【讨论】:

    • 哦,对了,这很有趣。我还没有在任何地方读到 AccessFailedCount 的逻辑是如何工作的,所以如果是这样的话,它看起来就像是设计使然。我想这意味着除非您将阈值设置为 1000 左右,否则您无法真正了解用户登录失败的次数,并且您无法真正看到帐户登录失败的次数使用任何外部方法?
    • @intrepidexplorer 据我所知你是正确的。但这只是一个猜测。应该有人提供失败计数机制的参考。
    【解决方案2】:

    AccessFailed 在设计的“失败”周期结束时重置为 0

    一旦达到最大尝试次数,AccessFailed 将重置为 0 并再次设置 LockoutEndDateUtc。您只能访问每个 fail 周期内的失败尝试次数。

    【讨论】:

      猜你喜欢
      • 2015-07-04
      • 1970-01-01
      • 1970-01-01
      • 2021-06-19
      • 2010-12-25
      • 2020-01-17
      • 1970-01-01
      • 1970-01-01
      • 2014-01-24
      相关资源
      最近更新 更多