【问题标题】:Cant verify user name and password , some thing wrong in while loop无法验证用户名和密码,while 循环有问题
【发布时间】:2014-12-18 15:00:19
【问题描述】:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;

public partial class _Default : System.Web.UI.Page 
{
protected void Page_Load(object sender, EventArgs e)
{
    if (!this.IsPostBack)
        ViewState["LoginErrors"] = 0;
}

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
    if (YourValidationFunction(Login1.UserName, Login1.Password))
    {
       // e.Authenticated = true;
        Login1.Visible = false;
        MessageLabel.Text = "Successfully Logged In";
    }
    else
    {
        e.Authenticated = false;
    }
}

protected void Login1_LoginError(object sender, EventArgs e)
{
    if (ViewState["LoginErrors"] == null)
        ViewState["LoginErrors"] = 0;

    int ErrorCount = (int)ViewState["LoginErrors"] + 1;
    ViewState["LoginErrors"] = ErrorCount;

    if ((ErrorCount > 3) && (Login1.PasswordRecoveryUrl != string.Empty))
        Response.Redirect(Login1.PasswordRecoveryUrl);
}

private bool YourValidationFunction(string UserName, string Password)
{
    bool boolReturnValue = false;
    string strConnection = "server=example;database=TEST_dw;uid=test;pwd=test;";
    SqlConnection sqlConnection = new SqlConnection(strConnection);
    String SQLQuery = "SELECT UserName, Password FROM Login";
    SqlCommand command = new SqlCommand(SQLQuery, sqlConnection);
    SqlDataReader Dr;
    sqlConnection.Open();
    Dr = command.ExecuteReader();

    while (Dr.Read())
    {

        if ((UserName == Dr["UserName"].ToString()) && (Password ==     Dr["Password"].ToString()))

            {
                boolReturnValue = true;
                break;
            }


        Dr.Close();
        return boolReturnValue;
    }
}

}

代码运行没有错误,但它没有验证用户名和密码,也成功登录错误的用户名和密码。 while循环和bool返回值解析有问题

【问题讨论】:

  • Dr.Close(); return boolReturnValue; 应该在while 循环之外。
  • 检查我的解决方案并告诉我是否对您有帮助。

标签: c# .net


【解决方案1】:

您将在 while 循环中关闭阅读器,并在 while 的第一次迭代中返回值 boolReturnValue。这意味着如果 if check 在循环的第一次迭代中不为真,它将始终返回 false

// previous code

while (Dr.Read())
{
    if ((UserName == Dr["UserName"].ToString()) && (Password ==     Dr["Password"].ToString()))
    {
        boolReturnValue = true;
        break;
    }
}

Dr.Close();
return boolReturnValue;

代码应如下所示。如果您使用调试,您可以很容易地看到这一点。这篇关于调试的教程可能对你有用:Tutorial

P.S 另外对您来说更好的方法是查询数据库并查看是否有任何具有此密码和用户名的用户,而不是获取每个用户,然后循环它们并检查是否。如果您有 100000 个用户,这将是性能问题,只是说 ...

private bool YourValidationFunction(string UserName, string Password)
{

    string strConnection = "server=example;database=TEST_dw;uid=test;pwd=test;";
    SqlConnection sqlConnection = new SqlConnection(strConnection);

    sqlConnection.Open();

    String query = "SELECT Count(*) FROM Login WHERE UserName=@UserName AND Password=@Password";

    SqlCommand command = new SqlCommand(query, sqlConnection);
    command.Parameters.AddWithValue("@UserName", UserName);
    command.Parameters.AddWithValue("@Password", Password);

    int result = Convert.ToInt32(command.ExecuteScalar());

    sqlConnection.Close();

    return result != 0 ? true : false;
}

最后一行是坚韧操作符return result != 0 ? true : false;。这意味着

if(result !=0)
   return true;
else
   return false;

我建议您将来在其他课程中编写数据访问层:这是我编写示例 DataAccessLayer 的示例问题:checking user name or user email already exists

【讨论】:

  • 这真的很有帮助...现在完成了..非常感谢
猜你喜欢
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 2014-12-08
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多