读书人

c#制作的口令登陆界面 如何实现只给三

发布时间: 2013-04-02 12:35:26 作者: rapoo

c#制作的口令登陆界面 怎么实现只给三次机会
Password frmPassword = new Password();
DialogResult dr = frmPassword.ShowDialog();
if (dr == DialogResult.Cancel)
Application.Exit();
else
{
SqlConnection oledbConn = new SqlConnection();//连接数据库
oledbConn.ConnectionString = @"Data Source=O8RS63RAGSIE4AR;Initial Catalog=hrone;Integrated Security=True";
oledbConn.Open();//打开数据库连接
SqlCommand oledbCmd = new SqlCommand();
oledbCmd.Connection = oledbConn;
oledbCmd.CommandText = @"SELECT 0 FROM test WHERE username = @u1;
SELECT 0 FROM test WHERE username = @u2 AND password = @p1; SELECT isnull(lockcnt, 0) lockcnt FROM test WHERE username = @u3 AND password = @p2 AND isnull(lockcnt, 0) < 3";
oledbCmd.Parameters.Clear();//
SetParam(oledbCmd, "@u1", frmPassword.TxtUserName.Text);
SetParam(oledbCmd, "@u2", frmPassword.TxtUserName.Text);
SetParam(oledbCmd, "@p1", frmPassword.TxtPassword.Text);
SetParam(oledbCmd, "@u3", frmPassword.TxtUserName.Text);
SetParam(oledbCmd, "@p2", frmPassword.TxtPassword.Text);


SqlDataReader oledbReader = oledbCmd.ExecuteReader();//从数据库读取行


if (oledbReader.HasRows)//判断数据集是否为空
{
oledbReader.NextResult();
if (oledbReader.HasRows)


{
oledbReader.NextResult();
if (oledbReader.HasRows)
{

Application.Run(new MainForm());
}
else

MessageBox.Show("对不起,您的账号已被锁定,请与管理人员联系");


}
else
MessageBox.Show("请输入正确的口令");
}
else
MessageBox.Show("用户账号不存在");

}
}

static void SetParam(SqlCommand cmd, string pn, object val)
{
SqlParameter param = new SqlParameter();


param.ParameterName = pn;
param.Value = val;
cmd.Parameters.Add(param);
}
[解决办法]
楼上的存在一个问题,就是用户输错三次后,关闭画面,再次打开尝试密码。。。
要从根本上解决问题,就是要在用户表中加两个字段来保存用户的信息:
1.是否锁定 INT
3.错误次数 INT
用户登录逻辑:
if 已锁定,直接返回;
else if 输错密码,判断次数,到达3次就锁定;
else 返回成功;
当然,还要加一些解锁功能了。。
再复杂一点,可以设定暂时锁定和永久锁定,如10分钟内错误3次会暂时锁定,持续30分钟后解锁;24小时内如果累计超过10次,则永久锁定。这样的话,需要再加几个记录错误时间和监控起始时间。

读书人网 >C#

热点推荐