2012-05-29 3 views
0

Возможно, я просто не искал правильные параметры, но я просто не могу понять, что это такое.
Я создал хешированный пароль, который, по моему мнению, должен быть байтовым массивом. Затем мне нужно вставить это в SqlDataSource и там, где моя проблема.Проблемы с вставкой байта [] в SqlDataSource ASP.Net

У меня вопрос:

 
**Column** || **Data Type** 
---------------------------- 
Name  || varchar(50) 
Username || varchar(50) 
HashedPwd || varbinary(50) 
Salt  || varbinary(50) 
UserType || varchar(50)

Мой код выглядит следующим образом;

HashAlgorithm hashing = new SHA256Managed(); 
byte[] passwordPlainText = (new System.Text.ASCIIEncoding()).GetBytes(txtPassword.ToString()); 
byte[] salt = (new System.Text.ASCIIEncoding()).GetBytes(RNGCryptoServiceProvider.Create().ToString()); 
// Combine salt and password before hashing. 
byte[] saltAndPwd = new byte[passwordPlainText.Length + salt.Length]; 
Array.Copy(passwordPlainText, saltAndPwd, passwordPlainText.Length); 
Array.Copy(salt, 0, saltAndPwd, passwordPlainText.Length, salt.Length); 
byte[] hashedPwd = hashing.ComputeHash(saltAndPwd); 

database.InsertCommandType = SqlDataSourceCommandType.Text; 
database.InsertCommand = "INSERT INTO userlist (Name, Username, HashedPwd, Salt, Type) VALUES (@insName, @insUsername, @insHashedPass, @insSalt, @insType);"; 
database.InsertParameters.Add("insName", txtName.Text); 
database.InsertParameters.Add("insUsername", txtUsername.Text); 
database.InsertParameters.Add("insHashedPass", (new System.Text.ASCIIEncoding()).GetString(hashedPwd)); 
database.InsertParameters.Add("insSalt", (new System.Text.ASCIIEncoding()).GetString(salt)); 
database.InsertParameters.Add("insType", txtType.Text); 
database.Insert(); 

база данных вещи, что я почерпнутые из исследования в Интернете и видеть, какие варианты я дал с удобной функцией автозаполнения в Visual Studio.
FYI Я использую Visual Studio 2010 версии 10.0.4, .Net Версия 4.0.3
Кажется, есть некоторые внешние библиотеки для SQL-соединений, но я бы предпочел просто использовать встроенный материал, который предоставляет .Net.

В настоящий момент я получаю эту ошибку при запуске алгоритма вставки;
Неявное преобразование из типа данных nvarchar в varbinary не допускается. Используйте функцию CONVERT для запуска этого запроса.
Я не уверен, как использовать функцию преобразования.
Метод Add() может принимать строку, такую ​​как строка, как я сейчас делаю, или она может также принимать строку, DbType, string. Я пробовал database.InsertParameters.Add("insSalt", DbType.Binary, salt);, но я даже не могу скомпилировать/создать сайт. Я получил; «Невозможно преобразовать из байта [] в строку».
Если я изменю его на salt.ToString() Я получаю; «Не удалось преобразовать значение параметра из строки в Btye []» в строке Insert().

Так что да ... действительно потеряно, любая помощь будет принята с благодарностью.

ответ

2

Вам не нужен SqlDataSource, он предназначен для управления данными. Что вам нужно - SqlConnection & SqlCommand. Вот что вы делаете:

...your hashing code here... 

using (SqlConnection conn = new SqlConnection("Data Source=.; Initial Catalog=test; Integrated Security=SSPI;")) 
{ 
    var command = conn.CreateCommand(); 
    command.CommandText = "INSERT INTO userlist (Name, Username, HashedPwd, Salt, UserType) VALUES (@insName, @insUsername, @insHashedPass, @insSalt, @insType);"; 
    command.CommandType = System.Data.CommandType.Text; 

    command.Parameters.Add(new SqlParameter("insName", txtName.Text)); 
    command.Parameters.Add(new SqlParameter("insUsername", txtUsername.Text)); 
    command.Parameters.Add(new SqlParameter("insHashedPass", hashedPwd)); 
    command.Parameters.Add(new SqlParameter("insSalt", salt)); 
    command.Parameters.Add(new SqlParameter("insType", txtType.Text)); 

    conn.Open(); 
    command.ExecuteNonQuery(); 
} 

Также обратите внимание, что я изменился «Type» в «UserType» в тексте команды, чтобы соответствовать вашему определению DB таблицы. Разумеется, вам потребуется заменить строку подключения, чтобы она соответствовала вашей.

+0

ОК, этот код работает. Спасибо за это. Не могли бы вы пояснить, почему я не использую SqlDataSource? Использую ли я SqlDataSource для доступа к GridView, который отображает пользователей и типы из базы данных? Это то, как он читает, когда я просматриваю эту страницу; http://www.asp.net/web-forms/tutorials/moving-to-aspnet-20/data-bound-controls – FizzBuzz

+0

Добро пожаловать. Цитирование MSDN, SqlDataSource _ "Представляет базу данных SQL для элементов управления, привязанных к данным.«Итак, да, вы можете использовать его для передачи данных туда и обратно между ним и GridView, поскольку GridView _is_ связан с привязкой к данным. Здесь, с другой стороны, вы просто сохраняете некоторые данные (не из какого-либо элемента управления) к таблице db. – m1kael

+0

Ahh отлично, спасибо за разъяснение. – FizzBuzz

0

У меня была аналогичная проблема в последнее время. Вам нужно проверить класс, создающий хеш, чтобы узнать, каков тип возврата.

Если тип возвращаемого значения строки, то вы не сможете назначить:

байт [] hashedPwd = hashing.ComputeHash (saltAndPwd);

+0

Довольно уверен, что VS сообщит мне, если это проблема. Тем не менее, я проверил, ComputeHash (byte []) возвращает байт [] – FizzBuzz