我只是在我的登录过程中添加一个方法,我想给用户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.
}
}
感谢您的帮助
答案 0 :(得分:3)
您想要查找过去30分钟内的尝试次数;最简单的方法是检查那些尝试时间超过30分钟的人:
.Where(a.LoginDateTime > DateTime.Now.AddMinutes(-30))
然后你想知道计数;并且Count
也采用谓词:
if (user.UserAttempts.Count(a.LoginDateTime > DateTime.Now.AddMinutes(-30)) > 5)
{
//hacker!!!
}
您不希望检查Date
为DateTime.Today
的日期,因为当日期更改允许更多尝试时,您会有一个窗口。它也不会节省任何过滤时间,因为你不得不查看所有日期;也可以与你关心的实际时间进行比较。
虽然您的代码没有反映出来;你还提到“锁定”用户30分钟。要做到这一点,我可能只需设置一个标志,指示锁定状态,并检查自上次尝试以来是否已经过了足够的时间(使用OrderBy
上的Max
或LoginDateTime
。
答案 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()函数。
我完全不明白你的问题是什么,因为这似乎很容易。