跳转至

登录功能快速参考

权威文档

📖 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