开发环境: Microsoft Visual Studio 2010 Ultimate, C#, MySQL的
嗨,我在mysql中创建了一个函数,它接受3个参数来验证用户名和密码。
DELIMITER $$
USE `generalledger`$$
DROP FUNCTION IF EXISTS `fLogin_Check`$$
CREATE DEFINER=`root`@`localhost`
FUNCTION `fLogin_Check`
(mUserName VARCHAR(50),mUserPass VARCHAR(40),mUserKey VARCHAR(40)) RETURNS INT
BEGIN
DECLARE mCount INT;
SELECT COUNT(*) INTO mCount FROM userMaster
WHERE userName = mUserName
AND AES_DECRYPT(userPass, mUserKey) = UPPER( mUserPass);
IF mCount > 0 THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END$$
DELIMITER ;
正如您所看到的,我正在使用MySql的AES_DECRYPT函数来检查密码,因为我在INSERT用户名和密码到mysql表时使用了AES_ENCRYPT作为密码。
现在我需要在C#中调用函数fLogin_Check,我正在使用以下类方法来完成:
public int CheckUser(string mUserName, string mPass, string mKey)
{
oCn = da.GetConnection();
int res;
if (oCn == null)
{
oCn.Open();
}
sInsProcName = "fLogin_Check";
insertcommand = new MySqlCommand(sInsProcName, oCn);
insertcommand.CommandType = CommandType.StoredProcedure;
insertcommand.Parameters.Add(new MySqlParameter("mRes", MySqlDbType.Int32, 0));
insertcommand.Parameters["mRes"].Direction = ParameterDirection.ReturnValue;
insertcommand.Parameters.Add("mUserName", MySqlDbType.VarChar, 50, mUserName);
insertcommand.Parameters.Add("mUserPass", MySqlDbType.VarChar, 40, mPass);
insertcommand.Parameters.Add("mUserKey", MySqlDbType.VarChar, 40);
insertcommand.Parameters["mUserKey"].Value = mKey;
res = insertcommand.ExecuteNonQuery();
//res = int.Parse(insertcommand.Parameters["mRes"].Value.ToString());
return (res);
oCn.Close();
}
oCn是连接abject,用于在我的DAL类中调用GetConnection方法定义,da是从DAL类创建的对象,用于打开和关闭数据库连接。
使用以下Global类我在用户输入后存储用户名和密码,然后尝试使用fLogic_Check Mysql函数进行验证:
public static class Globals
{
public static string userName;
public static string userPass;
public const string sKey = "AHMEDFINANCEICMAP1122";
}
sKey是我在插入用户名时用来加密密码的密钥。现在,当用户输入用户名和密码并点击登录按钮时,我尝试在登录表单的C#中使用它,并使用以下代码:
private void btnCheck_Click(object sender, EventArgs e)
{
Globals.userName = txtUser.Text.ToString();
Globals.userPass = txtPass.Text.ToString();
if (fUser.CheckUser(Globals.userName, Globals.userPass, Globals.sKey) == 0)
{
MessageBox.Show("Invalid Username or Password.");
}
else
{
MessageBox.Show("Login Successfull");
}
}
始终返回0,表示登录失败。我已经检查了MySql GUI中的Mysql函数,它运行正常:
SELECT fLogin_Check("AHMED","AHMED1981","AHMEDFINANCEICMAP1122") FROM userMaster
成功返回1,但在调用C#时失败。我也试过访问参数,我在失败后注释掉了......我做错了什么?
艾哈迈德
答案 0 :(得分:0)
代码有多个问题。
首先也是最重要的一点:最好使用散列函数存储密码而不是可逆加密方法,否则你将失去加密它们的好处。我不打算深入解释这个问题,因为它已被广泛讨论,即使在stackoverflow上也是如此。做一些研究。
其次,“ExecuteNonQuery”不会返回查询输出。它与INSERT和UPDATE查询一起使用。您需要使用“ExecuteReader”,然后使用返回的对象来提取行数据。
最后,你的“oCn.Close();”永远不会被执行,因为在该行之前有一个“返回”(很明显,这不是问题,但是嘿!)。
现在,由于您需要第一行的第一个值,因此有一个更适合您需求的函数:ExecuteScalar。您可以在MSDN上找到有关它的更多信息。