2010-07-28 3 views
5

Я реализовал запомнить меня вариант в моем asp.net веб-форму с помощью этого,asp.net «Запомнить меня» печенье

protected void LBtnSubmit_Click(object sender, EventArgs e) 
{ 
    if (this.ChkRememberme != null && this.ChkRememberme.Checked == true) 
    { 
    HttpCookie cookie = new HttpCookie(TxtUserName.Text, TxtPassword.Text); 
    cookie.Expires.AddYears(1); 
    Response.Cookies.Add(cookie); 
    } 
} 

я делаю это правильно? Любое предложение .. Я использую проверку подлинности Windows, и я являюсь not using asp.net membership ..

ответ

11

Вместо того, чтобы непосредственно хранить имя пользователя и пароль в файле 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); 
} 
+0

@ Erik i ve включил все это в класс .. Как использовать их на моей кнопке? –

+1

Я предполагаю, что вы имеете в виду свою кнопку входа в систему: в этом случае просто введите имя пользователя и пароль, как обычно, вызовите метод CreateAuthCookie, который будет передаваться в имени пользователя, пароле и соли (что на самом деле является любой произвольной строкой, поскольку вы используете один и тот же метод для каждого вызова метода) - тогда сделайте то, что вам нравится, с cookie, который возвращает метод. –

+1

Когда приходит время, чтобы узнать, зарегистрирован ли пользователь, вы просто найдете свой файл cookie по имени («YourSiteCookieNameHere») и вызовите метод IsValidAuthCookie для сравнения значений в этом файле cookie с фактическими данными аутентификации, хранящимися в вашем база данных. Не забывайте использовать ту же соль. –

4

Я не буду хранить пароль пользователей в cookie ... Скорее сохраните идентификатор пользователя и адрес ip в файле cookie.

+4

использование должно войти снова, если пользователь перейдет из офиса/дома wifi –

+0

не самая большая работа вокруг –

0

Я бы не хранить идентификатор IP/пользователя в куки. Сессия highjacking тогда была бы очень простой, я имею в виду, что я знаю имя пользователя/ip моих коллег, я мог бы добавить этот файл cookie к моему сообщению, а затем я могу работать на сессии моего коллеги.

Смежные вопросы