在C#中调用MySql函数以验证用户名和密码

时间:2014-01-23 16:58:42

标签: c# mysql function login

开发环境: 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#时失败。我也试过访问参数,我在失败后注释掉了......我做错了什么?

艾哈迈德

1 个答案:

答案 0 :(得分:0)

代码有多个问题。

首先也是最重要的一点:最好使用散列函数存储密码而不是可逆加密方法,否则你将失去加密它们的好处。我不打算深入解释这个问题,因为它已被广泛讨论,即使在stackoverflow上也是如此。做一些研究。

其次,“ExecuteNonQuery”不会返回查询输出。它与INSERT和UPDATE查询一起使用。您需要使用“ExecuteReader”,然后使用返回的对象来提取行数据。

最后,你的“oCn.Close();”永远不会被执行,因为在该行之前有一个“返回”(很明显,这不是问题,但是嘿!)。

现在,由于您需要第一行的第一个值,因此有一个更适合您需求的函数:ExecuteScalar。您可以在MSDN上找到有关它的更多信息。