验证最大登录尝试次数

时间:2017-12-29 15:30:28

标签: c#

我只是在我的登录过程中添加一个方法,我想给用户5次登录尝试(即密码不正确),然后阻止用户尝试再次登录,比如上次尝试失败30分钟。 (显然他们可能在白天多次登录失败)

所以我创建了一个新的简单表(UserAttempts):

Id
UserId
LoginDateTime

但是我在努力学习如何使用它?

User user = uw.User.FindByUser(userName);

if (user != null)
{
    var loginAttempts = user.UserAttempts.Where(a => a.LoginDateTime.Date == DateTime.Today);
    if (loginAttempts.Any())
    {
        //Logic here to say has the user attempted to login more than 5 times within the last 30 mins?
        //If true return null
        //Else return user.
    }
}

感谢您的帮助

4 个答案:

答案 0 :(得分:3)

您想要查找过去30分钟内的尝试次数;最简单的方法是检查那些尝试时间超过30分钟的人:

.Where(a.LoginDateTime > DateTime.Now.AddMinutes(-30))

然后你想知道计数;并且Count也采用谓词:

if (user.UserAttempts.Count(a.LoginDateTime > DateTime.Now.AddMinutes(-30)) > 5)
{
   //hacker!!!
}

您不希望检查DateDateTime.Today的日期,因为当日期更改允许更多尝试时,您会有一个窗口。它也不会节省任何过滤时间,因为你不得不查看所有日期;也可以与你关心的实际时间进行比较。

虽然您的代码没有反映出来;你还提到“锁定”用户30分钟。要做到这一点,我可能只需设置一个标志,指示锁定状态,并检查自上次尝试以来是否已经过了足够的时间(使用OrderBy上的MaxLoginDateTime

答案 1 :(得分:1)

您可以使用以下内容:

var recentThreshold = DateTime.Now.Subtract(TimeSpan.FromMinutes(30));
int recentAttempts = user.UserAttempts
                         .Count(a => a.CreatedDate > recentThreshold);
if (recentAttempts > 5)
    blockUser();
else
    warnUser();

recentThreshold是"截止点",您之前不感兴趣的事件。我们可以使用Count查找此后发生的登录事件数量阈值。

请注意,我们不会按今天的事件(DateTime.Today)进行过滤,因为您仍然希望了解尝试在23点登录4次的人: 59,然后再次在00:00。

答案 2 :(得分:1)

大多数"计数解决方案"以上将在不到30分钟后再尝试一次。并且你想"锁定账户"在最后一次尝试失败后30分钟?

假设用户尝试登录并失败3次,然后等待15分钟并再次尝试3次失败:然后他/她将不会被锁定30分钟,但只有15分钟(直到第一次) 3次尝试"超时")。

我们需要在最后一次尝试失败后等待30分钟。

var lastFailedAttempt = user.UserAttempts.OrderbyDescending(a => a.CreatedDate).FirstOrDefault();

if (lastFailedAttempt == null || lastFailedAttempt.CreatedDate.AddMinutes(30) < DateTime.Now) //No attempts have been made or the last one was more than 30 minutes ago
  return user;

return user.UserAttempts.Count(a => a.CreatedDate > lastFailedAttempt.CreatedDate.AddMinutes(-30)) <= 5 ? user : null; //Check if there are more than 5 attempts 30 minutes before the last failed

直到没有&#34;延长&#34;如果每29分钟重试一次超时。如果你想这样做,也许更容易保存&#34; LockedOutUntil&#34;数据库中的日期时间。

答案 3 :(得分:-2)

var loginAttempts = user.UserAttempts.Where(a => a.CreatedDate.Date == DateTime.Today);

更改此LINQ-u查询以仅获取最近30分钟的登录尝试,然后对此查询执行count()函数。

我完全不明白你的问题是什么,因为这似乎很容易。