Khi thành viên đăng ký trên trang web của bạn. Nhưng thành viên quyên mật khẩu họ sẽ có yêu cầu hệ thống gửi lại mật khẩu cho họ qua Email đã đăng ký. Bài viết này mình sẽ hướng dẫn các bạn thực hiện chức năng này.
Giả sử bạn có bảng TB_ThanhVien có các trường cơ bản như sau: TenDangNhap, MatKhau, Email. Khi thành viên có yêu cầu gửi lại mật khẩu cho họ bạn cần xây dựng Form để họ nhập địa chỉ Email đã đăng ký. Form được xây dựng có các thành phần cơ bản như sau:
1. Xây dựng Form
<asp:RequiredFieldValidator id="RequiredFieldValidator4" runat="server" ControlToValidate="txtEmail" Display="Dynamic" Font-Size="8pt"> <br />
* Bạn chưa nhập email
</asp:RequiredFieldValidator>
<asp:RegularExpressionValidator id="RegularExpressionValidator2" runat="server" ControlToValidate="txtEmail" Display="Dynamic" Font-Size="8pt" SetFocusOnError="True" ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"> <br>
*Email chưa hợp lệ
</asp:RegularExpressionValidator>
<asp:TextBox id="txtEmail" runat="server" CssClass="textForm" Width="282px" />
<asp:Button id="btnGuiYeuCau" runat="server" OnClick="btnGuiYeuCau_Click" Text="Gửi yêu cầu" />
Form mình xây dựng như hình minh họa sau
Trong code bạn cần thực hiện các hàm sau:
2. Viết các hàm tạo mật khẩu ngẫu nhiên và hàm mã hóa mật khẩu
Bạn cần gửi mật khẩu cho thành viên bằng một chuỗi ngẫu nhiên được lấy từ tập các ký tự alphabet và các số.
Hàm sau sẽ tạo hàm ngẫu nhiên với độ dài của chuỗi được truyền vào tham số, Và một hàm mã hóa chuỗi mật khẩu đó vì MatKhau trong Database bạn
cần mã hóa nó
public string CreateLostPassword(int PasswordLength)
{
string _allowedChars = "abcdefghijk0123456789mnopqrstuvwxyz";
Random randNum = new Random(); char[] chars = new char[PasswordLength];
int allowedCharCount = _allowedChars.Length;
for (int i = 0; i < PasswordLength; i++)
{
chars[i] = _allowedChars[(int)((_allowedChars.Length) * randNum.NextDouble())];
}
return new string(chars);
}
public string MaHoaMatKhau(string password)
{
UnicodeEncoding encoding = new UnicodeEncoding();
Byte[] hashBytes = encoding.GetBytes(password); // Compute the SHA-1 hash SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
Byte[] cryptPassword = sha1.ComputeHash(hashBytes);
return BitConverter.ToString(cryptPassword);
}
Tiếp theo bạn cần viết các hàm để đổi mật khẩu cho thành viên và hàm lấy TenDangNhap qua Email (Bạn phải đảm bảo Email là duy nhất - Có thể tạo bằng khóa Uniquy).
3. Các hàm truy vấn và cập nhật mật khẩuỞ đây mình viết bằng cách truy vấn trực tiếp trong câu lệnh. Bạn có thể sửa bằng cách
viết các Store để thực hiện
private void CapNhatMatKhau(string TenDangNhap, string MatKhau)
{
string connectString = @"Server =.\SQL2005;
Initial Catalog=DataBaseNamr;User ID=sa;Password=******";
string queryUpdate = @"UPDATE TB_ThanhVien SET MatKhau="+MatKhau+" WHERE TenDangNhap="+TenDangNhap;
SqlConnection conn = new SqlConnection(connectString);
try { conn.Open(); // Thực thi câu lệnh
Update SqlCommand cmdInsert = new SqlCommand(queryUpdate, conn); cmdInsert.ExecuteNonQuery();
}
catch (SqlException ex)
{
Console.WriteLine("Error: " + ex);
}
finally { conn.Close();
}
}
private DataTable LayTenDangNhap(string Email)
{
DataTable dtbTmp = new DataTable();
string connString = @"Server =.\SQL2005;Initial Catalog=DataBaseNamr;User ID=sa;Password=******";
string sql = @"SELECT TenDangNhap FROM TB_ThanhVien WHERE Email=" + Email;
SqlConnection conn = new SqlConnection(connString);
try {
// Mở kết nối
conn.Open();
SqlDataAdapter da = new SqlDataAdapter(sql, conn);
DataSet ds = new DataSet();
da.Fill(ds, "DangNhap");
dtbTmp = ds.Tables[0];
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
// Đóng kết nối
conn.Close();
}
return dtbTmp;
}
Tiếp theo mình cần viết các hàm lấy nội dung và thực hiện trong sự kiện của nut "Gửi yêu cầu".
4. Các hàm lấy nội dung gửi mail và thực hiện sự kiện ClickĐể thực hiện gửi mail mình sẽ dùng lớp System.Web.Mail. Và mình dùng Email mặc định để gửi mail là
admincnttvn@gmail.com (Bạn có thể thay bằng Mail của bạn) Các hàm được viết như sau:
private string NoiDungMail()
{
string NoiDung = "";
DataTable dtb = LayTenDangNhap(txtEmail.Text + "");
string MatKhauMoi = "", TenDangNhap = "";
if (dtb.Rows.Count > 0)
{
NoiDung = "Đây là Mail gửi đến từ website của Yourwebsite..<br>";
MatKhauMoi = CreateLostPassword(7); NoiDung += "Mật khẩu mới của bạn là: " + MatKhauMoi;
TenDangNhap = dtb.Rows[0]["TenDangNhap"]+"");
DoiMatKhau(TenDangNhap, MaHoaMatKhau(MatKhauMoi));
NoiDung += "<br>Sau khi đăng nhập bạn nˆn đổi lại mật khẩu để tiện cho việc đăng nhập lần tiếp theo";
NoiDung += "<br><br><hr>Vui lòng không trả lời Mail này!";
}
return NoiDung;
}
protected void btnGuiYeuCau_Click(object sender, EventArgs e)
{
MailMessage objEmail = new MailMessage();
DataTable dtb = LayTenDangNhap(txtEmail.Text + "");
if (dtb.Rows.Count > 0)
{
objEmail.To = txtEmail.Text + "";
objEmail.From = "admincnttvn@gmail.com";
objEmail.Subject = "Thông tin về mật khẩu của bạn";
objEmail.BodyEncoding = Encoding.UTF8;
objEmail.Body = NoiDungMail();
objEmail.Priority = MailPriority.High;
objEmail.BodyFormat = MailFormat.Html;
try { SmtpMail.Send(objEmail);
ScriptManager.RegisterStartupScript(this, this.GetType(), "redirectMe", "alert('Chúng tôi đã gửi mật khẩu cho bạn.\\n\\n Vui lòng check mail để lấy lại mật khẩu!');
location.href='LoginInfo.aspx';", true);
}
catch (Exception exc)
{
Response.Write("Send failure: " + exc.ToString());
}
}
else
{
ScriptManager.RegisterStartupScript(this, this.GetType(), "redirectMe", "alert('Email của bạn chưa đăng ký!');", true);
}
}
Trong hàm trên bạn thấy mình sử dụng hàm tạo mật khẩu CreateLostPassword(7) sẽ tạo cho Thành viên một mật khẩu mới có độ dài là 7 ký tự và các ký tự này được lấy ngấu nhiên trong dãy chữ và số.
Kết quả nhận được qua Email như sau: