Linq выполняет сравнение без учета регистра - PullRequest
5 голосов
/ 20 октября 2011

Я хочу, чтобы пользовательский объект только, когда точный пароль и регистр совпадает.Однако этот запрос извлекает результат, даже если регистр пароля не совпадает:

db.Users.Where(u => u.Username.ToLower() == username.ToLower() &&
                        u.Password == password).FirstOrDefault();

Чего мне не хватает?

Ответы [ 7 ]

7 голосов
/ 20 октября 2011

Самый простой способ - выполнить сопоставление имени пользователя в БД в соответствии с его правилами без учета регистра, а сопоставление пароля в .NET в соответствии с его правилами с учетом регистра:

db.Users.Where(u => u.Username == username).ToList().Where(u => u.Password == password).FirstOrDefault();

ToList() перемещается из дБна основе LINQ для объектно-ориентированного LINQ, и поскольку в любом случае будет только один соответствующий случай, влияние на производительность при этом будет незначительным.

Тем не менее все еще существует проблема сохранения пароля в базе данных!

3 голосов
/ 20 октября 2011

Если база данных настроена без учета регистра, то вы не можете заставить ее выполнить сравнение пароля с учетом регистра (если вы не прибегаете к трюкам TSQL ). Тем не мение! Вы не должны хранить пароль - вы должны хранить соленый хеш (в идеале соленый для пользователя). И хеш (как блоб) должен быть в порядке, чтобы сравнивать это.

2 голосов
/ 20 октября 2011

Попробуйте:

db.Users.Where(u => string.Compare(u.Username, username, System.StringComparison.OrdinalIngoreCase) == 0 &&
                    string.Compare(u.Password, password) == 0).FirstOrDefault();

Поскольку это выполняется в SQL, вы не можете использовать методы сравнения .NET / Linq.

1 голос
/ 20 октября 2011

Каков тип базы данных пароля и какую последовательность сопоставления вы используете?

Если это VARCHAR, и вы используете сортировку без учета регистра, то поведение, которое вы описываете, соответствует ожидаемому.

Последовательности сортировки по умолчанию для некоторых баз данных могут быть нечувствительными к регистру (например, взгляните на SQL SERVER - Сортировка - Чувствительный к регистру поиск запросов SQL ), поэтому вы можете использовать сортировку без учета регистра, даже не зная Это. Очевидно, вам нужно изменить параметры сортировки, чтобы получить правильные результаты.

1 голос
/ 20 октября 2011

Измените параметры сортировки столбца Password в таблице Users, чтобы использовать сортировку с учетом регистра, например Latin1_General_CS_AS.

Или, как прокомментировали другие, рассмотрите возможность изменения решения для хранения хешей паролей (например, хеша SHA1) и сравнения значений хеширования, а не текстовых паролей.

0 голосов
/ 20 октября 2011

попробуйте изменить вашу колонку следующим образом:

alter table [Users] alter column [password] nvarchar(100) collate Chinese_PRC_CS_AI
0 голосов
/ 20 октября 2011

Если u.Password и password имеют строковый тип, то ваш код должен работать как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...