使用存储过程进行身份验证

本文关键字:身份验证 存储过程 | 更新日期: 2023-09-27 17:50:55

我已经在SQL中编写了一个用于用户身份验证的存储过程,我应该如何在c#中稍后从这个过程中获得返回值。Net代码能让用户登录吗?

create procedure userLogin_proc
@userName nvarchar(45),
@passCode nvarchar(20)
as
begin
select userName,passCode from userLogin where username = @userName and passCode = @passCode
end

使用存储过程进行身份验证

使用输出参数返回用户id,如果登录成功,则返回用户id,否则返回0

create procedure userLogin_proc
@userName nvarchar(45),
@passCode nvarchar(20)
@UserId int=0 OUTPUT
as
begin
select @UserId =id from userLogin where username = @userName and passCode = @passCode
end

, c#端在ExecuteReader:

之后执行此操作
SqlDataReader reader=cmd.ExecuteReader();
int UserId = (int)cmd.Parameters["@UserId"].Value;

你可以在这里阅读更多关于输出参数的信息:

http://www.codeproject.com/Questions/136351/How-to-retrieve-output-parameter-from-Store-proced

将其改为SELECT COUNT(1) FROM userLogin....,然后在SqlDataReader对象上使用ExecuteScalar()

作为旁注,以纯文本形式将密码存储在DB中不是一个好主意,而是将它们散列,最好使用salt值。

不将明文密码存储在数据库中。查找哈希方法。在下面的例子中,我使用SHA256

class User
{
    public string UserName { get; private set; }
    public string Password { get; private set; }
    public User(string userName, string plainTextPassword)
    {
        this.UserName = userName;
        this.Password = GetHash(plainTextPassword);
    }
    public string GetHash(string toHash)
    {
        return BitConverter.ToString(new SHA256Managed().ComputeHash(Encoding.UTF8.GetBytes(toHash))).Replace("-", string.Empty);
    }
    public void Save() { /* Save UserName and the Hashed Password to database */ }
    public bool ValidateLogin(string userNameEntered, string passwordEntered)
    {
        string userName; string password = string.Empty;
        string ConnectionString = "Your Connection String";
        using (SqlConnection con = new SqlConnection(ConnectionString))
        {
            con.Open();
            string CommandText = "SELECT UserName, Password FROM userLogin WHERE Username = @UserName";
            using (SqlCommand cmd = new SqlCommand(CommandText))
            {
                cmd.Connection = con;
                cmd.Parameters.Add("@Username", SqlDbType.VarChar, 20).Value = userNameEntered;
                SqlDataReader rdr = cmd.ExecuteReader();
                while (rdr.Read())
                {
                    userName = rdr["UserName"].ToString();
                    password = rdr["Password"].ToString();
                }
            }
        }
        if (password.Equals(GetHash(passwordEntered))) return true;
        return false;
    }
}

这个示例显示了一个粗略的散列示例以及从数据库检索。