2012-03-28 7 views
2

В настоящее время я делаю небольшой проект, поле пароля регистрации пользователя зашифровано в базе данных, поэтому мне нужно также аутентифицировать пользователей, используя алгоритм md5, но мой код не работает, когда я пытаюсь для ввода правильного пароля (незашифрованного), который он вводит, но позже я понял, что любой пароль, который я набираю, система примет его, даже если он не совпадает в базе данных.ASP.NET с использованием md5 для аутентификации пользователей

Вы можете мне помочь? Вот мой код:

protected void btnSubmit_Click(object sender, EventArgs e) 
    { 

     string pAssword = txtPassword.Text; 
     MD5CryptoServiceProvider encryptor = new MD5CryptoServiceProvider(); 
     byte[] encryptedValue; 
     UTF8Encoding encoder = new UTF8Encoding(); 
     encryptedValue = encryptor.ComputeHash(encoder.GetBytes(pAssword)); 

     DataSet ds = new DataSet(); 
     ds = (startWebService.getAllUsers()); 
     if (ds.Tables[0].Rows.Count > 0) 
     { 
      foreach (DataRow dRow in ds.Tables[0].Rows) 
      { 

       string userName = dRow["UserName"].ToString(); 
       string passWord = dRow["Password"].ToString(); 
       string acctNo = dRow["AccountNumber"].ToString(); 

       if (userName == txtUsername.Text.ToString() && acctNo == txtAcctNo.Text.ToString() && passWord == encryptedValue.ToString()) 
       { 
        FormsAuthentication.RedirectFromLoginPage(txtUsername.Text.ToString(), false); 
        lblError.Text = "You got it!"; 
        Response.Redirect("MyAccount.aspx"); 
       } 
       else 
       { 
        this.lblError.ForeColor = System.Drawing.Color.Red; 
        this.lblError.Text = "Either you have been type an incorrect network credentials or you have reached the maximum login attempts for your account.Please try again or contact the system administrator."; 

        startWebService.updateFailedLogin(txtAcctNo.Text.ToString(), txtUsername.Text.ToString()); 

       } 

      } 

     } 

    } 

мои веб-сервисы:

private DataSet GetDataSet(string strSPROC) 
    { 

     SqlConnection conn = new SqlConnection(connectionString); 
     SqlCommand cmd = conn.CreateCommand(); 
     cmd.CommandText = strSPROC; 
     conn.Open(); 
     SqlDataAdapter myDataAdapter = new SqlDataAdapter(); 
     myDataAdapter.SelectCommand = cmd; 
     DataSet dsMT = new DataSet(); 
     myDataAdapter.Fill(dsMT); 
     return dsMT; 
     conn.Close(); 
    } 
    [WebMethod] 
    public DataSet getAllUsers() 
    { 
     return GetDataSet("ELMS_ALLINTERNETUSERS"); 
    } 

Пожалуйста, помогите мне, я исправить это таким образом, что будет система принимает правильный эквивалент зашифрованного текста, например я печатаю : spain = wdhs3x9029, но я попытался ввести philippines, он также принимает.

ответ

3

Существует хороший встроенный метод для хеширования паролей (вы можете использовать MD5 с ним):

string encryptedValue = FormsAuthentication.HashPasswordForStoringInConfigFile(pAssword, "MD5"); 

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

MD5CryptoServiceProvider encryptor = new MD5CryptoServiceProvider(); 
UTF8Encoding encoder = new UTF8Encoding(); 

byte[] encryptedValueBytes = encryptor.ComputeHash(encoder.GetBytes(pAssword)); 
StringBuilder encryptedValueBuilder = new StringBuilder(); 
for (int i = 0; i < encryptedValueBytes.Length; i++) 
{ 
    encryptedValueBuilder.Append(data[i].ToString("x2")); 
} 
string encryptedValue = encryptedValueBuilder.ToString(); 

вместо простого .ToString() в массиве байт.

+0

Я получаю предупреждение от VS 2012 при использовании метода FormsAuthentication.HashPasswordForStoringInConfigFile, говорящего, что этот метод/класс устарел –

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