ASP. NET C# Неожиданные результаты входа в систему из базы данных sqlexpress - PullRequest
0 голосов
/ 08 апреля 2020

Позвольте мне предисловие: я студент, это проект для класса, и я примерно перевел кодирование от своих преподавателей Visual Basi c в C#, мой код из моего кода ниже.

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
    {

        SqlConnection conUser = new SqlConnection(ConfigurationManager.ConnectionStrings["COP2823ConnectionString"].ToString());
        SqlCommand cmdUser = new SqlCommand();
        string strSQL;
        SqlDataReader dtrUser;
        DateTime timestamp = new DateTime();

        strSQL = "select * FROM students WHERE studentid=@studentid AND courseid=@courseid AND password=@pwd";
        cmdUser.CommandType = System.Data.CommandType.Text;
        cmdUser.CommandText = strSQL;
        cmdUser.Parameters.Add("@studentid", System.Data.SqlDbType.VarChar).Value = Login1.UserName;
        cmdUser.Parameters.Add("@courseid", System.Data.SqlDbType.VarChar).Value = "COP2823";
        cmdUser.Parameters.Add("@pwd", System.Data.SqlDbType.VarChar).Value = Login1.Password;

        conUser.Open();
        cmdUser.Connection = conUser;
        dtrUser = cmdUser.ExecuteReader();
        if (dtrUser.HasRows)
        {
            dtrUser.Read();
            HttpContext.Current.Session["sid"] = dtrUser["studentid"];
            HttpContext.Current.Session["fname"] = dtrUser["first"];
            HttpContext.Current.Session["lname"] = dtrUser["last"];
            HttpContext.Current.Session["ulevel"] = dtrUser["userlevel"];
            HttpContext.Current.Session["email"] = dtrUser["email"];
            HttpContext.Current.Session["course"] = "COP2823";

            dtrUser.Close();
            conUser.Close();

            strSQL = "UPDATE students SET lastlogin=@lastlogin WHERE studentid=@user2";
            cmdUser.CommandType = System.Data.CommandType.Text;
            cmdUser.CommandText = strSQL;
            timestamp = DateTime.Now;
            cmdUser.Parameters.Add("@user2", System.Data.SqlDbType.VarChar).Value = Login1.UserName;
            cmdUser.Parameters.Add("@lastlogin", System.Data.SqlDbType.VarChar).Value = timestamp.ToString();

            conUser.Open();
            cmdUser.Connection = conUser;
            dtrUser = cmdUser.ExecuteReader();
            dtrUser.Close();
            conUser.Close();
        }
        dtrUser.Close();
        conUser.Close();
    }

 protected void LoginButton_Click(object sender, EventArgs e)
    {
        Login1_Authenticate(null, null);
    }

Теперь проблема, с которой я сталкиваюсь, заключается в том, что, когда я использую функцию входа в систему, я могу буквально печатать все, что захочу, и это дает мне доступ, если я нажимаю кнопку фактического входа в систему, которая говорит о неудачной регистрации. Я предполагаю, что это связано с моим

cmdUser.Parameters.Add("@studentid", System.Data.SqlDbType.VarChar).Value = Login1.UserName;
cmdUser.Parameters.Add("@courseid", System.Data.SqlDbType.VarChar).Value = "COP2823";
cmdUser.Parameters.Add("@pwd", System.Data.SqlDbType.VarChar).Value = Login1.Password;

, но я не смог найти правильного использования. Я прошу прощения, если это повторный вопрос, я уже разобрался со многими другими проблемами, касающимися базы данных, у меня есть раздел комментариев, который использует базу данных и работает просто отлично, gridView, который хорошо обращается к базе данных.

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

при входе на страницу входа сеансы должны быть очищены, возможно, после первой успешной попытки входа сеансы сохраняют значения, следовательно, правильная аутентификация.

//here in login page
 protected void Page_Load(object sender, EventArgs e)
    {
     HttpContext.Current.Session["studentid"] = null;
//repeat code for other sessions

    }

это правильное использование для добавления параметра значения для команды cmd

cmd.Parameters.AddWithValue("@param", value);

о возможности входа в систему, даже если учетные данные неверны:

вы назначаете сеансы, когда вы перенаправляете на нужную страницу, проверяете ли вы сеансы загружены? как это:

 protected void Page_Load(object sender, EventArgs e)
    {
        if (Session["studentid"] == null)
        {
            Response.Redirect("login.aspx");
        }
    }

, если нет, ничто не заставит веб-страницу заблокировать вам доступ к ней

0 голосов
/ 08 апреля 2020

Не полный ответ, но я хотел помочь вам разобраться в некоторых вещах, и новый код включает пару вещей, которые могли отсутствовать для непосредственного решения вопроса.

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
    string SQL = "
      SELECT * 
      FROM students 
      WHERE studentid=@studentid AND courseid=@courseid AND password=@pwd;
      -- Update login time as part of the SAME SQL BATCH!
      If @@rowcount = 1 BEGIN
          UPDATE students
          SET LastLogin = current_timestamp
          WHERE studentid = @studentid ;
      END";

    // using blocks guarantee the connection is closed, even if an exception is thrown.
    // The original code would have left the connection hanging open if there was an exception.
    using (var conUser = new SqlConnection(ConfigurationManager.ConnectionStrings["COP2823ConnectionString"].ToString()))
    using (var cmdUser = new SqlCommand(SQL, conUser))
    {
        cmdUser.Parameters.Add("@studentid", System.Data.SqlDbType.VarChar).Value = Login1.UserName;
        cmdUser.Parameters.Add("@courseid", System.Data.SqlDbType.VarChar).Value = "COP2823";
        // Should be using a HASH VALUE here!
        cmdUser.Parameters.Add("@pwd", System.Data.SqlDbType.VarChar).Value = CreatePwdHash(Login1.Password);

        conUser.Open();
        using (SqlDataReader dtrUser = cmdUser.ExecuteReader())
        {
            if (dtrUser.Read())          
            {
                HttpContext.Current.Session["sid"] = dtrUser["studentid"];
                HttpContext.Current.Session["fname"] = dtrUser["first"];
                HttpContext.Current.Session["lname"] = dtrUser["last"];
                HttpContext.Current.Session["ulevel"] = dtrUser["userlevel"];
                HttpContext.Current.Session["email"] = dtrUser["email"];
                HttpContext.Current.Session["course"] = "COP2823";

                if (e is object) e.Authenticated = true;
            }
            else //This section was missing!
            {
                HttpContext.Current.Session["sid"] = null;
                HttpContext.Current.Session["fname"] = null;
                HttpContext.Current.Session["lname"] = null;
                HttpContext.Current.Session["ulevel"] = null;
                HttpContext.Current.Session["email"] = null;
                HttpContext.Current.Session["course"] = null;

                if (e is object) e.Authenticated = false;
            }
            dtrUser.Close();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...