Member 13318869 Ответов: 2

Returnurl=%2f проблема в ASP.NET проверка подлинности форм


When I Loged into the web and clicked on Login, it was navigating to the LogIn page but it adds 'ReturnUrl=%2f' to the URL. For example, authentication.aspx?ReturnUrl=%2fAXERP-UAT%2fsubsystem%2fmain_menu.aspx.After Login, it should point to this page subsystem/main_menu.aspx. Can anyone help me? Thanks a lot.


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

----------------------------------web.config
<appSettings>
    <add key="ConnectionString" value="AX-UAT;Integrated Security=false;Initial Catalog=SBG_AX_2020;User ID=sbax;Password=sbax;Connection TimeOut=99999" />
  </appSettings>

<authentication mode="Forms">
      <forms name="AXERP-UAT" loginUrl="authentication.aspx" protection="All" path="/" timeout="1500" />
    </authentication>
    <authorization>
      <deny users="*" />
    </authorization>


----------------------------КОДИРОВАНИЕ С#
protected void authenticate(object sender, EventArgs e)
    {
        if (txtUsername.Text == null | txtUsername.Text == string.Empty)
        {
            ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('Error? Please enter email address');", true);
            return;
        }

        if (txtPassword.Text == null | txtPassword.Text == string.Empty)
        {
            ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('Error? Please enter password');", true);
            return;
        }

        SqlConnection con_Check_UserData = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"]);
        SqlCommand cmd_Check_UserData = new SqlCommand();
        try
        {
            cmd_Check_UserData.CommandText = "select * from VIEW_LOGIN where username = '" + txtUsername.Text + "' and password = '" + txtPassword.Text + "'";
            cmd_Check_UserData.Connection = con_Check_UserData;
            con_Check_UserData.Open();
            System.Data.SqlClient.SqlDataReader rd_Check_UserData = cmd_Check_UserData.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
            if (rd_Check_UserData.HasRows)
            {
                while (rd_Check_UserData.Read())
                {
                    rd_Check_UserData.Read();
                    ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('Login Successful');", true);
                    Response.Redirect("subsystem/main_menu.aspx");

                    FormsAuthentication.RedirectFromLoginPage(txtUsername.Text.ToLower(), false);
                }
            }
            else
            {
                ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('Invalid Username/ Password');", true);
                return;
            }
        }
        catch (Exception ex)
        {
            con_Check_UserData.Close();
            Lbl_Message.Text = ex.Message;
            //Response.Redirect("main_menu.aspx");
            return;
        }
        finally
        {
            con_Check_UserData.Close();
        }

        con_Check_UserData.Dispose();
        cmd_Check_UserData.Dispose();
        con_Check_UserData = null;
        cmd_Check_UserData = null;

    }

2 Ответов

Рейтинг:
2

Richard Deeming

Вот именно что ReturnUrl является указывая на него. Он просто должен быть закодирован для использования в параметре querystring.

Но у вас есть более серьезные проблемы для решения:

Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

НИКОГДА храните пароли в виде обычного текста:
Безопасная Аутентификация Паролем Объясняется Просто[^]
Соленое хэширование паролей - делаем это правильно[^]

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


Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]


Member 13318869

- Это именно то, на что указывает ReturnUrl. Он просто должен быть закодирован для использования в параметре querystring."
Что ты хочешь этим сказать? Я не понимаю. Извиняюсь............

Richard Deeming

Ссылка на кодировку HTML URL[^]

Расшифрованный, ваш обратный URL-адрес:

/AXERP-UAT/subsystem/main_menu.aspx

Member 13318869

Сделано, но это все еще не работает для меня.

Richard Deeming

Что значит "не работает"? Обратный URL, который вы показали, - это именно то, что вы сказали, что хотите, чтобы это было. В чем проблема?

Рейтинг:
2

Patrice T

cmd_Check_UserData.CommandText = "select * from VIEW_LOGIN where username = '" + txtUsername.Text + "' and password = '" + txtPassword.Text + "'";

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]