【问题标题】:Account LockOut TimeSpan overflowed帐户锁定时间跨度溢出
【发布时间】:2020-01-13 08:50:02
【问题描述】:

我尝试在 .NET Core Web API 中实现的是防止默认帐户锁定行为。默认情况下,锁定的帐户将在 5 分钟后解锁。在我的系统中,锁定的帐户只能由管理员解锁

startup.cs 中,Identity 服务配置为:

services.AddIdentity<ApplicationUser, IdentityRole>(config =>
    {
        config.Lockout = new LockoutOptions()
        {
            MaxFailedAccessAttempts = 3,
            DefaultLockoutTimeSpan = new TimeSpan(Int32.MaxValue, 0, 0, 0)
        };
    });

所以有一个属性可以设置DefaultLockoutTimeSpan,我尝试使 TimeSpan 尽可能大(它接受 Int32),但它会引发 TimeSpan overflowed because the duration is too long. 异常。

我也尝试了DefaultLockoutTimeSpan = new TimeSpan(-1),但没有成功。

有没有人有防水的方法来防止自动解锁被锁定的帐户(一段时间后)?或者,不太优选,一种使 TimeSpan 尽可能大的方法?

【问题讨论】:

  • 你试过TimeSpan.MaxValue吗?我还添加了一个完全删除此功能的答案
  • 我刚发现,谢谢。

标签: asp.net-core asp.net-web-api asp.net-identity timespan


【解决方案1】:

1.您可以将LockoutEnabled设置为true并设置锁定结束日期,如下所示:

await _userManager.SetLockoutEndDateAsync(user, DateTime.MaxValue);

2.您也可以将 IsEnabled 字段添加到 AspNetUsers(默认值为 True)并覆盖 SignInManager 以在返回成功结果之前检查值是否为 True。

github上的已知讨论可以参考here

【讨论】:

  • 这如何与默认系统在 x 次登录尝试失败后锁定用户相结合?我最好不要在 AspNetUsers 表中添加字段。
  • 它会以默认的身份实现。如果你想知道它是如何融合的。你可以参考源代码:github.com/aspnet/AspNetIdentity
【解决方案2】:

在自定义商店中实现 IUserLockoutStore.GetLockoutEndDateAsync 和可选的 IUserLockoutStore.SetLockoutEndDate

所有锁定检查都是查看锁定是否启用,如果启用,则检查结束日期是否已过。如果您改为从GetLockoutEndDateAsync 返回DateTimeOffset.MaxValue,那么如果设置了标志并且无论LockoutOptions 或数据库中设置了什么,它们将始终被锁定

然后您可以将 Set 方法重写为无操作,并且根本不存储结束日期。

【讨论】:

  • Set 方法的覆盖需要发生什么?将启用锁定设置为 true,否则设置为 false?
  • 什么都不需要发生。只需返回Task.CompletedTask。同一接口的SetLockoutEnabledAsync 方法将单独控制锁定
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
  • 1970-01-01
相关资源
最近更新 更多