Gatsby29 Ответов: 3

Страница входа пользователя и администратора


Я не знаю, как перенаправить пользователей на страницу control-panel.aspx и администратора на страницу admin.aspx.
Я пробовал это, но не получилось.
Пожалуйста помочь

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

<pre>  protected void Button1_Click(object sender, EventArgs e)
    {           
        string user = TextBox1.Text.Trim();
        cmd.CommandText = "select* from Users where Email='" + TextBox1.Text + "' and Password= '"+ TextBox2.Text +"'";
        cmd.Connection = con;
        sda.SelectCommand = cmd;
        sda.Fill(ds, "Users");
       
        SqlCommand check_User_Name = new SqlCommand("SELECT count([Role]) Users WHERE ([Role] = 'Admin' ");
        check_User_Name.CommandType = CommandType.Text;
        SqlDataAdapter sdaa = new SqlDataAdapter(check_User_Name);
        DataTable dt = new DataTable();      
        sdaa.Fill(dt);

            if (ds.Tables[0].Rows.Count > 0)
            {

                if (dt.Rows.Count > 0)
                {
                    Response.Redirect("Admin.aspx");
                }
                else
                {
                    Session["user"] = user;
                    Response.Redirect("Control-Panel.aspx");
                }
            }
            else
            {
                ScriptManager.RegisterStartupScript(this, this.GetType(), "Message", "alert('Something gone wrong');", true);
            }
    }

3 Ответов

Рейтинг:
5

Karthik_Mahalingam

Попробовать это

if (ds.Tables[0].Rows.Count > 0)
            {
                DataTable dtUsers = ds.Tables["Users"];
                Session["user"] = user;
                if (dtUsers.Rows.Count == 1) // it should return only one row 
                {
                    if (dtUsers.Rows[0]["Role"].ToString() == "Admin")
                    Response.Redirect("Admin.aspx");
                    else
                        Response.Redirect("Control-Panel.aspx");
                }
                else
                { 
                    Response.Redirect("Control-Panel.aspx");
                }
            }
            else
            {
                ScriptManager.RegisterStartupScript(this, this.GetType(), "Message", "alert('Something gone wrong');", true);
            }


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

Примечание: Конкатенация строки sql-запроса-это уязвимый к SQL-инъекция[^] атаки,всегда используйте Параметризованные запросы для предотвращения атак SQL-инъекций в SQL Server[[^]

вы должны удалить эти коды
SqlCommand check_User_Name = new SqlCommand("SELECT count([Role]) Users WHERE ([Role] = 'Admin' ");
      check_User_Name.CommandType = CommandType.Text;
      SqlDataAdapter sdaa = new SqlDataAdapter(check_User_Name);
      DataTable dt = new DataTable();
      sdaa.Fill(dt);


Gatsby29

Это именно то, что мне было нужно

Karthik_Mahalingam

:)

Рейтинг:
20

OriginalGriff

Для начала, не делай этого так! Здесь столько всего не так...
1) Никогда не объединяйте строки для построения SQL-команды. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

И делать это на странице входа на сайт? Где любой, где угодно может делать то, что хочет? Это почти преступная глупость.

2) Никогда не храните пароли в открытом тексте - это серьезная угроза безопасности. Здесь есть некоторая информация о том, как это сделать: Хранение паролей: как это сделать.[^] Объедините это с SQL-инъекцией, и я смогу войти в систему как кто я хочу, когда я хочу, даже не зная ни одного пароля...

3) получите правильный SQL.
new SqlCommand("SELECT count([Role]) Users WHERE ([Role] = 'Admin' ");
Без 'FROM' перед 'Users' это вызовет исключение SQL.

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


Gatsby29

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

OriginalGriff

Никогда, никогда не делай этого!
Если вам говорят: "это и это опасно", не думайте, что "сейчас все будет хорошо, я вернусь позже и все исправлю". Вы этого не сделаете, это скучно, и у вас есть более интересные / неотложные проекты на вашей тарелке.
Вместо этого возьмите в привычку делать это правильно с самого начала. Это намного, намного быстрее, чем пытаться исправить ситуацию после серьезной проблемы, вызванной вашими ярлыками. И гораздо легче рано приобрести "правильные привычки", чем пытаться переключиться на них позже!

Рейтинг:
16

F-ES Sitecore

SELECT count([Role]) Users WHERE ([Role] = 'Admin'


Это неверно, нет никакого "от", и вы не закрываете последнюю скобку

SELECT count([Role]) from Users WHERE ([Role] = 'Admin')


Во-вторых, если вы думаете, что "пользователи" в этом операторе обращаются к таблице "пользователи", которую вы создали здесь;

sda.Fill(ds, "Users");


Значит, это не так. Независимо от того, есть ли у вас поле под названием "Роль" в таблице пользователей, вам не нужна вторая команда, у вас уже есть необходимые данные в таблице "пользователи" в "ds". Проверьте, что количество строк равно 1, и если оно прочитано, то поле "роль" первой строки таблицы данных и это даст вам роль этого пользователя.

Как уже указывал OriginalGriff, буквально все, что вы здесь делаете, плохо :) Я добавлю к его комментариям, что ваш дизайн означает, что человек может быть только в одной роли, но я ценю, что вы просто пытаетесь заставить работать основы.


Gatsby29

Спасибо вам, ребята, что теперь все работает хорошо. Я просто смотрел много учебников, и в каждом utotrial они делают это по-разному я хочу добиться того, что у меня есть регистрация и форма входа с хэшированным паролем, подтверждение почты, восстановление пароля и сохранение всего этого в базе данных с датой времени и формой входа с ролями (Администратор и пользователи) с опцией Запомнить меня. А после входа в систему я хочу показать данные пользователя , такие как имя , фамилия, изображение профиля и т.д... Не могу найти нигде этот пример, поэтому я должен комбинировать различные учебные пособия, и чем время от времени у меня возникают проблемы, когда я не знаю, что делать. У меня есть несколько проектов, где я его тестирую.
Если кто-то знает какое-то хорошее место для хороших учебников о моей цели, пожалуйста, опубликуйте его, большое вам спасибо.