2016-06-28 150 views
5

ASP.Net Core具有处理用户身份验证的SignInManager。其中一种方法是PasswordSignInAsync(string username, string password, bool isPersistent, bool lockoutOnFailure)。将lockoutOnFailure设置为true应该在一定次数的登录失败尝试后临时锁定用户。ASP.Net Core SignInManager锁定失败

在数据库我看到以下综观AspNetUsers表:对于每个

  • AccessFailedCount增加1失败访问,当它击中5它翻转到0。
  • 一旦翻转至0 LockoutTimeEnd设置为未来5分钟。然而
  • LockoutEnabled甚至侧翻后依然为0,并且用户可以继续尝试登录。

它看起来像预期的功能是允许5次登录尝试,然后锁定帐户5分钟。

所以我的问题是有:

  1. 如何设置允许登录失败次数?
  2. 如何设置锁定期限?
  3. 为什么不锁定触发器?
+0

关于你的第三个bulltet,它适用于默认的项目模板,所以你必须分享一些代码,寻求帮助 – tmg

+0

我发现了这个。无论“LockoutTimeEnd”如何,任何使用“LockoutEnabled = false”的用户都不会被锁定。只有当LockoutTimeEnd> DateTime.Now时,具有“LockoutEnabled = true”的用户才会被锁定。我已将所有用户设置为“LockoutEnabled = false”,有效地禁用了整个锁定机制。 –

+1

你是如何设定的?在注册操作中创建用户时? – tmg

回答

7
  1. 如何设置允许登录失败次数?
  2. 如何设置锁定期限?

默认的项目模板使用配置的身份服务AddIdentity<TUser, TRole>(在StartupConfigureServices法)的扩展方法。这种方法有一个过载,您可以配置IdentityOptions

而不是

services.AddIdentity<ApplicationUser, IdentityRole>() 
    .AddEntityFrameworkStores<ApplicationDbContext>() 
    .AddDefaultTokenProviders(); 

您可以使用

var lockoutOptions = new LockoutOptions() 
{ 
    AllowedForNewUsers = true, 
    DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5), 
    MaxFailedAccessAttempts = 5 
}; 

services.AddIdentity<ApplicationUser, IdentityRole>(options => 
    { 
     options.Lockout = lockoutOptions; 
    }) 
    .AddEntityFrameworkStores<ApplicationDbContext>() 
    .AddDefaultTokenProviders(); 

以上是pointeless,因为这些都是LockoutOptions默认值,但是你可以随意改变他们。