Member 12869977 Ответов: 1

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


- Привет! Итак, у меня есть форма входа в систему с пользователем, пропуском и кнопкой для входа. На эту кнопку Я хочу поставить прослушиватель JavaScript и при нажатии запустить функцию$. ajax (), которая отправляет
запрос на страницу входа в систему, а затем возврат ответа json с 2 полями: error(failed) и msg (user/pass ok). Когда ajax заканчивается, функция success должна отобразить на странице значение из msg и, если нет ошибки, перенаправить на домашнюю страницу.
я предполагаю, что каким-то образом мне нужно проверить пользователя/пропуск с тем, что у меня есть в базе данных, я просто не знаю, как это сделать.
в настоящее время я использую сеансы для своей аутентификации, и это работает просто отлично, но теперь моя новая задача-изменить его.
я попробовал что-то ниже проблема в том, что я не знаю, как сделать проверку с базой данных, чтобы увидеть, если пользователь и пароль верны.
пожалуйста, помогите мне с некоторыми идеями.
Спасибо

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

This is my table
 <table style="background-color:#f1f1f1">
             <tr>
                 <td><asp:Label runat="server" ID="lbl1" Font-Bold="true" ForeColor="Red"/></td>
             </tr>
           
             <tr>
                 <td><asp:Label runat="server">Username</asp:Label></td>
                 <td><asp:TextBox runat="server" ID="txtUser" placeholder="Username"/></td>
                 <td><asp:RequiredFieldValidator ID="rfvUser" runat="server" ControlToValidate="txtUser" ErrorMessage="*" ForeColor="Red" Font-Bold="true"  ValidationGroup="LoginInfo"/></td>
             </tr>
             <tr>
                 <td><asp:Label runat="server">Password</asp:Label></td>
                 <td><asp:TextBox runat="server" ID="txtPass" TextMode="Password" placeholder="Password"/></td>
                 <td><asp:RequiredFieldValidator ID="rfvPass" runat="server" ControlToValidate="txtPass" ErrorMessage="*" ForeColor="Red" Font-Bold="true"  ValidationGroup="LoginInfo"/></td>
             </tr>
             
             <tr >
                 <td></td>
                 <td><asp:Button runat="server" Text="Login" ID="btnLogin" CssClass="button" Width="210"  OnClick="btnLogin_Click" ValidationGroup="LoginInfo"/></td>
             </tr>
</table>


Вот то, что я пытался :

<script>
$(document).ready(function myfunction () {
                $('#btnLogin').click(function () {
                    var user = $('#txtUser').val();
                    var pass = $('#txtPass').val();

                    if (user != '' && pass != '') {
                        $.ajax({
                            type: "POST",
                            contentType: "application/json; charset=utf-8",
                            url: "Login.aspx/InsertData",
                            data: {user: txtUser, pass: txtPass},
                            dataType: "json",
                            success: function (data) {
                                var obj = data.d;
                                if (obj == 'true') {
                                    $('#txtUser').val('');
                                    $('#txtPass').val('');
                                    $('#lbl1').html("Login Successfully");
                                    // window.location = "Default.aspx";??
                                }
                            },
                            error: function (result) {
                                $('#lbl1').html("Wrong username or password");
                               
                            }
                        });
                    }
                    else {
                        $('#lbl1').html("Please fill all fields");
                        return false;
                    }
                });
                });
          
        </script>


а в моем aspx. cs, может быть, что-то вроде :

[WebMethod]
   public static string InsertData(string user, string pass)
   {
       string msg = string.Empty;
       using (MySqlConnection conn = new MySqlConnection(WebConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString))
       {
           using (MySqlCommand cmd = new MySqlCommand("select * from useri where Username=@Username and Password=@Password", conn))
           {
               conn.Open();
               cmd.Parameters.AddWithValue("@Username", user);
               cmd.Parameters.AddWithValue("@Password", pass);
               int i = cmd.ExecuteNonQuery();
               conn.Close();
               if(i==1)
               {
                   msg = "true";
               }
               else
               {
                   msg = "false";
               }
           }
       }
       return msg;

   }

[no name]

Если вы не знаете, как, откуда взялся этот небезопасный код?
"помогите мне с некоторыми идеями", идеями для чего? Вы не задали вопрос и не описали проблему. Проведите небольшое исследование о том, как безопасно хранить пароли в базе данных.

Member 12869977

Код был взят из многих учебников, которые я смотрел и до сих пор смотрю об ajax jquery и о том, как отправлять json, потому что, очевидно, я только начал учиться. Пароли защищены в моем исходном коде, они зашифрованы. Это всего лишь пример, который я пытался в конечном итоге выполнить. И мне нужны были некоторые идеи о том, как сделать этот рабочий код. В настоящее время не работает. Извините, если я не ясно выразился, что мне нужно

F-ES Sitecore

Что не так с кодом, который у вас есть?

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

Edit: посмотрев на sql-код ExecuteNonQuery, вы можете не беспокоиться о результате, поэтому обновление, вставка или удаление. Вы хотите знать, сколько записей возвращается, чтобы вы могли изменить sql на

выберите пункт count (*) from ...

затем используйте ExecuteScalar вместо ExecuteNonQuery (google для синтаксиса о том, как использовать, вам нужно будет привести результат), или оставьте sql как есть и используйте ExecuteReader и сделайте что-то вроде

var dr = cmd.Метода executereader();
если (dr. Read())
{
// вход успешный
}

Member 12869977

Ну, текущий код не работает, потому что сообщение никогда не возвращает true, и оно не входит в систему, и я знаю, что делаю что-то не так, вот почему я написал здесь. Я довольно новичок в jQuery ajax и не знаю, в чем преимущество, но это та задача, которую мне дали, так что ... я изменю sql спасибо за ваше предложение

1 Ответов

Рейтинг:
0

Wendelius

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

Вместо этого вы должны хранить только хэшированный пароль, и каждый раз, когда пользователь входит в систему, вы проверяете, совпадает ли сохраненный хэш с новым вычисленным хэшем. Таким образом, вы можете проверить, правильный ли пароль, но вы не знаете, что это на самом деле. Для получения дополнительной информации см. Хранение паролей: как это сделать.[^]

Когда вы это сделаете, вам следует изменить веб-метод, чтобы фактически получить информацию о пользователе. В настоящее время вы выполняете не запрос, который используется в операторах манипуляции или процедурах. Чтобы увидеть, действительно ли запись существует, используйте Свойство sqlcommand.Метод ExecuteReader (System. Data.SqlClient)[^]. Если считыватель возвращает строку, то вход в систему осуществляется с правильным именем пользователя и паролем, а если нет, то сообщите об этом вызывающей стороне.


Member 12869977

Спасибо за ваш ответ. Да, я знаю о хэшированных паролях в моем исходном коде, они хранятся как пароли md5.. то, что я опубликовал выше, - это то, что я пытался сделать, и (конечно, когда я заставлю это работать, я зашифрую пароли), потому что, как я уже сказал, мне нужно перейти от события onclick на странице aspx.cs как такового, чтобы кнопка не делала полную обратную передачу, поставить прослушиватель JS onclick и использовать ajax для возврата значений json