【问题标题】:Reset Password and send email重置密码并发送电子邮件
【发布时间】:2015-11-26 06:03:38
【问题描述】:

你能告诉我下面的代码有什么问题吗? 它用新密码更改密码,成功保存到数据库,向用户发送电子邮件但是当我尝试使用新密码登录时,我收到一个错误:

用户名或密码无效

protected void SendEmail(object sender, EventArgs e)
    {
        string username = string.Empty;
        string password = string.Empty;
        string newPassword = "temp_" + DateTime.Now.ToString("yyyyMMddHHmmss");

        var manager = new UserManager();
        string newPasswordHash = manager.PasswordHasher.HashPassword("newPassword");
        string constr = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
        using (SqlConnection con = new SqlConnection(constr))
        {
            using (SqlCommand cmd = new SqlCommand("SELECT Username, [PasswordHash] FROM AspNetUsers WHERE Email = @Email"))
            {
                cmd.Parameters.AddWithValue("@Email", txtEmail.Text.Trim());
                cmd.Connection = con;
                con.Open();
                using (SqlDataReader sdr = cmd.ExecuteReader())
                {
                    if (sdr.Read())
                    {
                        username = sdr["Username"].ToString();
                        password = sdr["PasswordHash"].ToString();
                    }
                }
                con.Close();
            }

            using (SqlCommand cmd = new SqlCommand("Update AspNetUsers set PasswordHash=@Password WHERE Email=@Email"))
            {

                cmd.Parameters.AddWithValue("@Password", newPasswordHash);


            }

        }
        if (!string.IsNullOrEmpty(password))
        {
            MailMessage mm = new MailMessage("****@gmail.com", txtEmail.Text.Trim());
            mm.Subject = "Password Recovery";
            mm.Body = string.Format("Your temporary password is {0}<br /><br /> You are advised to login and change it immediately.<br /><br />Thank You.", newPassword);
            mm.IsBodyHtml = true;
            SmtpClient smtp = new SmtpClient();
            smtp.Host = "smtp.gmail.com";
            smtp.EnableSsl = true;
            NetworkCredential NetworkCred = new NetworkCredential();
            NetworkCred.UserName = "*****@gmail.com";
            NetworkCred.Password = "*****";
            smtp.UseDefaultCredentials = true;
            smtp.Credentials = NetworkCred;
            smtp.Port = 587;
            smtp.Send(mm);
            lblMessage.ForeColor = Color.Green;
            lblMessage.Text = "A temporary password has been sent to your email address.";
        }
        else
        {
            lblMessage.ForeColor = Color.Red;
            lblMessage.Text = "This email address does not match our records.";
        }
}

login.aspx.cs 公共部分类 Account_Login :页面 { protected void Page_Load(object sender, EventArgs e) { RegisterHyperLink.NavigateUrl = "注册"; //OpenAuthLogin.ReturnUrl = Request.QueryString["ReturnUrl"]; var returnUrl = HttpUtility.UrlEncode(Request.QueryString["ReturnUrl"]); if (!String.IsNullOrEmpty(returnUrl)) { RegisterHyperLink.NavigateUrl += "?ReturnUrl=" + returnUrl; } }

    protected void LogIn(object sender, EventArgs e)
    {
        if (IsValid)
        {
            // Validate the user password
            var manager = new UserManager();
            ApplicationUser user = manager.Find(UserName.Text, Password.Text);
            if (user != null)
            {
                IdentityHelper.SignIn(manager, user, RememberMe.Checked);
                IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response);
            }
            else
            {
                FailureText.Text = "Invalid username or password.";
                ErrorMessage.Visible = true;
            }
        }
    }

}

【问题讨论】:

  • 您在哪里执行 update 命令

标签: asp.net passwords reset


【解决方案1】:

问题是您没有更新密码。下一行不会更新您的密码。它只会将参数添加到参数集合中。

using (SqlCommand cmd = new SqlCommand("Update AspNetUsers set PasswordHash=@Password WHERE Email=@Email"))
            {
              cmd.Parameters.AddWithValue("@Password", newPasswordHash);
            }

使用下面的代码

    using (SqlConnection con = new SqlConnection(constr))
            {
                using (SqlCommand cmd = new SqlCommand("Update AspNetUsers set PasswordHash=@Password WHERE Email=@Email"))
                {
                    cmd.Parameters.AddWithValue("@Email", txtEmail.Text.Trim());
                    cmd.Parameters.AddWithValue("@Password", newPasswordHash);
                    cmd.Connection = con;
                    con.Open();
                    int row=cmd.ExecuteNonQuery();
                    if(row==1)
                      {
                        //success
                      }
                    else
                     {
                       //failed
                     }
                }
            }

【讨论】:

  • 查看表格是否更新密码
  • 那么您的登录方法一定有问题。如果您添加该代码,我们可以检查发生了什么。
  • 我将 login.aspx.cs 添加到我的问题中。请告诉我它有什么问题?
  • 问题必须在 manager.find 方法中。您告诉密码 id 已更新。所以问题必须在您获取值的方法中。尝试调试并检查每个值
【解决方案2】:

在我的AspNetUsers 表中,“PasswordHash”数据类型为“nvarchar”,但您将“Password”定义并指定为“String”。 Nvarchar 存储 UNICODE 数据,而 String 存储 ASCII 数据。这可能是导致失败的原因。

【讨论】:

    猜你喜欢
    • 2013-12-18
    • 2015-08-13
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 2018-04-27
    相关资源
    最近更新 更多