You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#多用户登录密码验证及登录尝试次数限制实现问题

问题修复方案
  • 首先解决登录次数不累计的核心问题:你当前把attempt变量定义在buttonLogin_Click方法内部,每次点击登录按钮都会重新初始化为1,永远无法累计到触发限制的阈值。需要把这个变量挪到窗体类的全局作用域,作为类成员变量。
  • 调整计数逻辑:只有登录失败的时候才累加尝试次数,登录成功后可以把次数重置为初始值避免后续误触发限制。
  • 补充资源释放逻辑:数据库连接、MySqlCommand等对象用完需要及时释放,避免资源泄漏。
  • 额外优化建议:不要在数据库中明文存储用户密码,建议使用加盐哈希算法存储密码哈希值,校验时对比哈希值即可。
// 把attempt定义为窗体类的成员变量,放在所有方法外部
private int attempt = 1;

private void buttonLogin_Click(object sender, EventArgs e)
{
    if (attempt < 4)
    {
        using (MyDB db = new MyDB())
        {
            DataTable table = new DataTable();
            using (MySqlCommand command = new MySqlCommand("SELECT * FROM `users` WHERE `username` = @usn AND `password` = @pas", db.getConnection))
            {
                command.Parameters.Add("@usn", MySqlDbType.VarChar).Value = textUsername.Text.Trim();
                command.Parameters.Add("@pas", MySqlDbType.VarChar).Value = textBoxPass.Text;
                
                using (MySqlDataAdapter adapter = new MySqlDataAdapter(command))
                {
                    adapter.Fill(table);
                }
            }

            if (table.Rows.Count > 0)
            {
                // 登录成功重置尝试次数
                attempt = 1;
                string userType = table.Rows[0]["type"]?.ToString() ?? "";
                switch (userType)
                {
                    case "student":
                        this.Hide();
                        new StudentMain().Show();
                        break;
                    case "faculty":
                        this.Hide();
                        new FacultyMain().Show();
                        break;
                    case "admin":
                        this.Hide();
                        new AdminMain().Show();
                        break;
                    default:
                        MessageBox.Show("未知的用户类型", "登录错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        break;
                }
            }
            else
            {
                MessageBox.Show("无效的用户名或密码", $"尝试次数:{attempt}", MessageBoxButtons.OK, MessageBoxIcon.Error);
                // 只有登录失败才累加次数
                attempt++;
            }
        }
    }
    else
    {
        MessageBox.Show("登录尝试次数已超限");
        textUsername.Enabled = false;
        textBoxPass.Enabled = false;
        // 不需要直接关闭窗体可以注释掉下面这行
        this.Close();
    }
}

内容的提问来源于stack exchange,提问作者Char

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 19:24:00