本文档是 Visual Basic 教程 (转至 Visual C# 教程 )
本教程介绍如何构建一个网页 , 用于管理员管理用户的锁定和已批准状态。还将介绍如何只有在其电子邮件地址通过验证后,新用户才能通过批准。
<<前一篇教程|下一篇教程>>
简介除了用户名、密码和电子邮件外,每个用户帐户还有两个状态字段用于指示用户能否登录站点: 锁定和已批准。如果用户在指定的时间内提供的无效凭据达到指定次数,就会自动被锁定。锁定用户的默认设置是 10 分钟内 5 次登录失败。当新用户能够登录站点前必须采取某操作时,已批准状态很有用。例如,用户在能够登录前可能需要先由管理员验证其电子邮件地址或得到管理员的批准。 由于锁定的或未批准的用户无法登录,所以我们很自然想知道如何重置这些状态。 ASP.NET 不具备任何内置功能或 Web 控件用于管理用户的锁定和已批准状态,一部分原因在于这些决定需要根据每个站点的情况进行处理。有些站点可能自动批准所有新用户帐户(默认行为)。而有些站点可能需要管理员批准新帐户,或者只有在用户访问了发往注册时提供的电子邮件地址的链接后予以批准。同样,有些站点会锁定用户,直到管理员重设了用户状态;还有的站点向锁定的用户发送一封电子邮件,让他们访问邮件中的 URL 以解开锁定的帐户。 本教程介绍如何构建一个网页,用于管理员管理用户的锁定和已批准状态。还将介绍如何只有在其电子邮件地址通过验证后,新用户才能通过批准。 步骤1 : 管理用户的锁定和批准状态在《构建界面用以从多个用户中选择一个用户 》教程中 , 我们构建了一个页面 , 该页面使用分页筛选的GridView 列出了每个用户帐户。表格列出每个用户的姓名和电子邮件、他们的批准和锁定状态、当前是否在线、以及有关该用户的任何说明。要管理用户的批准和锁定状态,我们要让该表格可编辑。要更改用户的批准状态,管理员应首先定位该用户帐户,然后编辑相应的 GridView 行,勾选或取消批准复选框。或者,我们可通过单独的 ASP.NET 页面管理批准和锁定状态。 我们在本教程中使用两个 ASP.NET 页面: ManageUsers.aspx 和 UserInformation.aspx 。此处的想法是 ManageUsers.aspx 列出系统中的用户帐户,而 UserInformation.aspx 让管理员能够管理某个特定用户的批准和锁定状态。我们首先要做的是在 ManageUsers.aspx 中增加 GridView ,使其包含一个显示为链接列的 HyperLinkField 。我们想让每个链接都指向 UserInformation.aspx?user=UserName ,这里的 UserName 是要编辑的用户名称。 注意 : 如果您下载了《找回和更改密码 》教程中的代码 , 可能会注意到ManageUsers.aspx 页面已经含有一系列 “Manage” 链接 , 且UserInformation.aspx 页面提供更改选定用户密码的界面。我决定不在与本教程相关的代码中复制那个功能,因为通过公开避开 Membership API 和直接运行 SQL Server 数据库就可以更改用户密码。本教程从 UserInformation.aspx 页面开始。 向 UserAccounts GridView 添加 “Manage” 链接打开ManageUsers.aspx 页面并向 UserAccounts GridView 添加 HyperLinkField 。将 HyperLinkField 的 Text 属性设为 "Manage” ,其 DataNavigateUrlFields 和 DataNavigateUrlFormatString 属性分别设为 UserName 和 “UserInformation.aspx?user={0}” 。这些设置将 HyperLinkField 配置为所有超链接都显示文本 “Manage” ,但每个链接将适当的 UserName 值传入查询字符串。 向 GridView 添加完 HyperLinkField 后,要花点时间通过浏览器查看一下 ManageUsers.aspx 页面。如图 1 所示,每个 GridView 行现在都包括一个 “Manage” 链接。 Bruce 的 “Manage” 链接指向 UserInformation.aspx?user=Bruce ,而 Dave 的 “Manage” 链接指向 UserInformation.aspx?user=Dave 。 图1 :HyperLinkField 为每个用户帐户添加 “Manage” 链接(单击此处查看实际大小的图像 ) 我们将马上为UserInformation.aspx 页面创建用户界面和代码 , 不过现在我们先说说如何通过编码更改用户的锁定和批准状态。MembershipUser 类 有 IsLockedOut 和 IsApproved 属性 。 IsLockedOut 属性是只读的。没有通过编码锁定一个用户和解锁用户的机制。要使用 MembershipUser 类的 UnlockUser 方法 。 IsApproved 属性是可读写的。要保存对该属性的更改,我们需要调用 Membership 类的 UpdateUser 方法 ,传入修改后的 MembershipUser 对象。 因为 IsApproved 属性是可读写的,所以一个 CheckBox 控件或许是配置该属性的最佳用户界面元素了。但是, CheckBox 将对 IsLockedOut 属性不适用。因为管理员不能锁定用户,她只能解锁用户。适用于 IsLockedOut 属性的用户界面是一个 Button 。单击该按钮来解锁用户帐户。该 Button 应该只在用户被锁定时才会处于激活状态。 创建 UserInformation.aspx 页面我们现在可以在 UserInformation.aspx 中实施用户界面了。打开该页面并添加以下 Web 控件:
添加完这些控件后 ,Visual Studio 中的设计视图应类似于图 2 中的屏幕截图。 图2 :为 UserInformation.aspx 创建用户界面(单击此处查看实际大小的图像 ) 用户界面完成后 , 我们的下一个任务是根据选定用户的信息设置IsApproved CheckBox 和其它控件。为该页面的 Load 事件创建一个事件处理程序并添加以下代码:
通过确保首次访问页面而不是后续的回传来开始上述代码。它接着通过用户查询字符串字段读取传入的用户名,并通过 Membership.GetUser(username) 方法检索有关该用户帐户的信息。如果没有通过查询字符串提供的用户名,或者没有找到指定的用户,则管理员被送回到 ManageUsers.aspx 页面。 MembershipUser 对象的 UserName 值随后在 UserNameLabel 中显示,并根据 IsApproved 属性值选中 IsApproved CheckBox 。 MembershipUser 对象的 LastLockoutDate 属性 返回一个 DateTime 值,显示该用户上次被锁定的时间。如果用户从未被锁定,返回的值则取决于 Membership 提供者。创建新帐户时 ,SqlMembershipProvider 将 aspnet_Membership 表的 LastLockoutDate 字段设为 1754-01-01 12:00:00 AM 。如果 LastLockoutDate 属性值为 2000 年之前,上述代码在 LastLockoutDateLabel 中显示的是一个空字符串;否则, LastLockoutDate 属性的日期部分在 Label 中显示。将 UnlockUserButton 的 Enabled 属性设为用户的锁定状态,意味着该 Button 将只在用户被锁定的时才会处于激活状态。 现在花点时间通过浏览器测试一下 UserInformation.aspx 页面。当然,您需要从 ManageUsers.aspx 开始并选择要管理的用户帐户。进入 UserInformation.aspx 页面时,注意,只有该用户通过批准时, IsApproved CheckBox 才处于选中状态。如果该用户被锁定,则显示其上次被锁定的日期。 .Unlock User 按钮只在用户当前被锁定时才会处于激活状态。选中或取消 IsApproved CheckBox ,或者单击 Unlock User 按钮将导致页面回传,但不会更改用户帐户,因为我们还要为这些事件创建事件处理程序。 回到 Visual Studio 并为 IsApproved CheckBox 的 CheckedChanged 事件和 UnlockUser Button 的 Click 事件创建事件处理程序。在 CheckedChanged 事件处理程序中,将用户的 IsApproved 属性设为 CheckBox 的 Checked 属性,然后通过调用 Membership.UpdateUser 来保存更改;而在 Click 事件处理程序中,只是调用 MembershipUser 对象的 UnlockUser 方法。在这两个事件处理程序中,都要在 StatusMessage Label 中显示相应的消息。
测试UserInformation.aspx 页面这些事件处理程序就绪后 , 重新访问该页面和未批准的某个用户。如图 3 所示,您在页面上应看见一条简短的消息,指出该用户的 IsApproved 属性已被成功修改。 图3 :Chris 处于未批准状态(单击此处查看实际大小的图像 ) 接下来 , 注销并试着以刚才被修改为未批准的用户名登录。由于该用户未批准,因此不能登录。默认情况下,不管是什么原因, Login 控件都会显示一样的提示消息。不过在《根据 Membership 用户存储验证用户凭据 》教程中,我们介绍了如何改进 Login 控件以显示更恰当的消息。如图 4 所示,消息显示由于帐户还未通过批准,所以 Chris 不能登录系统。 图4 :Chris 不能登录,因为其帐户未经批准(单击此处查看实际大小的图像 ) 要测试锁定功能 , 试着以通过批准的帐户登录 , 不过使用错误的密码。重复使用错误密码登录,直到让帐户锁定。还要更新 Login 控件,使得在尝试以锁定的帐户登录时显示自定义的消息。在登录页面后看到以下信息时,您就知道帐户被锁定了: “Your account has been locked out because of too many invalid login attempts. Please contact the administrator to have your account unlocked. 返回到ManageUsers.aspx 页面 , 并单击锁定用户的 Manage 链接。如图 5 所示,您将看到在 LastLockedOutDateLabel 里有一个时间值,同时 Unlock User 按钮处于激活状态。单击 Unlock User 按钮来对用户帐户解除锁定。这样该用户就又可以登录系统了。 图5 :Dave 被系统锁定(单击此处查看实际大小的图像 ) 步骤2 : 指定新用户的批准状态批准状态在某些情况下有用 : 想在新帐户可以登录站点之前先执行某些操作或访问与具体用户相关的某些功能。举例来说,您正在运行一个个人站点,除了登陆页面和注册页面外,只有经过验证的用户才能访问所有的页面。但是假如一个陌生人访问你的站点,发现了注册页面,并创建了一个新帐户,那会发生什么情况呢? 要避免这样的事情发生,你可以将注册页面放到 Administration 文件夹,要求由管理员手动创建新帐户。或者,你可以允许任何人注册,但只有通过管理员批准后才能登录站点。 默认状态下, CreateUserWizard 控件将批准通过新帐户。可以使用控件的DisableCreatedUser 属性 来配置该行为。将该属性设为 True ,新用户帐户则不能通过批准。 注意 : 默认状态下, CreateUserWizard 控件将自动登录新用户帐户。该行为由控件的LoginCreatedUser 属性 来控制。因为未批准用户不能登录到站点,所以,当 DisableCreatedUser 为 True 时,新用户帐户无法登录到站点,不管 LoginCreatedUser 属性的值为多少。 如果你是使用 Membership.CreateUser 方法通过编码来创建新帐户,要想创建一个未批准的用户帐户,可以使用接受新用户的 IsApproved 属性值作为输入参数的一个重载方法。 步骤3 : 通过验证用户的电子邮件地址来批准用户很多支持用户帐户的站点只有在验证了用户注册时提供的电子邮件地址后才会批准新用户。这个验证过程通常用来应对僵尸程序、垃圾邮件散播者和其他无聊者,因为它要求提供一个唯一的、有效的电子邮件地址,在注册过程中多了一个步骤。有了这种模式,当新用户注册时,就要向用户发送一个邮件,邮件里包含一个到验证页面的链接。用户访问该链接就证明该用户收到了邮件,从而说明用户提供的是有效的邮件地址。验证页面负责批准该用户。这个过程可以是自动发生的,只要用户到达该页面就会通过批准,或只有当用户提供某些其他信息时,比如一个 CAPTCHA ,才通过批准。 为适应这个流程,我们需要首先更新帐户创建页面,使新用户未批准。打开 Membership 文件夹里的 EnhancedCreateUserWizard.aspx 页面,并将 CreateUserWizard 控件的 DisableCreatedUser 属性设为 True 。 接着,我们需要配置 CreateUserWizard 控件向新用户发送电子邮件,内容包含如何验证用户帐户的说明。具体来说,我们将在邮件中包含一个到 Verification.aspx 页面的链接(我们目前还没创建它),通过查询字符串传入新用户的 UserId 。 Verification.aspx 页面将查找指定的用户,并将它们标记为已批准。 向新用户发送验证电子邮件要从 CreateUserWizard 控件发送电子邮件,需要正确配置其 MailDefinition 属性。正如我们在上一篇教程 中讨论的那样, ChangePassword 和 PasswordRecovery 控件都包括一个 MailDefinition 属性 ,其用法和 CreateUserWizard 控件的用法一样。 注意 : 要使用 MailDefinition 属性,您需要在 Web.config 中指定邮件交付选项。更多信息请参阅在 ASP.NET 中发送电子邮件 。 首先在 EmailTemplates 文件夹中创建一个名为 CreateUserWizard.txt 的新电子邮件模板。对模板使用如下文本:
将MailDefinition 的 BodyFileName 属性设为“~/EmailTemplates/CreateUserWizard.txt” , 其 Subject 属性设为 “Welcome to My Website!Please activate your account. 请注意 ,CreateUserWizard.txt 电子邮件地址包括一个 <%VerificationUrl%> 占位符。这是 Verification.aspx 页面所在的 URL 。 CreateUserWizard 自动用新帐户的用户名和密码取代 <%UserName%> 和 <%Password%> 占位符,不过没有内置的 <%VerificationUrl%> 占位符。我们需要手动用适当的验证 URL 来取代它。 为此,我们为 CreateUserWizard 的 SendingMail 事件创建一个事件处理程序并添加以下代码:
SendingMail 事件发生在 CreatedUser 事件之后 , 意味着执行上述事件处理程序时就已经创建了新的用户帐户。我们可以通过调用 Membership.GetUser 方法来获取新用户的 UserId 值,将输入的 UserName 传入 CreateUserWizard 控件。接下来生成验证 URL 。 Request.Url.GetLeftPart(UriPartial.Authority) 语句返回 URL 的 http://yourserver.com 部分,而 Request.ApplicationPath 返回该应用程序根目录的路径。验证 URL 随后被定义为 Verification.aspx?ID=userId 。再将这两个字符串连接起来形成最终的 URL 。最后,将电子邮件正文 (e.Message.Body) 中所有的 <%VerificationUrl%> 替换成完整的 URL 。 实际结果是新用户未通过批准,意味着他们不能登录到站点。此外,会自动向用户发送一个电子邮件,内含一个到验证 URL 的链接(见图 6 )。 图6 :新用户收到含有到验证 URL 链接的电子邮件(单击此处查看实际大小的图像 ) 注意 :CreateUserWizard 控件的默认 CreateUserWizard 步骤显示一个消息提示用户 , 他们的帐户已经创建好了 , 并显示一个 Continue 按钮。单击它将把用户带到控件的 ContinueDestinationPageUrl 属性所指定的 URL 。 EnhancedCreateUserWizard.aspx 里的 CreateUserWizard 被配置为将新用户导航到 ~/Membership/AdditionalUserInfo.aspx ,该页面提示用户提供其家乡、主页 URL 和签名。因为只有登录成功的用户才能添加这些信息,所以我们要对该属性进行更新,让用户回到站点的主页 (~/Default.aspx) 。另外,应对 EnhancedCreateUserWizard.aspx 页面或 CreateUserWizard 步骤进行修改,以通知用户已经向他们发送了一个确认邮件,他们只有遵照邮件内的说明,其帐户才能被激活。我把这些修改作为练习留给读者。 创建验证页面我们的最后一个任务是创建 Verification.aspx 页面。将该页面放在根目录下,并将其与 Site.master 母版页相关联。正如我们对以前添加到站点的内容页面所做的那样,去掉引用 LoginContent ContentPlaceHolder 的那个 Content 控件,这样内容页才能使用母版页的默认内容。 将 Web 标签控件添加到 Verification.aspx 页面,将其 ID 设为 StatusMessage 并清除其文本属性。接下来,创建 Page_Load 事件处理程序,添加如下代码 :
上述代码验证了通过查询字符串提供的UserId 存在且为一个有效的 Guid 值 , 它引用一个现有的用户帐户。如果这些检查都通过了,则该用户帐户通过批准;否则,会显示一个相应的状态消息。 图 7 显示的是通过浏览器访问的 Verification.aspx 页面。 图7 :新用户的帐户现在通过了批准(单击此处查看实际大小的图像 ) 小结所有的Membership 用户帐户都有决定用户能否登录到站点的两个状态 :IsLockedOut 和IsApproved 。只有这两个属性都为 True 时,用户才能登录到站点。 用户的锁定状态用作一种安全措施,可减少黑客通过暴力方法强行进入系统的可能性。具体来说,在一定的时间内试图登录失败的次数达到一定次数后,该用户即被锁定。可通过 Web.config. 中的 Membership 提供者设置来配置这些限制条件。 已批准状态常用来阻止新用户登录站点,直到其执行了一些行为。站点可能要求新帐户首先由管理员进行批准,或如我们在第 3 步里看到的那样,对用户提供的电子邮件地址进行验证。 快乐编程!
|