Membership、MembershipUser和Roles类
第一部分
用户与角色管理在asp.net2.0中是通过Membership和Roles两个类来实现的。
Membership:用户成员账号管理,用户名、密码、邮箱等
Roles:负责用户和群组之间关系管理。
l Membership类:主要是创建用户帐号、验证用户身份和管理用户设置
属性:
1) EnablePasswordReset:获取一个值,以指示是否可以重置密码。
2) EnablePasswordRetrieval:获取一个值,以指示是否允许用户提取密码。
3) HashAlgorithmType:获取一个值,密码的算法识别项
4) MaxInvalidPasswordAttempts:获取一个值,锁定用户之间所允许的重试次数。
5) MinRequiredNonAlphanumericCharacters:获取一个值,密码中最少的特殊字符数。
6) MinRequiredPasswordLength:取得最小密码的长度
7) RequiresQuestionAndAnswer:获取一个值,指示是否要求用户解答密码问题以重新提取密码。
8) UserIsOnlineTimeWindow:指定用户最后活动日期之后的分钟数,其间的用户视为在线。
方法:
1) CreateUser():创建新的用户
2) DeleteUser():从数据库删除用户
3) GetUser():取得成员资格用户的信息
4) UpdateUser():更新用户信息
5) ValidateUser():验证用户账号与密码是否用效
6) GetAllUsers():取得数据库中用户的集合
7) FindUsersByEmail():根据email查询用户
8) FinndUsersByName():根据帐号名称查询用户
9) GetNumberOfUsersOnline():取得目前访问程序的在线用户
10) GetUserNameByEmail():根据邮箱查询用户名
l MembershipUser类
负责管理与更新Membership表中的相关资料。别把MembershipUser类与Membership类混了,实际上是同MembershipUser处理完成后交由Membership处理。如:
1) 取得或设置用户相关信息。如UserName,Email和帐号创建时间。
2) 读取、改变用户密码
3) 改变密码提示问题与答案
4) 解锁帐号
5) 设置是否允许用户能够被验证
属性:
1) CreationDate:取得用户的创建时间
2) Email:取得或设置用户的电子邮件地址
3) IsApproved:取得或设置用户是否可以进行验证
4) IsLockedOut:取出用户是否被锁定
5) IsOnLine:指出用户目前是否在线
6) LastActivityDate:取得或设置用户最后一次验证或访问程序的日期时间
7) LastLoclkoutDate:取是最近锁定用户的日期和时间
8) LastLoginDate:取得或设置用户上一次验证的日期时间
9) LastPasswordChangedDate:取得用户密码上一次更新的时间
10) PasswordQuestion:取得用户的安全密码的问题
11) UserName:取得用户登录的名称
方法:
12) ChangePassword():更改用户密码
13) ChangePasswordQuestionAndAnswer:更改用户的密码安全问题和解答
14) GetPassword():取得用户密码
15) ResetPassword():将用户的密码重置,并自动产生新密码
16) UnlockUser():解除帐号锁定,以便能进行身份验证
l Roles类
方法:
1) AddUsersToRole():将多个用户加入一个角色
2) AddUsersToRoles():将多个用户加入多个角色
3) AddUserToRole():将一个用户加入一个角色
4) AddUserToRoles():将一个用户加入多个角色
5) CreateRole():创建角色
6) DeleteRole():删除角色
7) FindUsersInRole():寻找某个角色中的所有用户
8) GetAllRoles():取得所有角色的清单
9) GetRolesForUser():取得用户所属角色的清单
10) IsUserInRole():指出用户是否在指定的角色中
11) RemoveUserFromRole():从一个角色中移除一个用户
12) RemoveUserFromRoles():从多个角色中移出一个用户
13) RemoveUsersFromRole():从一个角色中移除多个用户
14) RemoveUsersFromRoles():从多个角色中移除多个用户名
15) RoleExists():用户角色名是否已存在于角色表中。
代码实现(1)
创建用户:
MembershipCreateStatus mc; Membership.CreateUser(txtUid.Text, txtPwd.Text, txtEmail.Text, txtQuestion.Text, txtAnswer.Text, true, out mc); Response.Write(mc.ToString());
删除用户:
if (Membership.DeleteUser(txtUid.Text)) Response.Write("OK"); else Response.Write("Error");
修改用户信息:
if (User.Identity.IsAuthenticated) { MembershipUser user = Membership.GetUser(); user.Email = txtEmail.Text; Membership.UpdateUser(user); Response.Write(user.Email.ToString()); }
验证用户登录信息
bool isok = Membership.ValidateUser(txtUid.Text, txtPwd.Text); if (isok) { FormsAuthentication.SetAuthCookie(txtUid.Text, false); Response.Write("OK"); } else { Response.Write("Error"); }
获取登录用户的信息
if (User.Identity.IsAuthenticated) { MembershipUser myuser = Membership.GetUser(); if (myuser != null) { Response.Write(myuser.CreationDate); Response.Write(myuser.Email); Response.Write(myuser.IsLockedOut); Response.Write(myuser.IsOnline); Response.Write(myuser.PasswordQuestion); Response.Write(myuser.UserName);
}
}
根据密码问题的答案返回用户密码
if (User.Identity.IsAuthenticated) { MembershipUser user = Membership.GetUser(txtUid.Text); txtPwd.Text = user.GetPassword(txtAnswer.Text); }
修改用户密码
if (User.Identity.IsAuthenticated) { MembershipUser user = Membership.GetUser(); user.ChangePassword(txtPwd.Text,txtPWd2.Text); Response.Write(user.GetPassword(txtAnswer.Text)); }
解锁用户
MembershipUser user = Membership.GetUser(txtUid.Text); bool b = user.UnlockUser(); Response.Write(b+" "+user.IsLockedOut);
拒绝用户登录
MembershipUser user = Membership.GetUser(txtUid.Text); user.IsApproved = false; Membership.UpdateUser(user); Response.Write(user.IsLockedOut);
允许用户登录
MembershipUser user = Membership.GetUser(txtUid.Text); user.IsApproved = true; Membership.UpdateUser(user); Response.Write(user.IsLockedOut);
根据用户名或邮箱来检索用户
MembershipUserCollection users; switch(listType.Text) { case "姓名": users = Membership.FindUsersByName(txtFind.Text); if (users.Count > 0) { showUserInfo(users); } else { Response.Write("未找到用户名"); } break; case "邮箱": users = Membership.FindUsersByEmail(txtFind.Text); if (users.Count > 0) { showUserInfo(users); } else { Response.Write("未找到邮箱"); } break; }
代码实现(2)
加载所有用户
MembershipUserCollection user = Membership.GetAllUsers(); listUser.DataSource = user; listUser.DataBind();
加载所有角色
string[] role = Roles.GetAllRoles(); listRole.DataSource = role; listRole.DataBind();
添加新角色
Roles.CreateRole(txtRole.Text);
删除角色
Roles.DeleteRole(txtRole.Text);
将一个用户添加到一个角色
Roles.AddUserToRole(listUser.Text, listRole.Text);
将一个用户从一个角色中移除
Roles.RemoveUserFromRole(listUser.Text, listRole.Text);
将一个用户加入到多个角色中去
int n = 0; foreach (ListItem li in listRole.Items) { if (li.Selected) n++; } string[] roles = new string[n]; int i=0; foreach(ListItem li in listRole.Items) { if(li.Selected) { roles[i++] = li.Text; } } Roles.AddUserToRoles(listUser.Text, roles);
将一个用户的所有角色移除
string[] str = Roles.GetRolesForUser(listUser.Text); Roles.RemoveUserFromRoles(listUser.Text,str);
将多个用户加入到一个角色中去
int n = 0; foreach (ListItem li in listUser.Items) { if (li.Selected) n++; } string[] users = new string[n]; int i=0; foreach (ListItem li in listUser.Items) { if (li.Selected) { users[i++] = li.Text; } } Roles.AddUsersToRole(users,listRole.Text);
将一个角色中的所有的用户移除
string[] users = Roles.GetUsersInRole(listRole.Text); Roles.RemoveUsersFromRole(users, listRole.Text);
将多个用户加入到多个角色
int n = 0; foreach (ListItem li in listUser.Items) { if (li.Selected) n++; } string[] strUser = new string[n]; n = 0; foreach (ListItem li in listRole.Items) { if (li.Selected) n++; } string[] strRoles = new string[n]; for (int i = 0; i < listUser.Items.Count; i++) { strUser[i] = listUser.Items[i].Text; } for (int i = 0; i < listRole.Items.Count; i++) { strRoles[i] = listRole.Items[i].Text; } Roles.AddUsersToRoles(strUser, strRoles);
第二部分
玩转Membership之五
-----底层三剑客:Membership、MembershipUser、Roles
本部分内容主要对Membership类、MembershipUser类和Roles类的常用属性和方法进行详尽的介绍。
Membership类属于System.Web.Security命名空间,其中包含了大量有用的静态方法。,下面列出最常用的一些静态方法
CreateUser()
创建一个新用户
举例如下:
MembershipCreateStatus createStatus;
Membership.CreateUser("丰志强", "www.fengzhiqiang.name", "zhiqiangfeng@gmail.com",
"你最喜欢的运动是什么?", "旅游", true, out createStatus);
需 要注意的是倒数第二个参数,它是一个布尔值,决定创建的帐号是否被激活。如果设置为false,则帐号虽然创建成功,但是不可用,还需要在以后将 MembershipUSer的IsApproved属性设置为true,然后调用UpdateUser()方法进行激活。新创建的用户默认情况下是被激 活的。
最后一个参数返回一个枚举值,用以表示创建用户是否成功。MembershipCreateStatus.Success代表创建成功,其他的枚举值代表没有创建成功的各种原因
DeleteUser()
通过提供的用户名字,将数据库中的用户删除。你也可以指定是否从其他表中将与此用户相关的所有信息全部删除,默认情况下是全部删除的。
GetUser()
通过提供的用户名字,从数据库中获取用户
GetUserNameByEmail()
通过邮箱获取用户的名字,如果数据库中存在多个匹配的用户,则只返回第一个用户名
FindUsersByName()
此方法支持模糊查询,返回所有匹配或者部分匹配的用户列表
FindUsersByEmail()
此方法支持模糊查询,返回所有匹配或者部分匹配的用户列表
GetAllUsers()
获取所有用户的集合。此方法的另外一个重载,通过起始序号和集合长度,可以返回所要求的部分用户的集合
GetNumberOfUsersOnline()
获取登陆在线的用户总数
GeneratePassword()
生成指定长度的随机密码
UpdateUser()
更新用户信息
ValidateUser()
对提供的用户名和密码进行验证,检验其是否有效
MembershipUser提供如下常用的实例方法
UnlockUser()
激活因多次输入错误密码而被锁定的帐户
GetPassword()
用户通过输入安全问题的答案获取密码。注意的是如果密码是hashed类型,则不可用
ResetPassword()
使用系统生成的新的随机密码对用户密码进行重置。方法的返回值是生成的随机密码。随机密码可以直接显示给用户或者通过邮件的方式发送给用户
ChangePassword()
改变用户密码
ChangePasswordQuestionAndAnswer()
改变安全问题和答案
需 要注意的一点是:如果你想让一个帐户不可用,那么只能通过将MembershipUser的IsApproved属性设置为fasle让其处于未激活状 态。而不能通过编程的方式将其锁定,用户帐号的锁定只能由用户连续输错密码去触发,但是我们可以通过调用UnlockUser()进行解锁操作。
使用GridView和DetailsView绑定用户信息关键代码:
protected void Page_Load(object sender, EventArgs e)
...{
GridView1.DataSource = Membership.GetAllUsers();
GridView1.DataKeyNames=new string [] ...{"UserName"};
GridView1.DataBind();
}
protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
...{
List<MembershipUser> list = new List<MembershipUser>();
list.Add(Membership.GetUser(GridView1.SelectedValue.ToString()));
DetailsView1.DataSource = list;
DetailsView1.DataBind();
}
在用户点击登陆按钮的时候,我们可以做如下处理
If(Membership.ValidateUser(txtName.text,txtPassword.text))
...{
FormsAuthentication.RedirectFromLoginPage(txtName,false);
}
Else
...{
Response.Write(“你的密码无效!”);
}
使用Roles类通过编程的方式创建角色和给用户指定角色
Roles类常用的方法
CreateRole()
DeleteRole()
RoleExists()
GetAllRoles()
AddUserToRole()
AddUserToRoles()
RemoveUserFromRole()
RemoveUserFromRoles()
RemoveUsersFromRole()
RemoveUsersFromRoles()
IsUserInRole()
GetRolesForUser()
GetUsersInRole()
FindUsersInRole()