Вместо того, чтобы непосредственно хранить имя пользователя и пароль в файле cookie, сохраните имя пользователя и хэш пароля и соли в файле cookie, тогда, когда вы аутентифицируете cookie, получите пароль для данного имени пользователя, заново создайте хэш с паролем и той же солью и сравнить их.
Создание хэша так же просто, как хранение значений пароля и соли вместе в строке, преобразование строки в массив байтов, вычисление хеша массива байтов (с использованием MD5 или любого другого, что вы предпочитаете) и преобразование полученного хеша к строке (возможно, с помощью кодировки base64).
Вот пример кода:
// Create a hash of the given password and salt.
public string CreateHash(string password, string salt)
{
// Get a byte array containing the combined password + salt.
string authDetails = password + salt;
byte[] authBytes = System.Text.Encoding.ASCII.GetBytes(authDetails);
// Use MD5 to compute the hash of the byte array, and return the hash as
// a Base64-encoded string.
var md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] hashedBytes = md5.ComputeHash(authBytes);
string hash = Convert.ToBase64String(hashedBytes);
return hash;
}
// Check to see if the given password and salt hash to the same value
// as the given hash.
public bool IsMatchingHash(string password, string salt, string hash)
{
// Recompute the hash from the given auth details, and compare it to
// the hash provided by the cookie.
return CreateHash(password, salt) == hash;
}
// Create an authentication cookie that stores the username and a hash of
// the password and salt.
public HttpCookie CreateAuthCookie(string username, string password, string salt)
{
// Create the cookie and set its value to the username and a hash of the
// password and salt. Use a pipe character as a delimiter so we can
// separate these two elements later.
HttpCookie cookie = new HttpCookie("YourSiteCookieNameHere");
cookie.Value = username + "|" + CreateHash(password, salt);
return cookie;
}
// Determine whether the given authentication cookie is valid by
// extracting the username, retrieving the saved password, recomputing its
// hash, and comparing the hashes to see if they match. If they match,
// then this authentication cookie is valid.
public bool IsValidAuthCookie(HttpCookie cookie, string salt)
{
// Split the cookie value by the pipe delimiter.
string[] values = cookie.Value.Split('|');
if (values.Length != 2) return false;
// Retrieve the username and hash from the split values.
string username = values[0];
string hash = values[1];
// You'll have to provide your GetPasswordForUser function.
string password = GetPasswordForUser(username);
// Check the password and salt against the hash.
return IsMatchingHash(password, salt, hash);
}
@ Erik i ve включил все это в класс .. Как использовать их на моей кнопке? –
Я предполагаю, что вы имеете в виду свою кнопку входа в систему: в этом случае просто введите имя пользователя и пароль, как обычно, вызовите метод CreateAuthCookie, который будет передаваться в имени пользователя, пароле и соли (что на самом деле является любой произвольной строкой, поскольку вы используете один и тот же метод для каждого вызова метода) - тогда сделайте то, что вам нравится, с cookie, который возвращает метод. –
Когда приходит время, чтобы узнать, зарегистрирован ли пользователь, вы просто найдете свой файл cookie по имени («YourSiteCookieNameHere») и вызовите метод IsValidAuthCookie для сравнения значений в этом файле cookie с фактическими данными аутентификации, хранящимися в вашем база данных. Не забывайте использовать ту же соль. –