安全管理的解决方案在.net1.1中几乎为一片空白,对于应用程序的验证与授权大部分的工作是开发人员自己编写代码,或者是借助企业库等工具来实现,此可谓.net1.1中的一大缺憾。在.net2.0中微软为我们提供了一系列的API类和控件,大大简化了我们在此方面的工作量。 下面我将推出一系列的随笔介绍asp.net2.0的安全系统。
Asp.net2.0中提供了一系列的控件实现验证与授权中的各种功能,这些控件我将在以后讲述。但喜欢思考的朋友们可能会问:这些控件是怎样实现了这一系列的功能呢?答案是:通过微软的API类来实现的。若你只会使用控件不学习API类的话那你就领略不到它精髓,在将来的开发过程中难以将它的功能发挥的淋漓尽致。下面我们选进入用户与角色的API学习。 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) 方法: 13) ChangePassword():更改用户密码 14) ChangePasswordQuestionAndAnswer:更改用户的密码安全问题和解答 15) GetPassword():取得用户密码 16) ResetPassword():将用户的密码重置,并自动产生新密码 17) 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():用户角色名是否已存在于角色表中。 |
创建用户: 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; } |
加载所有用户 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); |