5

これを使用して、asp.netWebフォームにremembermeオプションを実装しました。

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..

4

3 に答える 3

12

ユーザー名とパスワードを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);
}
于 2010-07-28T17:56:26.813 に答える
4

ユーザーのパスワードをCookieに保存しません...むしろ、ユーザーIDとIPアドレスをCookieに保存します。

于 2010-07-28T17:34:07.707 に答える
0

IP/ユーザーIDをCookieに保存しません。そうすれば、セッションのハイジャックは非常に簡単になります。つまり、同僚のユーザー名/ IPを知っているので、そのCookieをメッセージに追加して、同僚のセッションに取り組むことができます。

于 2013-04-17T18:57:26.877 に答える