Я пытаюсь сделать простой вход в часть создаваемого приложения. Чтобы подтвердить вход, я просто пытаюсь убедиться, что хеш-значение введенного пароля совпадает с тем, что хранится в моей локальной базе данных: App_Users) '
ButtonClick:
string AppUsername = textBox2.Text.ToString();
string AppPassword = textBox1.Text.ToString();
//- Hashed-V-
byte[] salt;
new RNGCryptoServiceProvider().GetBytes(salt = new byte[16]);
var pbkdf2 = new Rfc2898DeriveBytes(AppPassword, salt, 10000);
byte[] hash = pbkdf2.GetBytes(20);
byte[] hashBytes = new byte[36];
Array.Copy(salt, 0, hashBytes, 0, 16);
Array.Copy(hash, 0, hashBytes, 16, 20);
string savedPasswordHash = Convert.ToBase64String(hashBytes); // <-- see ' https://stackoverflow.com/questions/4181198/how-to-hash-a-password ' for the part on comparing the recalculated
//-
SqlConnection con = new SqlConnection();
con.ConnectionString = ("Data Source=DESKTOP-PGHMM6M;Initial Catalog=LocalUsers;Integrated Security=True");
con.Open();
var cmd = new SqlCommand(@"SELECT Username, Hash FROM App_Users WHERE (Hash = @Hash");
cmd.Connection = con;
savedPasswordHash = cmd.ExecuteScalar() as string;
if (cmd.ExecuteNonQuery() > 0) {
MessageBox.Show(" Query successful..something matched.. ");
//change page.. load a profile?
}
Однако я получаю сообщение об ошибке:
'Must declare the scalar variable "@Hash".'
Я искал, но не уверен, что следующим шагом для того, что я пытаюсь сделать, является ... Извините, это, вероятно, плохой вопрос, с точки зрения sql. Думаю дело в переходнике?


Вы не передали значение параметра @Hash в запросе. И вы также должны проверить имя пользователя в запросе, иначе попытка входа в систему будет успешной, если вход в систему любой использует данный пароль.
Попробуйте что-нибудь вроде:
...
var cmd = new SqlCommand(@"SELECT Username, Hash FROM App_Users WHERE Hash = @Hash AND Username = @Username");
cmd.Connection = con;
cmd.Parameters.Add("@Hash", SqlDbType.VarChar, 48).Value = savedPasswordHash;
cmd.Parameters.Add("@Username", SqlDbType.NVarChar, 32).Value = AppUsername;
if (cmd.ExecuteNonQuery() > 0) {
...
Это предполагает, что App_Users.Hash - это VARCHAR(48), а App_Users - это NVARCHAR(32). Возможно, вам придется изменить его, чтобы он соответствовал типам данных, которые вы действительно используете.
Однозначно моя ошибка>. <Спасибо! он больше не выдает ошибок. Тем не менее, messageBox все еще не отображается. Есть ли какой-нибудь другой способ подтвердить, что он работает? (помимо Executenonquery)
если вы используете параметры, вам действительно нужно их добавить! См. docs.microsoft.com/en-us/dotnet/framework/data/adonet/…