ASP.NET 2.0中新增的最佳功能之一是新的成员身份服务,它提供了用于创建和管理用户帐户的易于使用的API。ASP.NET 1.x大规模引入了窗体身份验证,但仍然要求您编写相当数量的代码来执行实际操作中的窗体身份验证。成员身份服务填补了ASP.NET 1.x窗体身份验证服务的不足,并且使实现窗体身份验证变得比以前简单得多。
成员身份API通过两个新的类公开:Membership和MembershipUser。前者包含了用于创建用户、验证用户以及完成其他工作的静态方法。MembershipUser代表单个用户,它包含了用于检索和更改密码、获取上次登录日期以及完成类似工作的方法和属性。通过这两个新的类,我们可以不用写一行代码,方便得完成对用户的管理。 但是在实际开发过程中,绝对不能满足我们日常开发的需要。经过日常项目的开发和网络上资料的搜索,现将其一一列出:
一、默认的各类的数据库是使用sql express的,而我们在实际开发中往往使用sql sever 2000或者sql server 2005,这时就需要我们修改数据库的类型。
微软给我们提供了一个Aspnet_regsql的命令来修改默认数据库。打开 Visual Studio 2005 命令提示,输入aspnet_regsql,按照提示一步一步进行即可。
此时打开数据库,可以发现多处来了一系列"aspnet_"开头的存储过程,这就是我们使用membership所必需的存储过程。
此时打开IIS,[属性] →[ASP.NET] →[编辑配置]:
[常规],连接参数LocalSqlServer按照普通的sql连接字符串格式。
[身份验证],模式为Forms,管理提供程序的minRequiredNonalphanumericCharacters为0,这时就可以去掉默认变态的必需需要输入字母,数字等组合的密码安全了。此步也可修改密码最低长度和最大长度等等。
经过此步骤,系统会自动在web.config中配置好了我们所需的规则。很方便,修改web.config以后都可以通过这种图形化工具来了。
二、由于自带的login控件和membership类,只提供了简单的用户信息录入,不能满足我们项目的需要。例如:我们要用户注册的时候同时输入QQ号码,电话号码,家庭地址。那么默认的是没有办法解决的。我这里给出两种解决方案。我分别用在了不同的项目中。优缺点大家自行判断。
1、使用profile。此类方法网上教程已经很多。不在出重复叙述,免去赚稿费的嫌疑:)。这里只是给出网上没有的部分说明。
由于membership只能列出来指定组的用户名,而不能列出其他的详细信息,我们实际使用中,往往需要对组中的其它信息进行同时修改。我采用的是自行构造datatable的方法。见代码:
public static DataTable listuser(string userRoles)//列出指定组的用户信息
{
string[] users = Roles.GetUsersInRole(userRoles);
//列出指定组下的用户
DataTable dt = new DataTable();
dt.Columns.Add("username", System.Type.GetType("System.String"));
dt.Columns.Add("QQ", System.Type.GetType("System.String"));
dt.Columns.Add("phone", System.Type.GetType("System.String"));
dt.Columns.Add("address", System.Type.GetType("System.String"));
dt.Columns.Add("email", System.Type.GetType("System.String"));
//以上构造一个数据表
foreach (string i in users)
{
DataRow dr = dt.NewRow();
MembershipUser mu = Membership.GetUser(i);
得到用户基本信息
ProfileCommon p = Profile.GetProfile(i); //得到用户的profile信息
dr[0] = mu. username;
dr[1] = p. QQ;
//profile是强类型,可以很方便的通过感知来添加。
dr[2] = p. phone;
dr[3] = p. address;
dr[4] = mu. email;
dt.Rows.Add(dr);
dt.AcceptChanges();
}
return dt;
}
public static void deleteuser(string username)/删除指定用户
{
Membership.DeleteUser(username);
//系统会自动删除profile下的指定用户的信息
}
public static void updateuser(string username)/更新指定用户
{
ProfileCommon p = Profile.GetProfile(i);
//得到用户的profile信息
p. phone="电话";
p. address="地址;
p. QQ="QQ号码";
p.Save();
//保存所作修改。
}
2、自定义一个membershipinfo表格,同membership系统标关联起来。自己编写SQL语句来进行查询,修改等功能。
列出指定组的用户
select * from aspnet_membership inner join aspnet_users on
aspnet_membership.userid=aspnet_users.userid left join memberinfo on aspnet_membership.userid=memberinfo.userid
where aspnet_membership.userid=(select userid from aspnet_usersinroles inner join
aspnet_roles on aspnet_usersinroles.roleid=aspnet_roles.roleid where rolename='admin')
删除、修改等功能比较简单,这里就不作叙述。可以采用membership的createuser方法建立,然后再用sql语句写入memberinfo表。
对于建立用户,我们可以采取扩展CreateUserWizard控件,或者自行写登陆界面。
1、采取扩展CreateUserWizard控件,我们可以使用它的模版列,此时需要注意的是:用户名,密码,提示问题,提示问题答案,Email,他们的ID一定要分别是username,Password,Question,Answer,Email否则会出错,而且此时验证控件均不能使用。怀疑是IDE的一个Bug。
如下所示,我们定义好的样式应当是:
<WizardSteps>
<asp:CreateUserWizardStep runat="server"> 自定义代码部分<ContentTemplate>
</ContentTemplate>
</asp:CreateUserWizardStep>
</WizardSteps>
代码部分:
protected void CreateUserWizard1_CreatedUser(object sender, EventArgs e)
{
//由于系统会自动给们建立基本的信息表,所以我们只需要对profile或者membershipinfo标进行修改即可。
Roles.AddUserToRole(CreateUserWizard1.UserName, "shop");
//添加用户到相应的组
ProfileCommon p = (ProfileCommon)ProfileCommon.Create(CreateUserWizard1.UserNa