PasswordSignInAsync() 和 MaxFailedAccessAttempts 究竟是如何连接的?

iSp*_*n17 3 c# asp.net-core asp.net-core-identity

因此,该方法SignInManager.PasswordSignInAsync有一个最后一个参数lockoutOnFailure,如果该参数为真,则会在用户输入错误凭据时锁定用户。但是已经有一个名为的属性MaxFailedAccessAttempts,它在(默认情况下)5 个成功事件之后锁定用户。

我在这里有些困惑,无法根据第 4 个参数找到此方法如何工作的答案。如果已经设置了何时锁定的选项,为什么我们需要设置 lockoutOnFailure?我不想将其设置为 true。

我如何理解它的工作原理:

如果lockoutOnFailure: true,那么即使这是用户第一次尝试登录,如果他们输入错误的凭据,他们也会被锁定。如果lockoutOnFailure: false,那么即使这是他们的第 5 次尝试,如果他们输入了错误的凭据,他们也不会被锁定。我不希望这两种情况都发生,所以我不想将它设置为任何一个值。我该怎么办?还是我理解的方法不对?

Tse*_*eng 5

ASP.NET Core Identity 是开源的,这意味着您可以轻松查看代码。PasswordSignInAsync 最终调用CheckPasswordSignInAsync方法。

哪个

if (UserManager.SupportsUserLockout && lockoutOnFailure)
{
    // If lockout is requested, increment access failed count which might lock out the user
    await UserManager.AccessFailedAsync(user);
    if (await UserManager.IsLockedOutAsync(user))
    {
        return await LockedOut(user);
    }
}
Run Code Online (Sandbox Code Playgroud)

这意味着,MaxFailedAccessAttempts可能会全局设置,但除非使用lockoutOnFailure.

文档已经注意到这一点,但它的措辞有点奇怪:

获取或设置在用户被锁定之前允许的失败访问尝试次数(假设已启用锁定)。默认为 5。

lockoutOnFailure参数是使能机制。其中的文档PasswordSignInAsync清楚。

指示如果登录失败是否应锁定用户帐户的标志。

如果该标志设置为false,则失败的尝试不会增加失败的登录计数器。

但是,一旦帐户被锁定,即使设置为false ,PasswordSignInAsync也会返回LockedOut结果lockedOnFailure。此参数仅确定计数器是否会在失败时增加(并且一旦超过将帐户标记为锁定)。

  • 这就是令人困惑的地方。*“指示如果登录失败是否应锁定用户帐户的标志”* 和 *“指示如果登录失败则 FailedAccessAttempts 计数将增加的标志”* 不是同一回事。对我来说,第一个意味着它不会关心计数,如果失败它就会锁定,即使是第五次尝试。对我来说,第二个意味着它将使用一般机制(计算失败的次数)。但事实证明,第二个是正确的。谢谢你! (2认同)