ASP.NET 成员资格 Part.5(Membership 类)

       使用底层的成员资格编程接口可以执行下面的基本操作:

  • 创建新用户
  • 删除已存在的用户
  • 更新已存在的用户
  • 获得用户列表
  • 获得某用户的详细信息
  • 对存储验证用户凭证

       这个底层接口供此系列所介绍过的所有控件以及整个成员资格 API 架构使用。它包含了:

  • Membership 类:拥有若干属性和方法。很多方法接收一个 MembershipUser 的实例作为参数,或者返回一个或一组 MembershipUser 实例
  • MembershipUser 类:包含一个单独用户的所有属性。

       Membership 和 MembershipUser 在应用程序和实际的提供程序之间提供了必需的抽象层。Membership 类做的一切都和提供程序无关,也就是说,修改底层的成员资格提供程序,且新的提供程序的实现是完整的支持 MembershipProvider 基类所提供的所有功能,那么应用程序就不会受影响。

 

1. 从存储中获得用户

       通过 Membership 类从成员资格存储中获得一个单独用户和用户列表并绑定到网格上:

<asp:GridView ID="GridView1" runat="server" DataKeyNames="UserName" AutoGenerateColumns="false">
    <Columns>
        <asp:BoundField DataField="UserName" HeaderText="Username" />
        <asp:BoundField DataField="Email" HeaderText="Email" />
        <asp:BoundField DataField="CreationDate" HeaderText="Creation Date" />
        <asp:CommandField ShowSelectButton="true" />
    </Columns>
</asp:GridView>

       GridView 将 UserName 字段定义为 DataKeyNames,这样就通过网格的 SelectedValue 属性直接获得当前选中用户的 UserName 值。这很有用,因为大多数的方法都需要用户名来获得更多的信息。

       隐藏代码文件中开始编写代码绑定用户群:

MembershipUserCollection users = null;
 
protected void Page_Load(object sender, EventArgs e)
{
    users = Membership.GetAllUsers();
    GridView1.DataSource = users;
 
    if (!this.IsPostBack)
    {
        GridView1.DataBind();
    }
}

image

       这非常简单。如果你还想显示某个选中用户的详细信息,只需在先前页面上添加几个控件来显示选中用户的内容即可:

Selected User:<br />
<table border="1" bordercolor="blue">
    <tr>
        <td>UserName:</td><td><asp:Label ID="lblUserName" runat="server" /></td>
        <td>Email:</td><td><asp:Label ID="lblEmail" runat="server" /></td>
    </tr>
    <tr>
        <td>Password Question:</td><td><asp:Label ID="lvlPwdQuestion" runat="server" /></td>
        <td>Last Login Date:</td><td><asp:Label ID="lblLastLogin" runat="server" /></td>
    </tr>
    <tr>
        <td colspan="2"><asp:CheckBox ID="chkIsApproved" runat="server" Text="Approved" /></td>
        <td colspan="2"><asp:CheckBox ID="chkIsLockedOut" runat="server" Text="Locked Out" /></td>
    </tr>
</table>
protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (GridView1.SelectedIndex >= 0)
    {
        MembershipUser current = users[GridView1.SelectedValue.ToString()];
 
        lblUserName.Text = current.UserName;
        lblPwdQuestion.Text = current.PasswordQuestion;
        lblLastLogin.Text = current.LastLoginDate.ToShortDateString();
        lblEmail.Text = current.Email;
        chkIsApproved.Checked = current.IsApproved;
        chkIsLockedOut.Checked = current.IsLockedOut;
    }
}

image

       MembershipUserCollection 对象需要通过用户名来直接访问用户。Membership 的 GetUser() 也需要用户名。因此,用 UserName 字段作为 GridView 控件的 DataKeyNames 属性的内容。

 

2. 更新存储中的用户

       一旦有了用户实例,执行更新用户信息也是非常的简单。在页面上合适处添加一个按钮,执行下列处理程序:

protected void btnUpdate_Click(object sender, EventArgs e)
{
    if (GridView1.SelectedIndex>0)
    {
        MembershipUser current = users[GridView1.SelectedValue.ToString()];
 
        current.Email = txtEmail.Text;
        current.IsApproved = chkIsApproved.Checked;
 
        Membership.UpdateUser(current);
        GridView1.DataBind();
    }
}

 

3. 创建和删除用户

       创建用户的界面设计这里就不再啰嗦了。执行程序可以向下面这样:

protected void btnCreateUser_Click(object sender, EventArgs e)
{
    try
    {
        // MembershipCreateStatus: 描述 Membership.CreateUser() 操作的结果
        // 这是一个枚举,有多种状态值
        MembershipCreateStatus status;
 
        Membership.CreateUser(
            txtUserName.Text,
            txtEmail.Text,
            txtPwd.Text,
            txtPwdQuestion.Text,
            txtAnswer.Text,
            true,
            out status);
        lblStatus.Text = "User created successfully!";
    }
    catch (Exception ex)
    {
        Debug.WriteLine("Exception: " + ex.Message);
        lblStatus.Text = "Unable to create user!";
    }
}

       CreateUser() 有 4 个重载的版本,其中最简单的只需要用户名和密码,最复杂的重载模式则需要一个密码问题和答案。

       CreateUser() 返回一个用户新实例,你可以添加进用户集合或作其他的处理,或者,根本不保存这个返回的实例引用。

       MembershipCreateStatus 枚举反应了用户创建状态的额外信息。

       注意,调用 CreateUser() 方法可能失败也可能成功,这取决于提供程序的配置。默认的成员资格提供程序需要你包含一个密码问题和答案。

       删除用户一样简单,调用 Membership.DeleteUser() 即可,需要传递一个用户名作为参数。

 

4. 检验用户

       Membership 类提供了检验成员资格的方法。如果用户在登录页面输入了用户名和密码,在你不使用 Login 控件或者改变了它默认的行为,总之,你可以自己实现底层数据的验证

if (Membership.ValidateUser(txtUserName.Text, txtPwd.Text))
{
    FormsAuthentication.RedirectFromLoginPage(txtUserName.Text, false);
}
else
{
    // Invalid user name or password
}

 

5. 系列总结

       成员资格 API 提供了用来管理应用程序用户的完整架构。成员资格 API 本身是基于提供程序的,你可以更换修改底层的提供程序来修改底层的存储,而无需改动程序。如何创建并配置一个自定义的成员资格提供程序会在今后的系列写出。

posted on 2013-04-11 18:33  SkySoot  阅读(449)  评论(0编辑  收藏  举报

导航