在Asp.net中重置密码不起作用

时间:2018-08-27 21:49:42

标签: c# sql asp.net

如果用户忘记了与用户名和完整密码匹配的密码,我试图允许用户重置/更新密码,以便重置密码。然而;我不断收到错误消息,用户名和名称不匹配,即使它们匹配。

 string strConnString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
string str = null;
SqlCommand com;
byte up;
protected void btn_update_Click(object sender, EventArgs e)
{
    SqlConnection con = new SqlConnection(strConnString);
    con.Open();
    try
    {
        string un, pw;
        un = txtUsername.Text;

        pw = Encrypt(txt_npassword.Text, "mykey");
        SqlCommand command = new SqlCommand("PP_spReset", con);

        command.CommandType = CommandType.StoredProcedure;
        command.Parameters.Add("@UserName", SqlDbType.VarChar).Value = un;

        command.Parameters.Add("@password", SqlDbType.VarChar).Value = pw;

        con.Open();


        int rowupdated = command.ExecuteNonQuery();
        if (rowupdated > 0)
        {
            Response.Redirect(@"~/Account/Login.aspx"); ;
        }
        else
        {
            lbl_msg.Text = "Username does not exist";
        }

    }
     catch (Exception ex)
    {
        throw ex;
    }

}

public string Encrypt(string source, string key)
{
    TripleDESCryptoServiceProvider desCryptoProvider = new TripleDESCryptoServiceProvider();
    MD5CryptoServiceProvider hashMD5Provider = new MD5CryptoServiceProvider();

    byte[] byteHash;
    byte[] byteBuff;

    byteHash = hashMD5Provider.ComputeHash(Encoding.UTF8.GetBytes(key));
    desCryptoProvider.Key = byteHash;
    desCryptoProvider.Mode = CipherMode.ECB; //CBC, CFB
    byteBuff = Encoding.UTF8.GetBytes(source);

    string encoded =
        Convert.ToBase64String(desCryptoProvider.CreateEncryptor().TransformFinalBlock(byteBuff, 0, byteBuff.Length));
    return encoded;
}

1 个答案:

答案 0 :(得分:0)

您的第一个问题是错误处理,由于要屏蔽它,所以无法知道错误是什么。

您有一些选择,但是您需要定义错误(我将其定义为e):

选项1-将其写到您的消息中(不应在生产环境中这样做,因为它会为客户端(潜在的黑客)提供过多有关您的基础结构的信息,但这只是一个开始)。

选项2-引发异常,让IIS决定要做什么。在DEV模式下,在配置文件中设置customErrors属性:

<customErrors mode="RemoteOnly"></customErrors>

选项3-发出友好消息,但将信息记录到服务器(文件)或数据库中。但是,该代码将根据您的实现方式而有所不同。

无论哪种方式,您都需要知道错误是什么,否则您将无法修复它。为简单起见,我有一个与#2有关的代码更新,但是在生产中,您最终应该真正使用#3。

catch (Exception e)
{
    throw e;
}

此外,您还有一个SQL注入问题,需要使用SQL参数来更正。以下是有关该主题的一些帖子:

  1. What is SQL injection?
  2. What are good ways to prevent SQL injection?