向SQL Server发送身份验证信息;t工作(C#)
本文关键字:工作 信息 Server SQL 身份验证 | 更新日期: 2023-09-27 18:20:34
我已经问过类似的问题,但我已经把它缩小到了我的问题,我已经为此工作了几个小时,但无法解决这个问题。
基本上,我有一个visualstudiowep应用程序,我正在尝试使用登录页和sql server数据库来验证用户凭据。用户在登录屏幕上输入用户名和密码的字符串,该字符串将在代码后面发送到此处:
private bool ValidateUser(string userName, string passWord)
{
SqlConnection conn;
SqlCommand cmd;
string lookupPassword = null;
// Consult with your SQL Server administrator for an appropriate connection
// string to use to connect to your local SQL Server.
conn = new SqlConnection(ConfigurationManager.ConnectionStrings["databaseConnect"].ConnectionString);
conn.Open();
// Create SqlCommand to select pwd field from users table given supplied userName.
cmd = new SqlCommand("Select Password from Users where User=@userName;", conn);
cmd.Parameters.Add("@userName", System.Data.SqlDbType.VarChar, 25);
cmd.Parameters["@userName"].Value = userName;
lookupPassword = (string)cmd.ExecuteScalar();
// If no password found, return false.
if (null == lookupPassword)
{
return false;
}
private void cmdLogin_ServerClick(object sender, System.EventArgs e)
{
if (ValidateUser(txtUserName.Value,txtUserPass.Value) )
(logs in)
}
应用程序连接到数据库中的一个表,该表当前包含一个测试项,如下所示:https://i.stack.imgur.com/Xa7kH.jpg
然而,当我输入"test"作为用户名,输入"password"作为密码时,它不接受登录。
我试着只包含我代码的相关部分,让任何试图回答这个问题的人都更清楚,但这里有一些关于我问题的评论:
-当我将if(null==lookupPassword)设置为"return true"而不是"return false"时,应用程序允许登录这意味着在"lookupPassword=(string)cmd.ExecuteScaler();"之后lookupPassword仍然为空
-当我将if(ValidateUser(txtUserName.Value,txtUserPass.Value))更改为if(userName=test,passWord=passWord)时,应用程序运行良好。因此,问题不在于登录应用程序的实际操作,而在于找不到SQL Server凭据是真的。
-"databaseConnect"正在应用程序的其他地方工作,所以这不是问题所在。
-当我提交登录凭据时,应用程序并没有崩溃,它只是不接受它们的正确性。
除此之外,在我看来,问题来自这四条线:
cmd = new SqlCommand("Select Password from Users where User=@userName;", conn);
cmd.Parameters.Add("@userName", System.Data.SqlDbType.VarChar, 25);
cmd.Parameters["@userName"].Value = userName;
lookupPassword = (string)cmd.ExecuteScalar();
有人知道我的问题在哪里吗?我对编程很陌生,所以请尽可能简单地回答。提前感谢您的帮助。:)
此表设计在SQL Server中使用了几个保留字。如果您不能修改这个模式,您可以如下更新您的查询:
SELECT [Password] FROM [Users] WHERE [User] = @Username
话虽如此,以明文形式存储密码是一种可怕的安全做法。密码永远不应该被加密或明文存储,应该使用salt对它们进行哈希处理,以避免彩虹表破解您的密码。我会研究@Richard关于Rfc2898DeriveBytes
的建议。你也可以在谷歌或必应上搜索salt和SHA256。