我正在尝试解决此业务问题:
>用户每5分钟尝试登录10次
>如果用户超过10次尝试,我会显示“您需要等待
登录“消息
>一旦经过5分钟,我需要重置尝试次数
并让用户再尝试10次.
我想在不使用Timer的情况下这样做,我将大部分信息存储在Session中
public class LoginExp { public DateTime FirstAttempt; public int NumOfAttempts; }
我将FirstAttempt DateTime存储在页面加载上.
在“登录”按钮上单击:
>我增加了NumOfAttempts
>我需要检查NumOfAttempts< 10在相同的5分钟时间段内.我可以获得FirstAttempt和DateTime.Now之间经过的分钟数并且做5的mod,但是这不会告诉我这个时间段(换句话说,用户可能在第2分钟尝试了3次)然后在第7分钟回来再次尝试.这个mod会给我相同的价值.
有关如何做到这一点的任何想法?
解决方法
您可以存储尝试时间戳列表,并使用它来确定用户是否被锁定.这不是完整的代码,但这是基本的想法:
// Store a list of attempts var attempts = new List<DateTime>(); // Determine if 10 or more attempts have been made in the last 5 minutes bool lockout = attempts.Where(a => (DateTime.Now - a).TotalMinutes <= 5).Count() >= 10; // Register an attempt attempts.Add(DateTime.Now); // Remove attempts older than 5 minutes attempts.Where(a => (DateTime.Now - a).TotalMinutes > 5).ToList() .ForEach(a => attempts.Remove(a));