C# PasswordSignInAsync()和MaxFailedAccessAttempts究竟如何连接?

C# PasswordSignInAsync()和MaxFailedAccessAttempts究竟如何连接?,c#,asp.net-core,asp.net-core-identity,C#,Asp.net Core,Asp.net Core Identity,因此,该方法有最后一个参数lockoutOnFailure,如果为true,则在用户输入错误凭据时锁定用户。但是已经有一个名为的属性,它在(默认情况下)5次成功事件之后锁定用户 我在这里有点困惑,并且找不到这个方法如何准确地基于第四个参数工作的答案。如果已经为何时锁定设置了选项,为什么我们需要设置lockoutOnFailure?我不想把它设为真 我如何理解它的工作原理: 如果lockoutOnFailure:true,则即使是用户首次尝试登录,如果他们输入了错误的凭据,也会被锁定。如果lock

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

我在这里有点困惑,并且找不到这个方法如何准确地基于第四个参数工作的答案。如果已经为何时锁定设置了选项,为什么我们需要设置lockoutOnFailure?我不想把它设为真

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


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

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

哪一个

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);
    }
}
这意味着,
MaxFailedAccessAttempts
可以全局设置,但除非使用
lockoutOnFailure
调用登录方法,否则不会对其进行检查

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

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

lockoutOnFailure
参数是启用机制。
PasswordSignInAsync
的文档清楚地说明了这一点

指示在登录失败时是否应锁定用户帐户的标志

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

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

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