Nganku Junior Ответов: 2

Как установить различные пути входа в систему в зависимости от предоставленных учетных данных пользователя?


Привет, у меня есть страница входа в систему, и я хочу, чтобы если предоставленные учетные данные пользователя принадлежат администратору(Username = Administrator), то должна открыться страница приложения формы окна под названием "AdminPage". В противном случае должно открыться другое приложение оконной формы под названием "Main_Page".

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

try
           {
               SqlConnection cn = new SqlConnection("Data Source=PV10\\LOCALSERVER;Initial Catalog=SmallSoftwareDB;Integrated Security=True;Pooling=False");
               SqlCommand cmd = new SqlCommand("select * from UserCredentials where Username='" + textBox1.Text + "' and Password='" + textBox2.Text + "'", cn);
               SqlDataReader dr;
               cn.Open();
               dr = cmd.ExecuteReader();
               int cnt = 0;
               while (dr.Read())
               {
                   cnt++;
               }
               if (cnt == 1)
               {
                   MessageBox.Show("Successful Login...", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information);
                   string query = "select Username, Password from UserCredentials where Username='Administrator";
                   SqlCommand cmdA = new SqlCommand(query, cn);
                   dr = cmdA.ExecuteReader();
                   int k = 0;
                   while (dr.Read())
                   {
                       k++;
                   }
                   if (k == 1)
                   {
                       AdminPage A_P = new AdminPage();
                       A_P.Tag = this;
                       A_P.Show(this);
                       Hide();
                   }
                   Main_Page Mp = new Main_Page();
                   Mp.Tag = this;
                   Mp.Show(this);
                   Hide();
                   cn.Close();
                   textBox1.Clear();
                   textBox2.Clear();
               }
               else
               {
                   MessageBox.Show("Invalid UserName or Password", "Message", MessageBoxButtons.RetryCancel, MessageBoxIcon.Warning);
                   textBox1.Clear();
                   textBox2.Clear();
               }
           }
           catch (Exception err)
           {
               MessageBox.Show(err.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Warning);
           }

Richard Deeming

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

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

2 Ответов

Рейтинг:
15

F-ES Sitecore

Ваш код выполняется

select Username, Password from UserCredentials where Username='Administrator'


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

if (textBox1.Text.Equals("Administrator", StringComparison.InvariantCultureIgnoreCase))
{
    // user is admin
}


Также обратите внимание на использование параметризованных запросов, а не на создание sql-запросов с помощью конкатенации строк, поскольку ваш код уязвим для атак SQL-инъекций. Кроме того, вместо того, чтобы делать цикл while\read и увеличивать количество, вы можете просто проверить "if (dr.Read ())", так как на самом деле не имеет значения, сколько результатов есть. Вы также можете сделать "select count (*) from table where....", а затем выполнить вызов ExecuteScalar, чтобы прочитать результат подсчета и посмотреть, равен ли он 0 или 1, или что-то еще.


Nganku Junior

Спасибо за предупреждение. Я использовал
если (элемент textbox1.Текст."Равно" ("Администратор", Значение Stringcomparison.InvariantCultureIgnoreCase))
{
// пользователь является администратором
}
Чтобы сделать свою работу.

Рейтинг:
11

Nganku Junior

if (textBox1.Text.Equals("Administrator", StringComparison.InvariantCultureIgnoreCase))
{
// user is admin
}