使用.NET web服务对数据库进行用户身份验证
我的机器上有一个SQL Server 2008中创建的数据库。它包含一个名为login的表,该表有两列用户名和密码以及某些值 在VisualStudio2008中编写。我需要检查我提供的用户名和密码是否正确,即基本上我想通过web服务验证用户 有人能告诉我该怎么做吗使用.NET web服务对数据库进行用户身份验证,.net,web-services,authentication,.net,Web Services,Authentication,我的机器上有一个SQL Server 2008中创建的数据库。它包含一个名为login的表,该表有两列用户名和密码以及某些值 在VisualStudio2008中编写。我需要检查我提供的用户名和密码是否正确,即基本上我想通过web服务验证用户 有人能告诉我该怎么做吗 我强烈建议您在处理SQL时使用,以免受到SQL注入的攻击;特别是对于面向公众的web服务 从您的查询中可以看到您正在存储密码。再一次,我要敦促你使用salt和你的用户密码来提高安全性 您可以通过将查询更改为COUNT(*),并作为标
COUNT(*)
,并作为标量执行,并确保COUNT大于等于1来完成所需的操作。大概是这样的:
myCommand.CommandText = "select COUNT(*) from Login where Username = @Username AND Password = @HashedPassword";
int rowCount = (int)mycommand.ExecuteScalar();
return rowCount == 1 ? "success" : "bad username or password";
try
{
using(SqlConnection myConnection = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=student;User ID=sa;Password=123"))
{
myConnection.Open();
using (SqlCommand myCommand = new SqlCommand())
{
myCommand.Connection = myConnection;
myCommand.CommandText = "SELECT COUNT(*) FROM Login WHERE UserName = @UserName AND Password = @Password";
myCommand.Parameters.Add("@UserName", SqlDbType.VarChar).Value = UserName;
myCommand.Parameters.Add("@Password", SqlDbType.VarChar).Value = Password;
return (int) myCommand.ExecuteScalar() == 1 ? "success" : "bad username or password";
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return "an error occurred.";
}
SqlDataReader
编辑:
那么这段代码在做什么呢
我们稍微更改了SQL查询。我还修改了它以使用参数。所以这个查询的意思是让我知道这个用户名和密码是整数的用户数
因此,如果一个用户拥有该用户名和密码,它将返回1
。如果没有人拥有该用户名和密码,它将返回0
ExecuteScalar
在您不希望返回任何行时非常有用;只有一个值。我们的情况就是这样;我们所期待的只是一个数字:用户数量
所以当你把所有这些代码放在一起时;它应该是这样的:
myCommand.CommandText = "select COUNT(*) from Login where Username = @Username AND Password = @HashedPassword";
int rowCount = (int)mycommand.ExecuteScalar();
return rowCount == 1 ? "success" : "bad username or password";
try
{
using(SqlConnection myConnection = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=student;User ID=sa;Password=123"))
{
myConnection.Open();
using (SqlCommand myCommand = new SqlCommand())
{
myCommand.Connection = myConnection;
myCommand.CommandText = "SELECT COUNT(*) FROM Login WHERE UserName = @UserName AND Password = @Password";
myCommand.Parameters.Add("@UserName", SqlDbType.VarChar).Value = UserName;
myCommand.Parameters.Add("@Password", SqlDbType.VarChar).Value = Password;
return (int) myCommand.ExecuteScalar() == 1 ? "success" : "bad username or password";
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return "an error occurred.";
}
COUNT(*)
,并作为标量执行,并确保COUNT大于等于1来完成所需的操作。大概是这样的:
myCommand.CommandText = "select COUNT(*) from Login where Username = @Username AND Password = @HashedPassword";
int rowCount = (int)mycommand.ExecuteScalar();
return rowCount == 1 ? "success" : "bad username or password";
try
{
using(SqlConnection myConnection = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=student;User ID=sa;Password=123"))
{
myConnection.Open();
using (SqlCommand myCommand = new SqlCommand())
{
myCommand.Connection = myConnection;
myCommand.CommandText = "SELECT COUNT(*) FROM Login WHERE UserName = @UserName AND Password = @Password";
myCommand.Parameters.Add("@UserName", SqlDbType.VarChar).Value = UserName;
myCommand.Parameters.Add("@Password", SqlDbType.VarChar).Value = Password;
return (int) myCommand.ExecuteScalar() == 1 ? "success" : "bad username or password";
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return "an error occurred.";
}
SqlDataReader
编辑:
那么这段代码在做什么呢
我们稍微更改了SQL查询。我还修改了它以使用参数。所以这个查询的意思是让我知道这个用户名和密码是整数的用户数
因此,如果一个用户拥有该用户名和密码,它将返回1
。如果没有人拥有该用户名和密码,它将返回0
ExecuteScalar
在您不希望返回任何行时非常有用;只有一个值。我们的情况就是这样;我们所期待的只是一个数字:用户数量
所以当你把所有这些代码放在一起时;它应该是这样的:
myCommand.CommandText = "select COUNT(*) from Login where Username = @Username AND Password = @HashedPassword";
int rowCount = (int)mycommand.ExecuteScalar();
return rowCount == 1 ? "success" : "bad username or password";
try
{
using(SqlConnection myConnection = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=student;User ID=sa;Password=123"))
{
myConnection.Open();
using (SqlCommand myCommand = new SqlCommand())
{
myCommand.Connection = myConnection;
myCommand.CommandText = "SELECT COUNT(*) FROM Login WHERE UserName = @UserName AND Password = @Password";
myCommand.Parameters.Add("@UserName", SqlDbType.VarChar).Value = UserName;
myCommand.Parameters.Add("@Password", SqlDbType.VarChar).Value = Password;
return (int) myCommand.ExecuteScalar() == 1 ? "success" : "bad username or password";
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return "an error occurred.";
}
我希望你的学生都没有名字。没有。我只是无法通过网络服务验证用户的身份。你能告诉我该怎么做吗?我希望你的学生都没有名字。没有。我只是不能通过网络服务验证用户的身份。你能告诉我该怎么做吗?我对这一点还不熟悉。你能解释一下你给出的代码实际上会做什么吗?如果我在其中使用你的代码,我的GetLoginDetails方法应该返回什么?@Parth_90:GetLoginDetails应该返回你希望它返回的任何东西。如果您想返回一个神奇的字符串,如
成功
和失败
,这取决于您自己。你也可以只返回一个布尔值而不是字符串。嘿,非常感谢你的代码。但是我在这一行遇到了错误:myCommand.Parameters.Add(“@UserName”,SqlDbType.VarChar)。Value=UserName;myCommand.Parameters.Add(“@Password”,SqlDbType.VarChar).Value=Password。。。错误表明“用户名”在当前上下文中不存在。@Parth_90:如果您想重新复制并粘贴代码,我已修复了代码。我错误地将原始代码中的UserName
和Password
变量名大小写了出来。我对这一点不熟悉。你能解释一下你给出的代码实际上会做什么吗?如果我在其中使用你的代码,我的GetLoginDetails方法应该返回什么?@Parth_90:GetLoginDetails应该返回你希望它返回的任何东西。如果您想返回一个神奇的字符串,如成功
和失败
,这取决于您自己。你也可以只返回一个布尔值而不是字符串。嘿,非常感谢你的代码。但是我在这一行遇到了错误:myCommand.Parameters.Add(“@UserName”,SqlDbType.VarChar)。Value=UserName;myCommand.Parameters.Add(“@Password”,SqlDbType.VarChar).Value=Password。。。错误表明“用户名”在当前上下文中不存在。@Parth_90:如果您想重新复制并粘贴代码,我已修复了代码。我将原始代码中的UserName
和Password
变量名的大小写错误。