Вход в систему SQL asp.net

#c# #sql #asp.net #sql-server-2016

#c# #sql #asp.net #sql-server-2016

Вопрос:

Я думал о входе в систему через SQL, я создал базовую форму входа, как показано ниже

 protected void btnLogin_Click(object sender, EventArgs e)
{
    string cs="Data Source=Dev-PC;Initial Catalog=CodeSolution;User ID=sa; password=12345678"
    SqlConnection con = new SqlConnection(cs);
    con.Open();
    String sqlCommand = "SELECT * FROM tblLogin WHERE " 
                     "username = @user AND password = @pwd"
    SqlCommand cmd = new SqlCommand(sqlCommand, con);
    cmd.Parameters.AddWithValue("@user", TextBox1.Text);
    cmd.Parameters.AddWithValue("@pwd", TextBox2.Text);
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    DataTable dt = new DataTable();
    da.Fill(dt);
    if (dt.Rows.Count > 0)
    {
        Response.Redirect("Details.aspx");
    }
    else
    {
        Response.Write("<script>alert('Please enter valid Username and Password')</script>");
    }
}
  

Но потом это заставило меня задуматься, потому что без входа в систему люди могут угадать url Details.aspx

И тогда я подумал, что, если вход в систему был успешным, также добавить столбец в tblLogin и сохранить там идентификатор сеанса этого пользователя. Затем страницы должны проверять, равен ли идентификатор сеанса идентификатору tblLogin для этого пользователя.

Мне интересно узнать об этом 2 вещи:

  • Как сохранить идентификатор сеанса в tblLogin, как известно серверу IIS
  • Является ли это плохим решением, или оно было бы приемлемым (с тем недостатком, что каждая страница asp должна начинаться с функции для проверки на соответствие действительному идентификатору сеанса).

Одна ошибка удалена, аналогичная в SqlCommand, теперь ее =

Комментарии:

1. Предполагая, что вы создаете новый проект, вам определенно следует потратить время на написание проекта MVC вместо проекта forms. И вы можете решить это с помощью маршрутизации, и вам не нужно нигде хранить идентификатор сеанса, я полагаю, это уже часть данных запроса.

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

3. Решение состоит в том, чтобы проверить сеанс при загрузке главной страницы. Но обратите внимание, что это устаревшая форма входа . Вы должны использовать ASP.NET Идентификация

4. Я только что погрузился в ASP.net после понимания основных операций SQL я почувствовал, что мне не хватает простой формы безопасности; я подумал, что давайте продолжим использовать SessionID, поскольку это уникально для каждого сеанса. в качестве самоучителя я планирую прочитать больше о MVC позже, моей следующей темой будет Web Api и Rest Api

Ответ №1:

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

  • Не следует жестко кодировать строки подключения. Сохраните их в своем файле конфигурации и ссылайтесь на них по имени.
  • Никогда не используйте свою sa учетную запись, даже для разработки.
  • Не добавляйте к таблицам префикс с tbl , это избыточно.
  • Не используйте like для имен пользователей и паролей, вам нужно точное совпадение.
  • Не храните пароли в виде открытого текста.
  • «люди могут угадать URL-адрес Details.aspx» — вы проверяете авторизацию («разрешено ли этому пользователю выполнять это действие») при каждом действии.

Объяснение того, как исправить все эти проблемы, потребует слишком больших усилий. Не изобретайте колесо, называемое авторизацией и аутентификацией. Используйте для этого безопасную, протестированную, поддерживаемую библиотеку.

Возможно, вы захотите изучитьASP.NET Членство или его преемник ASP.NET Идентификация.

Комментарии:

1. я действительно использую файл конфигурации, но для этого примера кода я включил его, потому что так было проще объяснить, что я делаю, лично я предпочитаю обозначение tblName, но ваше право примерно ТАКОЕ. Позже я углублюсь в другие библиотеки для этого. Мне просто было интересно, может ли это сработать, я думаю, это может сработать.

Ответ №2:

Не точный ответ на ваш вопрос, но это будет хорошим руководством / советом.

Ваша идея иметь идентификатор сеанса совсем не плоха (в зависимости от требований вашего сайта / системы). Но в данном случае не сеанс из IIS, потому что вам нужно его расшифровать, что сделает вас уязвимым для встроенной атаки (сделает доступной вашу базу данных / корневую папку).

Вот пример того, как получить идентификатор сеанса сеанса во время входа в систему, но не из IIS (вы можете использовать это для ведения журнала):

string sessionId = System.Web.HttpContext.Current.Session.SessionID;

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

Комментарии:

1. спасибо за ваш ответ, я сделаю это просто ради удовольствия. SessionID в конце — это то, что отделяет сеанс пользователя, поэтому я подумал, почему бы не использовать его таким образом в качестве проверки

2. Ну, SessionID отличается для каждого сеанса, в который входит пользователь .. но это не означает, что когда активен другой сеанс, срок действия другого сеанса (с тем же логином) истекает, если только вы не укажете это в своем коде.

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