Я работаю над побочным проектом (студент, а не домашняя работа, просто праздничное любопытство), который будет моим простым личным менеджером/хранилищем паролей. Это будет приложение для Windows. Я хочу, чтобы он поддерживал более одного пользователя. Теперь, когда у меня есть экран входа в систему и другие функции, я изо всех сил пытаюсь найти простой и эффективный способ проверить правильность входа и пароля пользователя. Я храню информацию в простой таблице SQL под названием «Пользователи» (рисунок ниже). Теперь я хочу получить результат bool, есть ли эти две строки (имя пользователя, пароль) в базе данных. я буду включать код и скриншоты ниже. Любая помощь приветствуется!
PS: я хорошо знаком с mySQL (Oracle), я просто не могу найти хороший способ сделать это, не будучи смешным. :)
namespace KeyLocker.Database {
[Serializable]
public class UserDatabase {
public void AddUser(string username,string password,string question,string answer) {
using(var db = new KeyLockerContext()) {
db.Add(new User { Username = username,Password = password,SecurityQuestion = question,SecurityAnswer = answer });
db.SaveChanges();
}
}
public bool CheckUser(string username,string password) {
using(var db = new KeyLockerContext()) {
/*here i need to find out if username is present in database
and if it is, i need to find out if the password is correct*/
}
}
}
}
я изменил код на более простой формат, чтобы вопрос было легче понять. но все равно спасибо за наводку :)
@itsme имеет в виду, что хранение и проверка паролей на самом деле является довольно сложной проблемой, а наивные решения, такие как хранение и сравнение текста, небезопасны и неэффективны. «вопросы безопасности» также являются проблематичным понятием. Здорово, что вы хотите узнать об этом, но, пожалуйста, изучите это правильно, чтобы мы могли уменьшить количество утечек данных, а не увеличить их.
во-первых, я не собираюсь использовать это в любом случае. Я использую его на изолированном компьютере вне сети с составленной базой данных. Смысл был не в том, чтобы использовать его в реальной жизни, а просто в том, чтобы попытаться получить представление о приложениях для Windows. Я работал над проектами C# раньше (в основном веб-приложения .ASP), но мне интересно узнать о приложениях для Windows. я понимаю срочность и осторожность, которую я должен соблюдать при работе с паролями. Я знаю, что вы имеете в виду это в хорошем смысле! и здорово, что вы принимаете такие меры, чтобы новички не совершали таких ошибок :)
«Нет такой вещи, как код прототипа» (это вы очень быстро узнаете в индустрии). Всегда делайте все как можно лучше, у вас может не быть возможности все исправить :)





На первый взгляд кажется, что самый простой код для реализации вашей идеи:
public bool CheckUser(string username,string password) {
using(var db = new KeyLockerContext()) {
// Check if that combination already exists in DB.
var result = db.Users.Where(x => x.Username == username && x.Password == password).SingleOrDefault();
// See if result has a value, SingleOrDefault() returns null if no match
return (result == null);
}
}
РЕДАКТИРОВАТЬ/Отказ от ответственности: Поскольку кажется, что есть некоторая путаница, это идея о том, как быстро проверить, существует ли объект с определенными значениями в БД, а не полная библиотека аутентификации. Вы никогда не должны хранить пароли в открытом виде.
Обязательный комментарий «это означает, что ваши пароли находятся в текстовом виде, не делайте этого».
это то, что я искал. я как-то пропустил метод "где". Спасибо за быстрый ответ!
Обратите внимание, что вам вообще не нужен Where. Вы можете передать предикат SingleOrDefault
Спасибо, посмотрю и учту на будущее :)
Обязательный комментарий «Никогда не храните пароли в открытом виде».