使用PasswordRecovery控件
如果用户忘记了自己的登录密码,那么可以使用PasswordRecovery控件将密码找回。通过PasswordRecovery控件不但可以找回用户的原始密码,也可以对密码进行重置后再将新密码发送给用户。
代码清单1-34中的页面包含了一个PasswordRecovery控件。
代码清单1-34 ShowPasswordRecovery.aspx
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<style type="text/css">
.passwordRecovery
{
font:14px Verdana,Sans-Serif;
background-color:lightblue;
border:solid 3px black;
padding:4px;
}
.passwordRecovery_title
{
background-color:darkblue;
color:white;
font-weight:bold;
}
.passwordRecovery_instructions
{
font-size:12px;
text-align:left;
padding:10px;
}
.passwordRecovery_button
{
border:solid 1px black;
padding:3px;
}
</style>
<title>Show PasswordRecovery</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:PasswordRecovery
id="PasswordRecovery1"
CssClass="passwordRecovery"
TitleTextStyle-CssClass="passwordRecovery_title"
InstructionTextStyle-CssClass="passwordRecovery_instructions"
SubmitButtonStyle-CssClass="passwordRecovery_button"
Runat="server">
<MailDefinition
From="Admin@YourSite.com"
Subject="Password Reminder" />
</asp:PasswordRecovery>
</div>
</form>
</body>
</html>
在网页浏览器中访问代码清单1-34中的页面时,会出现一个要求输入用户名的表单提示框(见图1-15)。接下来,需要回答当初注册该用户时所输入的安全提示问题。如果安全提示问题回答正确,该用户的密码就会发送到用户注册信息中的电子邮件地址中。
在默认情况下,PasswordRecovery控件会首先重置用户的密码,再发送其自动生成的新密码。在下一节中,将介绍如何通过该控件找回用户的原始密码。
图1-15 通过PasswordRecovery控件找回丢失密码
注解 在使用PasswordRecovery控件之前,必须在该应用程序的Web配置文件中指定控件所使用的电子邮件服务设置。详细配置信息见1.3.2节。
1.7.1 找回用户的原始密码
在默认情况下,PasswordRecovery控件不会发送用户的原始密码。如果不希望在发送密码之前自动重置用户的密码,那么就必须改变Membership接口提供器的配置。其中三个相关的配置设置是passwordFormat、enablePasswordRetrieval和enablePasswordReset。
属性PasswordRecovery的默认值是Hashed。当密码被散列后,PasswordRecovery控件就不能发送用户的原始密码了,并且任何地方都不会保存有原始密码。从保护秘密安全的角度来看,这个限制是很有意义的。如果希望系统能向用户发送原始密码,那么就需要将passwordFormat属性设置为Clear或者Encrypted。
属性enablePasswordRetrieval的默认值是false。因此,如果希望向用户发送其原始密码,还必须在Web配置文件中启用这个属性。
最后,属性enablePasswordReset的默认值是true。不管属性passwordFormat或属性enablePassword- Retrieval的取值是什么,通过enablePasswordReset属性都能够重置用户的密码,并由电子邮件将新密码发送给用户。
允许发送用户原始密码的必要配置信息包含在代码清单1-35中的Web配置文件中。
代码清单1-35 Web.Config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<authentication mode="Forms" />
<membership defaultProvider="MyMembership">
<providers>
<add
name="MyMembership"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="LocalSqlServer"
passwordFormat="Clear"
enablePasswordRetrieval="true"
/>
</providers>
</membership>
</system.web>
</configuration>
代码清单1-35中的配置文件将以明文形式而非散列方式存储用户的密码。此外,该配置清单还启用了密码找回功能。
1.7.2 要求安全提示问题和答案
使用CreateUserWizard控件进行注册时,会要求填写一个安全提示问题及答案。PasswordRecovery控件将会显示一个包含安全提示问题的表单。如果不能提交正确的问题答案,系统就不会发送密码。
如果在进行找回密码操作时,并不希望用户回答安全提示问题,那么就修改Membership接口提供器的配置。代码清单1-36中Web配置文件的requiresQuestionAndAnswer属性就设置为false。
代码清单1-36 Web.Config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<authentication mode="Forms" />
<membership defaultProvider="MyMembership">
<providers>
<add
name="MyMembership"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="LocalSqlServer"
requiresQuestionAndAnswer="false"
/>
</providers>
</membership>
</system.web>
</configuration>
1.7.3 在PasswordRecovery控件中使用模板
如果你希望能完全自定义PasswordRecovery控件的外观,那么就需要使用模板。PasswordRecovery控件支持下列三类模板:
q UserNameTemplate
q QuestionTemplate
q SuccessTemplate
代码清单1-37中的页面展示了如何使用这三类模板。
代码清单1-37 PasswordRecoveryTemplate.aspx
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<style type="text/css">
html
{
font:12px Arial,Sans-Serif;
}
h1
{
font:bold 16px Arial,Sans-Serif;
color:DarkGray;
}
</style>
<title>PasswordRecovery Template</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:PasswordRecovery
id="PasswordRecovery1"
Runat="server">
<MailDefinition
From="Admin@YourSite.com"
Subject="Password Reminder"
BodyFileName="PasswordRecovery.txt" />
<UserNameTemplate>
<h1>User Name</h1>
<asp:Label
id="FailureText"
EnableViewState="false"
ForeColor="Red"
Runat="server" />
<br />
<asp:Label
id="lblUserName"
Text="Enter your user name:"
AssociatedControlID="UserName"
Runat="server" />
<br />
<asp:TextBox
id="UserName"
Runat="server" />
<br />
<asp:Button
id="btnSubmit"
Text="Next"
CommandName="Submit"
Runat="server" />
</UserNameTemplate>
<QuestionTemplate>
<h1>Security Question</h1>
<asp:Label
id="FailureText"
EnableViewState="false"
ForeColor="Red"
Runat="server" />
<br />
<asp:Label
id="Question"
Text="Enter your user name:"
AssociatedControlID="Answer"
Runat="server" />
<br />
<asp:TextBox
id="Answer"
Runat="server" />
<br />
<asp:Button
id="btnSubmit"
Text="Next"
CommandName="Submit"
Runat="server" />
</QuestionTemplate>
<SuccessTemplate>
<h1>Success</h1>
An email has been sent to your registered
email account that contains your user name
and password.
</SuccessTemplate>
</asp:PasswordRecovery>
</div>
</form>
</body>
</html>
UserNameTemplate中必须包含一个ID为UserName的控件。如果要显示错误提示信息,那么还需要包含一个ID为FailureText的文本显示控件。该模板还必须包含一个CommandName值为Submit的Button控件。
QuestionTemplate中必须包含ID分别为Question和Answer的两个控件。作为可选的设置项,如果要显示错误提示信息,那么就要包含一个ID为FailureText的文本显示控件。这个模板也必须包含一个CommandName值为Submit的Button控件。
而SuccessTemplate模板则不需要专门指定任何含有特定属性值的控件。
需要注意的是,代码清单1-37中的PasswordRecovery控件包含了用来指定自定义电子邮件通知信息的MailDefinition属性,该邮件通知信息包含在代码清单1-38中的文本文件中。
代码清单1-38 PasswordRecovery.txt
Here's your login information:
user name: <%UserName%>
password: <%Password%>
使用该控件恢复密码设置总结:
1.web.config设置(membership):
<membership defaultProvider="SQLMembershipProvider">
<providers>
<add name="SQLMembershipProvider"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="SQLMembershipConnString"
applicationName=".NET Pet Shop 4.0"
enablePasswordRetrieval="false" //该设置为true代表可以找到原始密码,false代表只能重新生 成密码
enablePasswordReset="true"
requiresQuestionAndAnswer="true" //该设置为true代表可以通过问答来恢复密码
requiresUniqueEmail="false"
minRequiredNonalphanumericCharacters="0"
passwordFormat="Clear"/> //注意密码加密方式只有为Clear或者Encrypted时才能恢复密码
</providers>
</membership>
2.web.config设置(system.net)
<system.net>
<mailSettings>
<smtp from="powerlei@126.com"> //这里为发送邮件的邮箱
<network host="smtp.126.com" password="*******" userName="powerlei" /> //邮箱用户名和密码,还有发送邮件服务器
</smtp>
</mailSettings>
</system.net>