ASP.NET 成员资格 Part.3(LoginStatus、LoginView、PasswordRecovery)

       LoginStatus 控件是一个非常简单的控件。如果用户没有经过验证,它就显示一个登录链接;如果用户已经验证;则显示一个退出链接(退出链接自动调用 FormsAuthentication.SignOut())。

<asp:LoginStatus ID="LoginStatus1" runat="server" LoginText="Sign In" LogoutText="Sign Out"
 LogoutPageUrl="~/Default.aspx" LogoutAction="Redirect" />

定制 LoginStatus 控件所用到的属性

LoginText 如果用户没有登录,则显示该文本
LoginImageUrl 显示为登录链接图标的图片 URL
LogoutText 如果用户经过验证,显示该文本
LogoutImageUrl 显示为退出链接图标的图片 URL
LogoutAction 配置经过验证的客户单击退出链接时控件执行的动作。可选值:Refresh、Redirect(将页面重定向到 LogoutPageUrl 中配置的选项)、RedirectToLoginPage。
LogoutPageUrl 当用户单击退出链接并且 LogoutAction 设为 Redirect 时要重定向到的页面

LoginView 控件

       这个控件非常简单,但功能极其强大。它可以为匿名用户和已验证用户显示一系列不同的控件;它还可以根据用户不同的角色来显示不同的内容。

       LoginView 是一个模板控件,它有不同类型的模板,一个为匿名用户准备,一个为已验证用户准备,一个则基于用户角色。

       下面是一个简单的示例:

<asp:LoginView ID="LoginView1" runat="server">
    <AnonymousTemplate>
        <h2>You are anonymous</h2>
    </AnonymousTemplate>
    <LoggedInTemplate>
        <h2>You are logged</h2>
        Submit your comment:<asp:TextBox runat="server" ID="CommentText" /><br />
        <asp:Button runat="server" ID="SubmitCommentAction" Text="Submi" />
    </LoggedInTemplate>
</asp:LoginView>

        LoginView 控件支持 2 个事件,你开业在模板显示之前捕获它们:

  • ViewChanging:在控件显示另一个模板所定义的内容之前触发
  • ViewChanged:在控件把内容从一个模板切换到另外一个模板之后触发

PasswordRecovery 控件

       当用户忘记密码时,此控件就派上用场了。基本使用方式见下图自然明白(回答正确后,密码会自动发送到用户注册的邮箱):

       image image

       如果密码发送成功,控件会显示一个确认视图。任何关于邮件的配置都通过这个控件的属性来进行。不过要注意,只有没有散列化的密码才能发送给用户,因此成员资格提供程序必需配置为使用纯文本或者使用加密的方式来存储密码。如果配置时以散列码存储密码,它会自动生成一个新的,随机的密码发送给用户。

       产看下列代码:

<asp:PasswordRecovery ID="PasswordRecovery1" runat="server" BackColor="Azure" BorderStyle="Solid">
    <MailDefinition From="skysoot@3qq.com" Subject="Forgotten Password" Priority="High" />
    <TitleTextStyle Font-Bold="true" Font-Italic="true" BorderStyle="Dotted" />
    <TextBoxStyle BackColor="Yellow" BorderStyle="Double" />
    <FailureTextStyle Font-Bold="true" ForeColor="Red" />
</asp:PasswordRecovery>

image image

       这个控件需要一个 E-mail SMTP 服务器来发送 E-mail,它依赖于 System.Net.Mail 命名空间中的 SmtpClient 类,这个类可用于任意类型的应用程序。你可以在应用程序配置文件中这样配置:

<system.net>
  <mailSettings>
    <smtp deliveryMethod="Network" from="skysoot@3qq.com">
      <network host="localhost" port="25" defaultCredentials="true"/>
    </smtp>
  </mailSettings>
</system.net>

       PasswordRecovery 的子元素 MailDefinition 允许你设置基本的属性(见第一段代码片段)。同时,通过 BodyFileName 属性可以指定一个含有 E-mail 文本的文件,但此文件必需与包含这个控件的页面位于相同的目录。

       PasswordRecovery 控件也提供了许多的样式属性,与以前介绍的 Login 控件非常相似。具体可查阅 MSDN 文档。这个控件在密码恢复过程中也会触发几个事件,你可以捕获这些事件来完全自定义控件的行为。

PasswordRecovery 控件的事件:

VerifyingUser 控件检验用户名之前发生。
UserLookupError 如果文本框中输入的用户名在成员资格存储中不存在,这个事件在失败信息显示之前触发
VerifyingAnswer 用户提交时,会将问题的答案和成员资格存储中的答案进行比较。事件在比较动作之前触发
AnswerLookupError 用户提供的答案不正确,就触发此事件
SendingMail 确认完用户提交的问题正确之后,在 E-mail 发送之前触发
SendMailError 如果 E-mail 由于某种原因无法发送,这个事件被触发

       当捕获 SendingMail 事件时,你有机会在控件真正发送邮件给客户之前修改 Email 信息的内容。MailMessageEventArgs 参数包含一个 Message 属性,它代表着真正的 E-mail 信息。修改 Message 的属性,比如 Attachment 集合,可以添加一个附件,配置一个 CC 地址,或者其他任何与 Email 信息相关的事情。

PasswordRecovery 模板

       如果出于某种原因无法实现定制化,PasswordRecovery 也可以通过模板完全定制,它为每一个视图都提供了模板:

  • UserNameTemplate:包含了要求用户输入用户名时密码恢复流程第一步所显示的所有控件
  • QuestionTemplate:回答密码问题这一步骤所需要的所有控件
  • SuccessTemplate:密码成功发送给用户之后用来显示确认信息的所有控件

       每个模板都包含一些必需的控件(这点很好理解,否则相关视图根本无法工作)。一个使用模板的 PasswordRecovery 看上去会类似下面这样:

<asp:PasswordRecovery ID="PasswordTemplateCtrl" runat="server" OnSendingMail="PasswordTemplateCtrl_SendingMail">
    <MailDefinition From="pwd@apress.com" 
                    Priority="High" 
                    Subject="Important information" />
    <UserNameTemplate>
        <span style="text-align: center">
        <font face="Courier New">
            <h2>Forgotten your Password?</h2>
            Please enter your username:<br />
            <asp:TextBox ID="UserName" runat="server" />
            <br />
            <asp:Button ID="SubmitButton" CommandName="Submit" runat="server" Text="Next" />
            <br />
            <span style="color: red">
            <asp:Literal ID="FailureText" runat="server" />
            </span>
        </font>
        </span>
    </UserNameTemplate>
    <QuestionTemplate>
        <span style="text-align: center">
        <font face="Courier New">
            <h2>Forgotten your Password?</h2>
            Hello <asp:Literal ID="UserName" runat="server" />! <br />
            Please answer your password-question:<br />
            <asp:Literal ID="Question" runat="server" /><br />
            <asp:TextBox ID="Answer" runat="server" /><br />
            <asp:Button ID="NextButton" CommandName="Submit" runat="Server" Text="Send Answer" /><br />
            <asp:Literal ID="FailureText" runat="server" />
            </span>
        </font>
        </span>
    </QuestionTemplate>
    <SuccessTemplate>
        Your password has been sent to your email address
        <asp:Label ID="EmailLabel" runat="server" />!
    </SuccessTemplate>
</asp:PasswordRecovery>

       如果你为相应控件设置了正确的(约定好的ID 值和 CommandName 值,就不需要为控件编写代码,就好像没有使用过模板一样

PasswordRecovery 模板的特殊控件

额外模板

ID

控件类型

必需

说    明

UserNameTemplate UserName System.Web.UI.WebControls TextBox
UserNameTemplate SubmitButton Button、ImageButton、LinkButton Name 必需设为Submit
UserNameTemplate FailureText System.Web.UI.WebControls Literal
QuestionTemplate UserName System.Web.UI.WebControls Literal
QuestionTemplate Question System.Web.UI.WebControls Literal
QuestionTemplate Answer System.Web.UI.WebControls TextBox
QuestionTemplate SubmitButton Button、ImageButton、LinkButton Name 必需设为Submit
QuestionTemplate FailureText System.Web.UI.WebControls Literal

       SuccessTemplate 模板不需要任何具有特殊 ID 的控件,它可以添加任何控件,只是用来显示确认信息。上面的代码片段中,它用来显示密码已发送到的 E-mail 地址。你可以通过 SendingMail 事件函数来设置这个 Literal 控件:

protected void PasswordTemplateCtrl_SendingMail(object sender, MailMessageEventArgs e)
{
    Label lbl = (Label)PasswordTemplateCtrl.SuccessTemplateContainer.FindControl("EmailLabel");
    lbl.Text = e.Message.To[0].Address;
}

       这个控件包含不止一个模板,所以不能在 PasswordRecovery 控件实例中直接调用 FindControl(),必需选择合适的模板容器(UserNameTemplateContainer、QuestionTemplateContainer、SuccessTemplateContainer)。

原文地址:https://www.cnblogs.com/SkySoot/p/3012864.html