Requête SQL Server ne correspondant pas à une colonne de type varbinary

J'utilise ces requêtes ci-dessous pour valider un user.

Cette requête fonctionne parfaitement dans SQL Server et dans mon site Web Asp.Net.

SELECT * FROM AdminUsers WHERE username = 'admin' COLLATE SQL_Latin1_General_CP1_CS_AS AND Password = (SELECT HASHBYTES('SHA1', 'admin123')) 

Cependant, quand je l'ai mis dans le code Asp.net / C # comme:

 dbManager.Command.CommandText = @"SELECT * FROM AdminUsers WHERE username= @UserName COLLATE SQL_Latin1_General_CP1_CS_AS AND Password = (SELECT HASHBYTES('SHA1', @Password))"; dbManager.Command.Parameters.AddWithValue("@userName", username); dbManager.Command.Parameters.AddWithValue("@Password", password); reader = dbManager.GetDataReader(); if (reader.Read() == true) { //USER VALIDATED } 

Cela ne correspond pas, donc pas sûr comment assigner le paramètre de mot de passe pour que cela fonctionne, juste pour confirmer que le mot de passe entré est correct. Et le type de données du Password dans la table SQL Server est VarBinary .

Aucune suggestion?

Le type de données de votre paramètre @Password n'est pas correct.

Dans votre premier exemple, 'admin123' est une string varchar ascii.

Dans votre code. @Password est une string de caractères. Par défaut, il est défini sur nvarchar string unicode. Ces hash à différentes valeurs, à savoir:

 select hashbytes('SHA1', 'admin123') select hashbytes('SHA1', N'admin123') 

résultats

 0xF865B53623B121FD34EE5426C792E5C33AF8C227 0xB7BC3A1B04D9E165C6762B0A1CDE5226DF5B6A6A 

Vous devez le définir sur un varchar SqlDbType:

 dbManager.Command.CommandText = @"SELECT * FROM AdminUsers WHERE username= @UserName COLLATE SQL_Latin1_General_CP1_CS_AS AND Password=(SELECT HASHBYTES('SHA1',@Password))"; dbManager.Command.Parameters.AddWithValue("@userName", username); dbManager.Command.Parameters.AddWithValue("@Password", password) .SqlDbType = SqlDbType.VarChar; reader = dbManager.GetDataReader(); if (reader.Read() == true) { //USER VALIDATED } 

@userName et @Password sont tous les deux nvarchar . HASHBYTES est très sensible à varchar vs nvarchar ; Dans votre exemple de travail, 'admin123' est varchar . Vous devrez spécifier explicitement ces parameters en tant que varchar (en définissant .DbType = System.Data.DbType.AnsiSsortingng ), ou (de preference) utiliser nvarchar (trop tard pour cela si hashed). Remarque: HASHBYTES par lui-même n'est probablement pas un excellent choix pour la cryptography.