【C#.NET】保护你的ASP.NET应用程序(五)成员资格和角色管理API编程

15.8  成员资格和角色管理API编程

15.8.1  成员资格API概述

“成员资格”功能围绕两个中心类来生成:Membership和MembershipUser。Membership类提供用于创建用户(由MembershipUser类表示)的方法,以及用于管理用户的常见管理方法。使用Membership 类创建的用户表示一个ASP.NET应用程序的经过身份验证的标识。

使用Membership类执行的常见任务包括:

·      创建新的MembershipUser

·      用户登录

·      检索MembershipUser实例

·      更新MembershipUser实例

·      基于各种搜索条件搜索用户

·      获取当前在线的经过身份验证的用户的数量

·      不再需要某些用户时从系统中删除这些用户

获取一个MembershipUser实例之后,直接使用MembershipUser类执行的常见任务包括如下:

·      访问应用程序中MembershipUser类的属性

·      检索用户密码(仅在成员资格功能被配置成允许密码检索的条件下)

·      更改用户密码或重置用户密码

·      更改用户的密码提示问题和密码答案(如果成员资格功能已被配置成在检索或更新密码前,提示用户输入密码提示问题和答案)

·      解除对由于密码错误或密码答案错误而被锁定的用户的锁定

15.8.2  角色管理API概述

角色管理器的中央管理类是Roles类。Roles类提供用于创建角色并将用户分配给角色的方法。它还提供用于管理角色信息的常见管理方法。

使用Roles类执行的常见任务包括:

·      创建新角色。

·      删除现有角色。

·      将用户分配到角色。

·      从角色中移除用户。

·      确定是否已将某个用户授权给某一特定角色。

·      搜索某一特定角色中的用户,以及检索某一角色中的所有用户。

·      获取特定用户的角色信息。

角色管理器功能还包括HttpModule。此模块负责检索用户的角色分配并将该信息存储在RolePrincipal内,后者可在页的HttpContext上找到。HttpContext上存在RolePrincipal时,你可以使用<authorization>元素保护页和目录。根据RolePrincipal中所存储的角色信息的不同,可以只授权用户访问站点内的特定页和目录。

下面,我们将演示几种常见的操作。

15.8.3  创建、修改、获取和删除用户

在网站下创建一个API目录,并创建一个UserManagement.aspx。在页面上放置4个按钮,用于实现用户的创建、修改、获取以及删除操作。

<asp:Button ID="btn_CreateUser" runat="server" Text="创建用户" />

<asp:Button ID="btn_DeleteUser" runat="server" Text="删除用户" />

<asp:Button ID="btn_GetUserInfo" runat="server" Text="获取用户信息" />

<asp:Button ID="btn_UpdateUser" runat="server" Text="更新用户" />

4个按钮的单击事件处理方法如下:

protected void btn_CreateUser_Click(object sender, EventArgs e)

{

    string username = "SalesDirector";

    string password = "abcd_1234";

    string email = "[email protected]";

    string passwordQuestion = "111";

    string passwordAnswer = "222";

    // 是否允许新用户登录

    bool isApproved = true;

    MembershipCreateStatus membershipCreateStarus;

    Membership.CreateUser(username, password, email, passwordQuestion,

    passwordAnswer, isApproved, out membershipCreateStarus);

    // membershipCreateStarus是一个枚举,为了简单我们直接输出枚举名称

    Response.Write(membershipCreateStarus.ToString());

}

protected void btn_DeleteUser_Click(object sender, EventArgs e)

{

    string username = "SalesDirector";

    // 删除与用户关联的数据

    bool deleteAllRelatedData = true;

    bool operationResult = Membership.DeleteUser(username, deleteAllRelatedData);

    Response.Write(operationResult? "删除成功":"删除失败");

}

protected void btn_UpdateUser_Click(object sender, EventArgs e)

{

    string username = "SalesDirector";

    MembershipUser user = Membership.GetUser(username);

    user.Email = "[email protected]";

    Membership.UpdateUser(user);

}

protected void btn_GetUserInfo_Click(object sender, EventArgs e)

{

    string username = "SalesDirector";

    MembershipUser user = Membership.GetUser(username);

    if (user == null)

        Response.Write("用户不存在");

    else

    {

        Response.Write(string.Format("用户名:{0}<br/>", user.UserName));

        Response.Write(string.Format("电子邮箱:{0}<br/>", user.Email));

    }

}

代码非常简单,在这里就不作过多介绍了。浏览页面,首先单击“创建用户按钮”,结果如图15-51所示。

然后单击“获取用户信息”按钮,结果如图15-52所示。

      

图15-51  创建用户                                  图15-52  获取用户信息

再先后单击“更新用户”按钮和“获取用户信息”按钮,结果如图15-53所示。

最后,先后单击“删除用户”按钮和“获取用户信息”按钮,结果如图15-54所示。

          

图15-53  更新用户                                      图15-54  删除用户

15.8.4  验证和解锁用户

如下,在页面上再创建两个按钮“验证用户”和“解锁用户”。

<asp:Button ID="btn_ValidateUser" runat="server" Text="验证用户" />

<asp:Button ID="btn_UnlockUser" runat="server" Text="解锁用户" />

两个按钮的单击事件处理方法如下:

protected void btn_ValidateUser_Click(object sender, EventArgs e)

{

    if (Membership.ValidateUser("SalesDirector", "abcd_1234"))

        Response.Write("验证通过");

    else

        Response.Write("验证失败");

}

protected void btn_UnlockUser_Click(object sender, EventArgs e)

{

    string username = "SalesDirector";

    MembershipUser user = Membership.GetUser(username);

    // 检测用户是否存并且是否已被锁定

    if (user != null && user.IsLockedOut)

    {

        if (user.UnlockUser())

            Response.Write("解除锁定成功");

        else

            Response.Write("解除锁定失败");

    }

    else

        Response.Write("用户不存在或者未被锁定");

}

单击“验证用户”按钮的结果如图15-55所示。

图15-55  验证用户

由于这个用户是新建的,因此处于未锁定状态,单击“解除锁定”按钮,提示“用户不存在或者未被锁定”。

15.8.5  角色管理

在API目录下新建一个RoleManagement.aspx页面。在页面上加入4个按钮控件,分别实现创建角色、删除角色、向角色加入用户和从角色删除用户4个操作:

<asp:Button ID="btn_CreateRole" runat="server" Text="创建角色" />

<asp:Button ID="btn_DeleteRole" runat="server" Text="删除角色" />

<asp:Button ID="btn_AddUserToRole" runat="server" Text="向角色加入用户" />

<asp:Button ID="btn_RemoveUserFromRole" runat="server" Text="从角色删除用户"/>

4个按钮的单击事件处理方法如下:

protected void btn_DeleteRole_Click(object sender, EventArgs e)

{

    if (!Roles.RoleExists("Director"))

    {

        Response.Write("角色不存在");

        return;

    }

    if (Roles.GetUsersInRole("Director").Length > 0)

    {

        Response.Write("请先删除角色中的用户");

        return;

    }

    Roles.DeleteRole("Director");

    Response.Write("角色删除成功");

}

protected void btn_AddRole_Click(object sender, EventArgs e)

{

    if (Roles.RoleExists("Director"))

    {

        Response.Write("角色已存在");

        return;

    }

    Roles.CreateRole("Director");

    Response.Write("角色创建成功");

}

protected void btn_RemoveUserFromRole_Click(object sender, EventArgs e)

{

    if (!Roles.RoleExists("Director"))

    {

        Response.Write("角色不存在");

        return;

    }

    if (Membership.GetUser("SalesDirector")==null)

    {

        Response.Write("用户不存在");

        return;

    }

    //从角色中删除多个用户

    //Roles.RemoveUsersFromRole(new string[] { "SalesDirector" }, "Director");

    Roles.RemoveUserFromRole("SalesDirector", "Director");

}

protected void btn_AddUserToRole_Click(object sender, EventArgs e)

{

    if (!Roles.RoleExists("Director"))

    {

        Response.Write("角色不存在");

        return;

    }

    if (Membership.GetUser("SalesDirector") == null)

    {

        Response.Write("用户不存在");

        return;

    }

    //向角色加入多个用户

    //Roles.AddUsersToRole(new string[] { "SalesDirector" }, "Director");

    Roles.AddUserToRole("SalesDirector", "Director");

}

启用页面,单击“创建角色”按钮,输出如图15-56所示。

单击“向角色加入用户”按钮,然后单击“删除角色”按钮,输出如图15-57所示,说明用户确实加入了角色。

    

图15-56  创建角色                                    图15-57  向角色加入用户

再单击“从角色删除用户”按钮,然后单击“删除用户”按钮,输出如图15-58所示,说明从角色删除用户成功。

最后,单击“向角色加入用户”按钮,输出如图15-59所示,说明角色成功被删除。

  

图15-58  从角色删除用户                               图15-59  删除角色

15.8.6  角色验证

最后,让我们来使用编程方式验证当前用户是否属于某个角色。在API目录下新建一个RoleAuthorization.aspx文件。修改Page_Load事件的处理方法如下:

protected void Page_Load(object sender, EventArgs e)

{

    Response.Write(User.IsInRole("Director") + "<br/>");

    Response.Write(Roles.IsUserInRole("Director") + "<br/>");

    Response.Write(((RolePrincipal)User).IsInRole("Director") + "<br/>");

}

三句代码都实现了相同的效果——验证当前通过身份验证的用户是否属于某个角色。先打开之前创建的UserManagement.aspx和RoleManagement.aspx来创建用户“SalesDirector”,并把他加入“Director”角色。然后到根目录下的Login.aspx进行登录,最后访问RoleAuthorization.aspx可以看到输出的页面。如图15-60所示。

15.8.7  其他重要成员

在前几节中,笔者演示了常见的一些成员资格和角色管理器API的成员,除此之外还有一些没有提到的重要成员,如下表所示。

Membership类:

成员

作用

FindUsersByEmail()方法

根据电子邮件地址找到一组成员资格用户

FindUsersByName()方法

根据用户名找到一组成员资格用户

GetAllUsers()方法

获取数据库中用户的集合

GetNumberOfUsersOnline()方法

获取访问当前应用程序的用户数

GetUserNameByEmail()方法

根据电子邮件地址找到一个匹配的用户名

MembershipUser类:

成员

作用

ChangePassword()方法

更新用户的密码

ChangePasswordQuestionAndAnswer()方法

更新密码提示问题和答案

GetPassword()方法

获取用户的密码

ResetPassword()方法

将用户密码重置为一个自动生成的新密码

IsOnline属性

表示用户是否联机

CreationDate属性

获取用户创建时间

Roles类:

成员

作用

FindUsersInRole()方法

获取属于指定角色的用户的列表

续表

成员

作用

GetAllRoles()方法

获取所有角色

GetRolesForUser()方法

获取一个用户所属角色的列表

GetUsersInRole()方法

获取属于某角色的用户列表

15.9  回顾与总结

本章我们对ASP.NET的安全机制做了一个大致的介绍,覆盖的内容非常广,涉及到授权、模拟、验证、ASP.NET 2.0成员资格和角色管理器以及ASP.NET 2.0登录控件等。

15.1节解释了与安全相关的一些名词并概述了ASP.NET安全体系和身份验证方式。

15.2节介绍了如何模拟请求用户的账户、模拟一个独立账户和使用编程方式临时模拟账户。

15.3节介绍了基于Windows的身份验证的一些服务器配置(IIS和NTFS文件夹)、如何配置Web.config来实现授权以及如何实现自定义角色等。

15.4节介绍了如何使用基于表单的身份验证来进行验证和票据管理、如何使用Web.config进行用户账户管理以及如何获取用户信息等。

15.5节总体介绍了ASP.NET 2.0成员资格和角色管理器。涉及成员资格和角色管理器的启用和配置、ASP.NET登录控件和ASP.NET网站管理工具等内容。

15.6节演示了ASP.NET登录控件的使用,通过登录控件,我们无需编写一行代码就能实现面向用户的一套成员管理系统。

15.7节介绍了如何使用ASP.NET网站管理工具来进行成员资格和角色管理器的配置。

15.8节介绍了如何使用成员资格和角色管理器API来以编程方式实现用户管理、角色管理和角色授权。

你可能感兴趣的:(asp.net)