登录功能快速参考¶
权威文档¶
📖 memory/login_design_final.md - 唯一真实来源
核心设计¶
验证码显示¶
| 场景 | 显示验证码 |
|---|---|
| 密码登录失败 1 次 | ✅ 是 |
| 密码登录失败 2-4 次 | ✅ 是 |
| 密码登录失败 5 次 | ✅ 是(锁定) |
| 短信登录 | ✅ 总是 |
失败次数计数¶
- 标识: Phone + IP
- 跨设备: 独立计算
- 场景: 用户在家失败 5 次被锁定,在公司仍可登录
账户锁定¶
- 触发: 连续失败 5 次
- 时间: 15 分钟
- 范围: 整个账户
代码位置¶
后端¶
Controllers/AccountController.cs- 登录逻辑Services/LoginAttemptService.cs- 失败次数管理
前端¶
Views/Account/Login.cshtml- 登录页面
关键方法¶
C#
// 获取客户端 IP
var ip = GetClientIp();
// 检查账户是否被锁定
var (isLocked, remainingMinutes) = _loginAttemptService.IsAccountLocked(phone, ip);
// 记录登录失败
var (failedCount, isNowLocked) = _loginAttemptService.RecordFailedAttempt(phone, ip);
// 获取失败次数
var failedCount = _loginAttemptService.GetFailedAttempts(phone, ip);
// 清除失败记录
_loginAttemptService.ClearFailedAttempts(phone, ip);
测试清单¶
密码登录¶
- 首次登录成功
- 失败 1 次后显示验证码
- 失败 2-4 次显示剩余尝试次数
- 失败 5 次账户锁定
- 同一账户不同 IP 的失败次数独立计算
- 登录成功后清除所有登录数据
短信登录¶
- 显示验证码(图形 + 滑块)
- 短信验证码失败 1-4 次显示剩余尝试次数
- 短信验证码失败 5 次禁用"获取验证码"按钮
- 旧验证码未失效时不允许重发
- 登录成功后清除所有登录数据
常见问题¶
Q: 为什么要基于 Phone + IP?¶
A: 防止跨 IP 的分布式暴力破解,同时允许用户在不同地点登录。
Q: 为什么验证码显示时机改为失败 1 次后?¶
A: 提高安全性,更早地启动防护机制。
Q: 如何处理用户在不同设备登录?¶
A: 失败次数基于 Phone + IP 独立计算,不同设备的失败次数不会相互影响。
文档管理¶
权威文档¶
- ✅
memory/login_design_final.md
过期文档(已标注警告)¶
- ⚠️ LOGIN_FAILURE_HANDLING_GUIDE.md
- ⚠️ PASSWORD_LOGIN_CAPTCHA_GUIDE.md
- ⚠️ SECURITY_FIXES_PASSWORD_LOGIN.md
- ⚠️ SMS_PROTECTION_GUIDE.md
管理方案¶
- 📋
memory/DOCUMENTATION_MANAGEMENT.md - 📋
DOCUMENTATION_MANAGEMENT_SUMMARY.md
更新流程¶
Text Only
功能变更
↓
更新 memory/login_design_final.md
↓
更新代码实现
↓
更新 CLAUDE.md 中的相关说明
↓
标注其他文档为"已过期"
↓
提交 git commit(引用文档)
编译状态¶
✅ 编译通过,无错误无警告
最后更新¶
📅 2026-03-15 👤 Claude