使用.NET web服务对数据库进行用户身份验证

使用.NET web服务对数据库进行用户身份验证,.net,web-services,authentication,.net,Web Services,Authentication,我的机器上有一个SQL Server 2008中创建的数据库。它包含一个名为login的表,该表有两列用户名和密码以及某些值 在VisualStudio2008中编写。我需要检查我提供的用户名和密码是否正确,即基本上我想通过web服务验证用户 有人能告诉我该怎么做吗 我强烈建议您在处理SQL时使用,以免受到SQL注入的攻击;特别是对于面向公众的web服务 从您的查询中可以看到您正在存储密码。再一次,我要敦促你使用salt和你的用户密码来提高安全性 您可以通过将查询更改为COUNT(*),并作为标

我的机器上有一个SQL Server 2008中创建的数据库。它包含一个名为login的表,该表有两列用户名和密码以及某些值

在VisualStudio2008中编写。我需要检查我提供的用户名和密码是否正确,即基本上我想通过web服务验证用户

有人能告诉我该怎么做吗

  • 我强烈建议您在处理SQL时使用,以免受到SQL注入的攻击;特别是对于面向公众的web服务

  • 从您的查询中可以看到您正在存储密码。再一次,我要敦促你使用salt和你的用户密码来提高安全性

  • 您可以通过将查询更改为
    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.";
    }
    
  • 我强烈建议您在处理SQL时使用,以免受到SQL注入的攻击;特别是对于面向公众的web服务

  • 从您的查询中可以看到您正在存储密码。再一次,我要敦促你使用salt和你的用户密码来提高安全性

  • 您可以通过将查询更改为
    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
    变量名的大小写错误。