“成员资格”功能围绕两个中心类来生成:Membership和MembershipUser。Membership类提供用于创建用户(由MembershipUser类表示)的方法,以及用于管理用户的常见管理方法。使用Membership 类创建的用户表示一个ASP.NET应用程序的经过身份验证的标识。
使用Membership类执行的常见任务包括:
· 创建新的MembershipUser
· 用户登录
· 检索MembershipUser实例
· 更新MembershipUser实例
· 基于各种搜索条件搜索用户
· 获取当前在线的经过身份验证的用户的数量
· 不再需要某些用户时从系统中删除这些用户
获取一个MembershipUser实例之后,直接使用MembershipUser类执行的常见任务包括如下:
· 访问应用程序中MembershipUser类的属性
· 检索用户密码(仅在成员资格功能被配置成允许密码检索的条件下)
· 更改用户密码或重置用户密码
· 更改用户的密码提示问题和密码答案(如果成员资格功能已被配置成在检索或更新密码前,提示用户输入密码提示问题和答案)
· 解除对由于密码错误或密码答案错误而被锁定的用户的锁定
角色管理器的中央管理类是Roles类。Roles类提供用于创建角色并将用户分配给角色的方法。它还提供用于管理角色信息的常见管理方法。
使用Roles类执行的常见任务包括:
· 创建新角色。
· 删除现有角色。
· 将用户分配到角色。
· 从角色中移除用户。
· 确定是否已将某个用户授权给某一特定角色。
· 搜索某一特定角色中的用户,以及检索某一角色中的所有用户。
· 获取特定用户的角色信息。
角色管理器功能还包括HttpModule。此模块负责检索用户的角色分配并将该信息存储在RolePrincipal内,后者可在页的HttpContext上找到。HttpContext上存在RolePrincipal时,你可以使用<authorization>元素保护页和目录。根据RolePrincipal中所存储的角色信息的不同,可以只授权用户访问站点内的特定页和目录。
下面,我们将演示几种常见的操作。
在网站下创建一个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 删除用户
如下,在页面上再创建两个按钮“验证用户”和“解锁用户”。
<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 验证用户
由于这个用户是新建的,因此处于未锁定状态,单击“解除锁定”按钮,提示“用户不存在或者未被锁定”。
在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 删除角色
最后,让我们来使用编程方式验证当前用户是否属于某个角色。在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所示。
在前几节中,笔者演示了常见的一些成员资格和角色管理器API的成员,除此之外还有一些没有提到的重要成员,如下表所示。
Membership类:
成员 |
作用 |
FindUsersByEmail()方法 |
根据电子邮件地址找到一组成员资格用户 |
FindUsersByName()方法 |
根据用户名找到一组成员资格用户 |
GetAllUsers()方法 |
获取数据库中用户的集合 |
GetNumberOfUsersOnline()方法 |
获取访问当前应用程序的用户数 |
GetUserNameByEmail()方法 |
根据电子邮件地址找到一个匹配的用户名 |
MembershipUser类:
成员 |
作用 |
ChangePassword()方法 |
更新用户的密码 |
ChangePasswordQuestionAndAnswer()方法 |
更新密码提示问题和答案 |
GetPassword()方法 |
获取用户的密码 |
ResetPassword()方法 |
将用户密码重置为一个自动生成的新密码 |
IsOnline属性 |
表示用户是否联机 |
CreationDate属性 |
获取用户创建时间 |
Roles类:
成员 |
作用 |
FindUsersInRole()方法 |
获取属于指定角色的用户的列表 |
续表
成员 |
作用 |
GetAllRoles()方法 |
获取所有角色 |
GetRolesForUser()方法 |
获取一个用户所属角色的列表 |
GetUsersInRole()方法 |
获取属于某角色的用户列表 |
本章我们对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来以编程方式实现用户管理、角色管理和角色授权。