由于项目要求,还需要加入成员管理以及登陆等内容,简单介绍下自定义成员资格。
具体的项目文件可以参考我的github仓库
自定义成员资格可以理解为对用户的管理,即用户的创建,验证,修改密码等等操作。在ASP.NET中提供了一个类,可以较为清晰的规定这些操作,这个类叫做MembershipProvider类。
MembershipProvider类是一个抽象类,因此我们需要继承这个抽象类并进行实现。
我们可以在BLL层新建一个类,例如:MemberShipProvider.cs。这个类继承System.Web.Security.MembershipProvider即可,并快捷操作对抽象类进行实现。代码如下:
public class MemberShipProvider
:System.Web.Security.MembershipProvider
实现之后会发现多出了一堆方法需要实现,例如ChangePassword()等等。这里我们以CreateUser为例进行讲解。
创建用户的基本思路是对浏览器端传输过来的数据进行简单的验证,验证通过后调用数据访问层相应方法插入用户数据,最终返回相应内容,具体代码如下:
public override System.Web.Security.MembershipUser CreateUser(
string username,
string password,
string email,
string passwordQuestion,
string passwordAnswer,
bool isApproved,
object providerUserKey,
out System.Web.Security.MembershipCreateStatus status)
{
//检查username是否为空,为空则将status赋值为InvalidUserName
if (string.IsNullOrEmpty(username))
{
status = System.Web.Security.MembershipCreateStatus.InvalidUserName;
return null;
}
//调用数据访问层的创建用户方法
FWSync.IDAL.IUser dal = FWSync.DALFactory.DataAccess.CreateUser();
//调用数据访问层验证用户是否存在的方法
bool isexist = dal.ValidateUserExist(username);
//如果用户存在,将status赋值为DuplicateUserName
if (isexist)
{
status = System.Web.Security.MembershipCreateStatus.DuplicateUserName;
return null;
}
//创建相应的用户表结构
UserInfo us = new UserInfo();
us.UserName = username;
//这里要用到md5加密密码
us.PassWord = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password,"MD5");
//调用数据访问层插入用户的方法
int userid = dal.InsertUser(us);
//插入成功,则将status赋值为Success
status = System.Web.Security.MembershipCreateStatus.Success;
//创建一个MembershipUser并返回
System.Web.Security.MembershipUser user
= new System.Web.Security.MembershipUser(
"MyMemberShip",
username,
userid,
string.Empty,
string.Empty,
string.Empty,
true,
false,
DateTime.Now,
DateTime.Now,
DateTime.Now,
DateTime.Now,
DateTime.Now
);
return user;
}
需要注意的是最后返回的user中我设置了好多空串或者当前时间,这些内容基本上都是邮箱或者注册时间之类的,因为我没有使用到所以未赋值,如果使用到的话大部分内容可以从传来的变量中拿到。
user中的”MyMemberShip”是web.config中默认的成员资格的配置参数,其配置代码如下
<membership defaultProvider="MyMemberShip">
<providers>
<clear/>
<add name="MyMemberShip" type="FWSync.BLL.MemberShipProvider,FWSync.BLL"/>
providers>
membership>
接下来是在注册页面中如何使用刚写好的自定义成员资格,我简单的在注册页面中写了两个TextBox和一个Button,TextBox中分别写入用户名和密码,Button点击后提交,下面是Button的后台代码:
protected void btnregister_Click(object sender, EventArgs e)
{
string username = this.tbxusername.Text;
string password = this.tbxpassword.Text;
System.Web.Security.MembershipCreateStatus status;
//本来那两个"haha"是string.Empty,代表着邮箱之类的东西,但是那么写会报错,所以这里随便写个串就可以了
System.Web.Security.MembershipUser user =
System.Web.Security.Membership.CreateUser(
username,
password,
string.Empty,
"haha",
"haha",
true,
out status
);
//out 返回的status,根据status判断是何种错误,并在界面上进行提示
switch (status)
{
case MembershipCreateStatus.Success:
this.Response.Redirect("~/Default.aspx");
break;
case MembershipCreateStatus.InvalidUserName:
this.lblWarn.Text = "用户名错误";
break;
case MembershipCreateStatus.DuplicateUserName:
this.lblWarn.Text = "用户名已经存在";
break;
default:
this.lblWarn.Text = "未知错误";
break;
}
这里我啰嗦下out,在c#这个语言里面,out可以粗略的理解为传指针,我们在定义了status后,可以在CreateUser这个方法中改变它的值,最后通过返回的值判断用户注册这个函数出了什么问题。