C#实现登录失败5次后锁定账户30分钟的技术咨询
实现C#登录失败5次后锁定账户30分钟的功能
看起来你已经有了基础的登录尝试计数逻辑,但要实现失败5次后锁定30分钟的功能,我们需要补充锁定时间跟踪的逻辑,同时修正原代码里的几个小问题。下面是完整的修改方案:
首先先指出你当前代码的两处小问题:
- 循环最多允许5次尝试,但最后判断的是
InvalidLoginAttempts > 5,这永远不会触发(最多失败5次),应该改成InvalidLoginAttempts >= 5 - 目前的失败次数是临时变量,程序重启后就会重置,实际场景中你可能需要把这个数据存在数据库或者本地存储里,这里先用静态变量模拟持久化效果
下面是修改后的完整代码,包含完整的锁定逻辑:
using System; class LoginSystem { // 静态变量模拟持久化的失败次数和锁定到期时间(实际项目建议存在数据库) private static int _invalidLoginAttempts = 0; private static DateTime _lockoutEndTime = DateTime.MinValue; static void Main(string[] args) { while (true) { // 先检查是否处于锁定状态 if (DateTime.Now < _lockoutEndTime) { TimeSpan remainingLockTime = _lockoutEndTime - DateTime.Now; Console.WriteLine($"账户已锁定,请等待 {remainingLockTime.Minutes} 分钟 {remainingLockTime.Seconds} 秒后重试"); Console.ReadKey(); return; } Console.WriteLine("Enter username"); string username = Console.ReadLine(); Console.WriteLine("Enter password"); string password = Console.ReadLine(); if (username == "valid" && password == "valid") { // 登录成功,重置失败次数和锁定时间 _invalidLoginAttempts = 0; _lockoutEndTime = DateTime.MinValue; Console.WriteLine("Login successful"); break; } else { _invalidLoginAttempts++; Console.WriteLine($"登录失败,剩余尝试次数:{5 - _invalidLoginAttempts}"); // 失败次数达到5次,触发锁定 if (_invalidLoginAttempts >= 5) { _lockoutEndTime = DateTime.Now.AddMinutes(30); Console.WriteLine("登录失败次数过多,账户已锁定30分钟"); Console.ReadKey(); return; } } } Console.ReadKey(); } }
关键逻辑说明:
- 锁定状态前置检查:每次进入登录流程前,先判断当前时间是否早于锁定到期时间,如果是则提示剩余锁定时间并终止登录流程
- 失败次数跟踪:用静态变量
_invalidLoginAttempts累计失败次数,登录成功时立即重置为0,清除锁定标记 - 锁定触发逻辑:当失败次数达到5次时,设置
_lockoutEndTime为当前时间加30分钟,之后的所有登录尝试都会被拦截直到锁定时间结束 - 实际场景优化建议:如果是生产环境,不要用静态变量存储这些数据,应该把失败次数和锁定时间绑定到用户的数据库记录里,这样即使程序重启或者多实例部署,锁定逻辑依然稳定有效
内容的提问来源于stack exchange,提问作者Matteo
相关产品推荐
相关产品推荐

