Virendra S from Bangalore, Karnataka Ответов: 2

Проверка входа в систему не работает с 3-уровневой архитектурой


с любыми входными данными он входит в приложение.

Уровень данных:
public DataSet Userlogin(Users objlogin)
       {
           SqlConnection con = new SqlConnection(ConnString);
           SqlCommand cmd = new SqlCommand("SELECT * FROM User_details WHERE [Login Id]=@loginid AND [Password]=@password", con);
           cmd.Parameters.AddWithValue("@loginid", objlogin.loginId);
           cmd.Parameters.AddWithValue("@password", objlogin.Password);

           SqlDataAdapter da = new SqlDataAdapter(cmd);
           DataSet ds = new DataSet();
           da = new SqlDataAdapter(cmd);
           da.Fill(ds);
           return ds;
           //DataTable dt = new DataTable();
           //da.Fill(dt);
           //return (dt);
       }


БЛЛ:
public DataSet Userlogin(Users objUser)
       {

           DataLayer objUserDAL = new DataLayer();
           try
           {

               return objUserDAL.Userlogin(objUser);
           }
           catch (Exception ex)
           {
               throw ex;
           }
       }


Уровень пользовательского интерфейса:
<pre> protected void btnlogin_Click(object sender, EventArgs e)
        {
            Users objuser = new Users();
            objuser.loginId = loginid.Text;
            objuser.Password = pwd.Text;
            DataSet ds = new DataSet();
            //DataTable dt = new DataTable();

            BAL objBAL = new BAL();
            ds= objBAL.Userlogin(objuser);

            if(ds.Tables.Count>0)
            {
                Session["User"] = loginid.Text;
                Response.Redirect("~/Transactions.aspx");
            }
            else
            {
                Response.Write("<script>alert('Invalid Credentials!')</script> ");
            }
          
        }
    }
}


Что я уже пробовал:

Он работает с одноуровневым кодом ниже
<pre>   protected void btnlogin_Click(object sender, EventArgs e)
        {
            String strConnString = ConfigurationManager.ConnectionStrings["conString"].ConnectionString;

            SqlConnection con = new SqlConnection(strConnString);

            SqlCommand cmd = new SqlCommand("SELECT * FROM User_details WHERE [Login Id]=@loginid AND [Password]=@password",con );
            cmd.Parameters.Add("@loginid", SqlDbType.VarChar).Value = loginid.Text;
            cmd.Parameters.Add("@password", SqlDbType.VarChar).Value = pwd.Text;
              
            SqlDataAdapter da = new SqlDataAdapter(cmd);

            DataTable dt = new DataTable();
            da.Fill(dt);
            if(dt.Rows.Count > 0)
            {
                Session["User"] = loginid.Text;
                Response.Redirect("Transactions.aspx");
               
            }

            else
            {
                
                Response.Write("<script>alert('Invalid Credentials!')</script> ");
               
            }
        }

Richard Deeming

НИКОГДА храните пароли в виде обычного текста!

Безопасная Аутентификация Паролем Объясняется Просто[^]
Соленое хэширование паролей - делаем это правильно[^]

И почему вы заново изобретаете колесо? ASP.NET имеет несколько совершенно хороших встроенных систем аутентификации - например, Личность ASP.NET [^]

2 Ответов

Рейтинг:
7

Vincent Maverick Durano

DataSet состоит из DataTables поэтому вам нужно указать таблицу следующим образом:

ds.Tables["TableName"].Count > 0


или с помощью такого индекса:

ds.Tables[0].Count > 0


Хотя то, что работает, я бы все равно рекомендовал вам DataTable вместо DataSet поскольку вы имеете дело только с одной таблицей базы данных. Также, заведите привычку ставить objects которые едят такие ресурсы, как SqlConnection, SqlCommand и SqlDataAdapter в операторе using, чтобы гарантировать, что объекты будут правильно утилизированы и закрыты после их использования. Вот краткий пример:

public DataTable Userlogin(Users objlogin){
       DataTable dt = new DataTable();
	   string sqlStatement = "SELECT * FROM User_details WHERE [Login Id]=@loginid AND [Password]=@password";
   
        	using(SqlConnection connection = new SqlConnection(GetConnectionString())){
           		using(SqlCommand cmd = new SqlCommand(sqlStatement ,connection)){
               	 	cmd.CommandType = CommandType.Text;
       	            cmd.Parameters.AddWithValue("@loginid", objlogin.loginId);
           			cmd.Parameters.AddWithValue("@password", objlogin.Password);
					using(SqlDataAdapter da = new SqlDataAdapter(cmd)){
						da.Fill(dt);
					}
        		}
        }
	return 	dt;	
}


Затем в вашем бизнес-слое вам также нужно будет вернуть DataTable, чтобы вы могли сделать что-то подобное в своем пользовательском интерфейсе:

BAL objBAL = new BAL();
            DataTable dt = objBAL.Userlogin(objuser);

            if(dt.Rows.Count > 0)
            {
                Session["User"] = loginid.Text;
                Response.Redirect("~/Transactions.aspx");
            }
            else
            {
                Response.Write("<script>alert('Invalid Credentials!')</script> ");
            }



Примечание которые мы сейчас используем dt.Rows.Count чтобы проверить, возвращает ли ваш запрос какие-либо данные.


Рейтинг:
18

ZurdoDev

Первый шаг-понять код.

Тот, который не работает, имеет

if(ds.Tables.Count>0)

и тот, который действительно работает, имеет
if(dt.Rows.Count > 0)


Вам нужно проверить, существуют ли таблицы, а затем также проверить, существуют ли строки.