ASP.NET MVC / C # - Linq и хешированный пароль - PullRequest
1 голос
/ 20 декабря 2011

Я пытаюсь создать аутентификацию, где все пароли хешируются и засоляются. Во-первых, для простоты я попробовал без соли, вот мой linq:

var CurrentUser = db.Users
    .Single(u => u.UserName == form["username"] && u.Password.SequenceEqual
               (
                   MD5.Create().ComputeHash
                       (
                           Encoding.UTF8.GetBytes(form["password"])
                       )
               )
          );

К сожалению, эта ошибка произошла:

Оператор запроса 'SequenceEqual' не поддерживается.

Ответы [ 3 ]

5 голосов
/ 20 декабря 2011

Было бы полезно узнать, откуда вы берете свои пользовательские записи (то есть, что такое "db.Users").

Независимо от того, какой поставщик linq вы используете (EF и т. Д.), Вероятно, не поддерживает использование SequenceEqual в запросе, поэтому вам нужно получить запись пользователя и проверить пароль:

var currentUser = db.Users.Single(u => u.UserName == form["username"]);
var hash = MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(form["password"]));

var passwordCorrect = currentUser.Password.SequenceEqual(hash);

Возможно, вы захотите быть более явным в своем сравнении "u.UserName ==", чтобы было очевидно, не зависит ли он от регистра / порядкового номера и т. Д.

Редактировать: ответ Флэтера также будет работать нормально, но лично я бы предпочел извлечь запись и проверить ее, так как вы можете захотеть узнать, существует ли пользователь на самом деле или нет (а не только, правильно ли указаны имя пользователя и пароль), поэтому Вы можете «заблокировать» учетные записи или предпринять другие (более полезные) действия в зависимости от количества попыток ввода неверного пароля.

1 голос
/ 20 декабря 2011

LINQ не допускает все виды функций / операторов в своих лямбда-выражениях. Это может быть довольно раздражающим время от времени. Я бы посоветовал найти способ хранения того, что вы хотите проверить в переменной, а затем просто проверить

... && u.Password = myVariable);
0 голосов
/ 26 декабря 2011

Почему бы не получить пользователя по имени, а затем сравнить его пароль с солью? Вид

var CurrentUser = db.Users
    .FirstOrDefault(u => u.UserName == form["username"]); 
if (CurrentUser == null || !CurrentUser.Password.SequenceEqual(
                   MD5.Create().ComputeHash(
                           Encoding.UTF8.GetBytes(form["password"])))) { ...user of password is incorrect.. }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...