En lugar de almacenar directamente el nombre de usuario y la contraseña en la cookie, almacene el nombre de usuario y un hash de la contraseña y un salt en la cookie, luego cuando autentique la cookie, recupere la contraseña del nombre de usuario dado, vuelva a crear el hash con la contraseña y la misma sal y compararlos.
Crear hash es tan simple como almacenar la contraseña y los valores de sal juntos en una cadena, convertir la cadena en una matriz de bytes, calcular el hash de la matriz de bytes (usando MD5 o lo que prefiera) y convertir el hash resultante a una cadena (probablemente a través de la codificación base64).
Aquí hay un código de ejemplo:
// 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 he incluido todos estos en una clase .. ¿Cómo usarlos en mi botón clic? –
Supongo que quiere decir su botón de inicio de sesión: en ese caso, simplemente obtenga el nombre de usuario y la contraseña como lo haría normalmente, llame al método 'CreateAuthCookie' pasando el nombre de usuario, contraseña y sal (que en realidad es cualquier cadena arbitraria, siempre como usa el mismo para cada llamada a método), haga lo que quiera con la cookie que devuelve el método. –
Cuando llega el momento de ver si el usuario ya inició sesión, solo encuentra su cookie por nombre (el 'YourSiteCookieNameHere'), y llama al método 'IsValidAuthCookie' para comparar los valores en esa cookie con los datos de autenticación reales almacenados en su base de datos. No te olvides de usar la misma sal. –