Member 8583441 Ответов: 1

Я не получаю идентификатор пользователя конкретного пользователя при входе пользователя в систему


Я создал экран входа в систему в c# asp.net. Данные извлекаются из базы данных логина и пароля. Я получаю только одного пользователя, но остальные пользователи не доступны, что означает возвращение обратно на экран входа в систему.

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

Поля Базы Данных: Имя Таблицы: UserProfile
[UserID] UNIQUEIDENTIFIER CONSTRAINT [def_UserID] DEFAULT (newsequentialid()) NOT NULL,
[UserName]     VARCHAR (15)     NOT NULL,
[Password]     VARCHAR (MAX)    NULL,
[EmailAddress] VARCHAR (50)     NOT NULL,


Исходный код кнопки входа в систему:
protected void lnkBtnLogin_Click(object sender, EventArgs e)
{
    con = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString);
    con.Open();
    cmd = new SqlCommand("select * from UserProfile", con);
    sdr = cmd.ExecuteReader();

    string username = txtUsername.Value;
    string password = txtPassword.Value;

    cmd.Parameters.Add("@UserName", SqlDbType.VarChar, 15);
    cmd.Parameters.Add("@Password", SqlDbType.VarChar);
    cmd.Parameters["@UserName"].Value = username;
    cmd.Parameters["@Password"].Value = password;

    Session["username"] = username;

    while (sdr.Read())
    {
        // Accessing the Session UserID value to all the pages.
        Session["UserID"] = sdr["UserID"].ToString();

        if (sdr["UserName"].ToString() == username && sdr["Password"].ToString() == password)
        {
            Response.Redirect("Home.aspx");
        }

        else
        {
            Response.Write(@"<script>alert('" + errorMessage + "');</script>");
            Response.Redirect("Login.aspx");
        }
    }
    con.Close();
}


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

Richard Deeming

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

Member 8583441

Это для примера практики, которую я сделал, чтобы этот код работал. Но на самом деле я работаю над хэшированием пароля с моим собственным исходным кодом, но не в этом проекте.

Member 8583441

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

1 Ответов

Рейтинг:
5

F-ES Sitecore

Это sql, который вы выполняете

cmd = new SqlCommand("select * from UserProfile", con);
sdr = cmd.ExecuteReader();


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

То, что вы хотите сделать, - это ограничить sql только получением строк для соответствующего пользователя, поэтому вам нужно только выполнить проверку пароля. Вы добавляете имя пользователя и пароль в качестве параметров, но не используете их. Что-то вроде;

cmd = new SqlCommand("select * from UserProfile where [Username]=@UserName and [Password]=@Password", con);

string username = txtUsername.Value;
string password = txtPassword.Value;

cmd.Parameters.Add("@UserName", SqlDbType.VarChar, 15);
cmd.Parameters.Add("@Password", SqlDbType.VarChar);
cmd.Parameters["@UserName"].Value = username;
cmd.Parameters["@Password"].Value = password;

sdr = cmd.ExecuteReader();


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