Trong phần 3 này chúng ta sẻ tìm hiểu về cách thực thi việc buộc thành viên thay đổi mật khẩu khi mật khẩu đã quá hạn. Đối với người dùng Window thì đây không phải là công việc lạ lẫm gì, việc buộc người dùng phải thay đổi mật khẩu của mình, vì mục đích bảo mật.
Đầu tiên mình sẻ tạo 1 trang ChangePassword.aspx, trang này sẻ cho phép người dùng nhập mật khẩu mới.

Ở trang này mình sẻ dùng asp:ChangePassword user control và template lại với việc thêm 1 dòng username, như hình bên trên.
v à đây là code markup:
<asp:ChangePassword ID="ChangePassword1" runat="server">
<ChangePasswordTemplate>
<table cellpadding="1" cellspacing="0" style="border-collapse: collapse;">
<tr>
<td>
<table cellpadding="0">
<tr>
<td align="center" colspan="2">
Change Your Password
</td>
</tr>
<tr>
<td align="right">
<asp:Label ID="lblUser" runat="server" AssociatedControlID="txtUsername">User Name:</asp:Label>
</td>
<td>
<asp:TextBox ID="txtUsername" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td align="right">
<asp:Label ID="CurrentPasswordLabel" runat="server" AssociatedControlID="CurrentPassword">Password:</asp:Label>
</td>
<td>
<asp:TextBox ID="CurrentPassword" runat="server" TextMode="Password"></asp:TextBox>
<asp:RequiredFieldValidator ID="CurrentPasswordRequired" runat="server" ControlToValidate="CurrentPassword"
ErrorMessage="Password is required." ToolTip="Password is required." ValidationGroup="ChangePassword1">*</asp:RequiredFieldValidator>
</td>
</tr>
<tr>
<td align="right">
<asp:Label ID="NewPasswordLabel" runat="server" AssociatedControlID="NewPassword">New Password:</asp:Label>
</td>
<td>
<asp:TextBox ID="NewPassword" runat="server" TextMode="Password"></asp:TextBox>
<asp:RequiredFieldValidator ID="NewPasswordRequired" runat="server" ControlToValidate="NewPassword"
ErrorMessage="New Password is required." ToolTip="New Password is required."
ValidationGroup="ChangePassword1">*</asp:RequiredFieldValidator>
</td>
</tr>
<tr>
<td align="right">
<asp:Label ID="ConfirmNewPasswordLabel" runat="server" AssociatedControlID="ConfirmNewPassword">Confirm New Password:</asp:Label>
</td>
<td>
<asp:TextBox ID="ConfirmNewPassword" runat="server" TextMode="Password"></asp:TextBox>
<asp:RequiredFieldValidator ID="ConfirmNewPasswordRequired" runat="server" ControlToValidate="ConfirmNewPassword"
ErrorMessage="Confirm New Password is required." ToolTip="Confirm New Password is required."
ValidationGroup="ChangePassword1">*</asp:RequiredFieldValidator>
</td>
</tr>
<tr>
<td align="center" colspan="2">
<asp:CompareValidator ID="NewPasswordCompare" runat="server" ControlToCompare="NewPassword"
ControlToValidate="ConfirmNewPassword" Display="Dynamic" ErrorMessage="The Confirm New Password must match the New Password entry."
ValidationGroup="ChangePassword1"></asp:CompareValidator>
</td>
</tr>
<tr>
<td align="center" colspan="2" style="color: Red;">
<asp:Literal ID="FailureText" runat="server" EnableViewState="False"></asp:Literal>
</td>
</tr>
<tr>
<td align="right">
<asp:Button ID="ChangePasswordPushButton" runat="server" CommandName="ChangePassword"
Text="Change Password" ValidationGroup="ChangePassword1" />
</td>
<td>
<asp:Button ID="CancelPushButton" runat="server" CausesValidation="False" CommandName="Cancel"
Text="Cancel" />
</td>
</tr>
</table>
</td>
</tr>
</table>
</ChangePasswordTemplate>
</asp:ChangePassword>
Việc kiểm tra liệu user đó có hay không việc thay đổi mật khẩu được tiến hành khi SignUp và mình cũng tiến hành thực thi lại việc kiểm tra user đăng nhập:
protected void Login_OnClick(object sender, EventArgs e)
{
string passwordExpired = WebConfigurationManager.AppSettings["expired"];
TextBox txtUsr = (TextBox)LoginView1.FindControl("txtUsr");
TextBox txtPass = (TextBox)LoginView1.FindControl("txtPass");
CheckBox RememberMe = (CheckBox)LoginView1.FindControl("RememberMe");
Label FailureText = (Label)LoginView1.FindControl("FailureText");
if (Page.IsValid)
{
if (Membership.ValidateUser(txtUsr.Text, txtPass.Text))
{
MembershipUser mUser = Membership.GetUser(txtUsr.Text);
int days = Convert.ToInt32(DateTime.Now.Subtract(mUser.LastPasswordChangedDate).TotalDays);
if (days > Convert.ToInt32(passwordExpired))
{
Response.Redirect(String.Format("{0}{1}", "~/ChangePassword.aspx?UserName=", Server.UrlEncode(txtUsr.Text)));
}
else
{
FormsAuthentication.RedirectFromLoginPage(txtUsr.Text, RememberMe.Checked);
}
}
else
{
FailureText.Visible = true;
}
}
}
Trước khi thực thi đoạn code trên bạn sẻ phải chắc chắn rằng là bạn đã thêm 1 thiết lập expired mới trong web.config:
<appSettings>
<add key="expired" value="20"/>
</appSettings>
Đơn giản là sau khi chứng thực thành công, chúng ta sẻ lấy thông tin user thông qua hàm Membership.GetUser và tham số truyền vào là tên user hiện tại đang login và đem so sánh giá trị của thuộc tính LastPasswordChangedDate với giá trị expired trong phần appSetting, nếu như số ngày lớn hơn số ngày mà bạn config thì tiến hành chuyển user sang trang ChangePassword.aspx.
Hope this help