Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
69_Web.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.03 Mб
Скачать

2.5.4 Аутентифікація за допомогою бази даних

Попередні розділи демонструють аутентификацию за допомогою списку користувачів з файлу Web.config — метод Authenticate класу FormsAuthentication читає цей файл за замовчуванням. Це годиться, коли імена і паролі користувачів створюються і обслуговуються системним адміністратором, але якщо користувачам дозволено самим вибирати собі імена і паролі, краще зберігати цю інформацію в іншому місці. Справа в тому, що після модифікації Web.config необхідно перезапустити Web-додаток, що приведе до скидання змінних стани Application і Session, які використовуються додатком. Імена і паролі користувачів можна зберігати в будь-яких файлах, але БД дає ряд істотних переваг:

  • ім'я користувача можна застосовувати як первинний ключ для зберігання інших відомостей про користувача;

  • БД забезпечує високу швидкодію при витягу користувальницьких імен і паролів;

  • SQL дозволяє стандартизувати додавання, модифікацію і витяг записів.

Імена і паролі користувачів можна зберігати у файлі або в БД у зашифрованому виді, для шифрування використовується метод HashPasswordForStoringlnConflgFile класу FormsAuthentication, що застосовує алгоритми SHA1 або MD5:

Password = FormsAuthentication.HashPasswordForStoringInConfigFile

(Password, "SHA1");

2.5.5. Додавання користувачів у базу даних

Щоб додати користувачів у БД, треба одержати його ім'я і пароль із відповідних текстових полів, а також створити оброблювач події, що додає користувача в БД і повідомляє про успішне або невдале додавання користувача. Наступний оброблювач події викликає допоміжну функцію AddUser для додавання облікових даних користувача в БД:

private void butNewUser_Click (object sender, System.EventArgs e)

{

if (AddUser (txtUserName.Text, txtPassword.Text))

spnNote.InnerText = "User added.";

else

spnNote.InnerText = "User exists. Choose a

different user name";

}

Допоміжна функція AddUser, яка показана в наступному коді, шифрує пароль перед записом облікових даних в БД, здійснюваною командою SQL INSERT. Якщо ім'я користувача, що додається, вже є в БД, блок обробки виключень перехоплює помилку і повертає значення False, що свідчить про невдале додавання користувача.

private bool AddUser(string UserName, string Password)

{

// Оголосити змінну для визначення стану операції

bool bSuccess = false;

// Зашифрувати пароль.

Password = FormsAuthentication.

HashPasswordForStoringInConfigFile

(Password, "SHA1");

// Створити команду для вставки імені і пароля

// користувача

OleDbCommand oleConnmand = new OleDbCommand

("INSERT INTO Users" + " VALUES

('" + UserName + "',

'" + Password + "')", oledbUsers);

// Якщо такий запис вже існує, перехопити помилку

try

{

// Відкрити з’єднання з БД.

oledbUsers.Ореn();

// Якщо запис добавленао встановити змінну стану

// у true...

if (oleCommand.ExecuteNonQuery() !=0)

{

bSuccess = true

// ... і закрити з’єднання

oledbUsers.Close();

}

}

catch

{

// якщо ні, вважати операцію невдалою

bSuccess = false;

// Закрити з’єднання

oledbUsers.Close();

}

// Повернути повідомлення про успішне або ні

// завершення

return bSuccess;

}

Допоміжна функція CheckPassword (див. код нижче) шифрує введений пароль, пише в БД запис з таким же ім'ям користувача і порівнює зашифрований пароль з паролем із знайденим в БД записом. Звернення до БД проводиться в блоці обробки виключень, щоб користувач не побачив повідомлення про помилки, що виникають при конфліктах із-за блокування БД.

private| bool| CheckPassword|(string| UserName|, string| Password|)

{

// Оголосити змінну| для визначення| стану операції|

bool| bSuccess| = false|;

// Зашифрувати пароль

Password| = FormsAuthentication|.HashPasswordForStoringInConfigFile

(Password,"SHA1|");

// Створити команду для витягу| радка| із заданим|

// значенням| UserName|

OleDbCommand| oleCommand| = new| OleDbCommand|

("SELECT| * FROM| Users|" + " WHERE| UserName| =

'" + txtUserName|.Text +"', oledbUsers|);

// Слідкувати за помилками| в БД.

try|

{

// Відкрити з’єднання| з БД

oledbUsers|.Oреn();

//Знайти запис|

OleDbDataReader| rdrUsers| = oleCommand|.ExecuteReader();

while| (rdrUsers|.Read{))

{

if| (Password| == rdrUsers|["Password|"].ToString())

bSuccess| = true|;

}

// Закрити з’єднання|

oledbUsers|.Close();

}

catch|

{

// Якщо запис| знайдено|, вважати| операцію| невдалою|

bSuccess| = false|;

// Закрити з’єднання|

oledbUsers|.Close();

}

return| bSuccess|;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]