Community Server专题八:MemberRole之Membership深入篇

本文深入探讨了ASP.NET中的Membership机制,特别是SqlMembershipProvider类的实现细节。通过对关键代码的分析,揭示了如何创建用户、验证输入及与数据库交互的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

专题八的上篇大致讨论了MemberRole中的Membership实现,对于运用Membership进行web开发足够,但是对于想更深入了解Membership实现机理的朋友那是远远不够的,这个专题我们更深入一下了解Membership。
其实MemberRole是一个非常好的资源包,借住Reflector这个优秀的工具,你可以对其进行代码分析。它无论是在组建的构架、代码的设计、数据库表的建立、存储过程的使用等都是非常优秀的,你是程序员也好构架师也罢,其中可以学习的真的很多很多,我在整个分析的过程中也深深受益。
由于MemberRole中的Membership只实现了对SQL Server的操Provider类,即SqlMembershipProvider类。因此我们从SqlMembershipProvider开始分析。Provider模型在上篇已经做过介绍,SqlMembershipProvider类继承了MembershipProvider,并实现其所有的抽象方法。在分析之前先看两个类:MembershipUser与MembershipUserCollection。
MembershipUser,先看看代码:(代码中省略的具体实现,只有方法与属性名称)
Membership创建的User,该类中有这个User的一些基本状态,如该User的UserName、Email等,还有一些方法,如ChangePassword()、ResetPassword()等(如果你是初学者,还在为建立一个对象需要什么属性,包含什么方法发愁,那这就是你应该好好学的,这也是OOP最基本的要求)。
publicclassMembershipUser
{
//Methods
protectedMembershipUser();
publicMembershipUser(MembershipProviderprovider,stringname,objectproviderUserKey,stringemail,stringpasswordQuestion,stringcomment,boolisApproved,boolisLockedOut,DateTimecreationDate,DateTimelastLoginDate,DateTimelastActivityDate,DateTimelastPasswordChangedDate,DateTimelastLockoutDate);
publicvirtualboolChangePassword(stringoldPassword,stringnewPassword);
publicvirtualboolChangePasswordQuestionAndAnswer(stringpassword,stringnewPasswordQuestion,stringnewPasswordAnswer);
publicvirtualstringGetPassword();
publicvirtualstringGetPassword(stringpasswordAnswer);
publicvirtualstringResetPassword();
publicvirtualstringResetPassword(stringpasswordAnswer);
publicoverridestringToString();
publicvirtualboolUnlockUser();
internalvirtualvoidUpdate();
privatevoidUpdateSelf();
//Properties
publicvirtualstringComment{get;set;}
publicvirtualDateTimeCreationDate{get;}
publicvirtualstringEmail{get;set;}
publicvirtualboolIsApproved{get;set;}
publicvirtualboolIsLockedOut{get;}
publicboolIsOnline{get;}
publicvirtualDateTimeLastActivityDate{get;set;}
publicvirtualDateTimeLastLockoutDate{get;}
publicvirtualDateTimeLastLoginDate{get;set;}
publicvirtualDateTimeLastPasswordChangedDate{get;}
publicvirtualstringPasswordQuestion{get;}
publicvirtualMembershipProviderProvider{get;}
publicvirtualobjectProviderUserKey{get;}
publicvirtualstringUserName{get;}
//Fields
privatestring_Comment;
privateDateTime_CreationDate;
privatestring_Email;
privatebool_IsApproved;
privatebool_IsLockedOut;
privateDateTime_LastActivityDate;
privateDateTime_LastLockoutDate;
privateDateTime_LastLoginDate;
privateDateTime_LastPasswordChangedDate;
privatestring_PasswordQuestion;
privateMembershipProvider_Provider;
privateobject_ProviderUserKey;
privatestring_UserName;
}

这是一个实体类,表示一个由
MembershipUserCollection,这是一个MembershipUser类的容器,用来存放MembershipUser列表,记得上次广州.net俱乐部聚会时,我的演讲中有朋友在提出CS是否使用自定义类来存储用户列表,其实在这里可以看到CS中使用的就是自定义的类而不是DataSet(我想在asp.net 2.0正式发布后这也不会改变),这样做主要是因为考虑到性能与灵活性。
好了,回到SqlMembershipProvider类上来,我们具体分析一个有代表性质的方法:
MembershipUser对象,如果建立失败MembershipUser对象为null(其实我早期做过一些项目的时候喜欢在建立对象成功后返回一个ID)。可以看到在这个方法中有很多的if语句,它们是为了检验数据是否合法,这是必须的吗?其实不是,但对于构建一个强壮的底层代码这是必须的,不然一点点的错误都有可能导致系统的瘫痪。其实做项目与做开发有的时候不太一样,企业的有些项目开发很多时候只要能实现功能就可以了,而且开发过程也集中在一些现有的代码或者组建的基础上,个人的错误不会影响全局的运行,PM也不做过多要求。但如果是做产品,这个情况可能会有所改变,很多时候要求很严格,至少我是这样。在做完对输入参数的验证后,CreateUser建立与数据库的连接,这里是调用SqlConnectionHelper类下的GetConnection方法进行的,为了照顾初学者阅读,我这里这一下为什么需要把对数据库连接与操作写在SqlConnectionHelper类下,而不是直接采用SqlConnection提供的方法,其实这是一个设计模式的问题,Membership的实现需要很多的方法与数据库进行交换数据库,如果每次方法都调用一次SqlConnection的方法建立数据库连接,一来会造成大量的代码冗余,而且一旦数据库连接语句一旦改变,你就要去修改很多个方法,如果你把这个过程都包装在一个类下面,连接数据库就有统一的入口,一来容易维护,二来不会有太多的代码冗余,再者如果需要查找错误也非常容易。这里Membership采用的是存储过程,我们可以看到使用的是dbo.aspnet_Membership_CreateUser存储过程,好了,打开你的数据库,找到这个存储过程:
publicoverrideMembershipUserCreateUser(stringusername,stringpassword,stringemail,stringpasswordQuestion,stringpasswordAnswer,boolisApproved,objectproviderUserKey,outMembershipCreateStatusstatus)

{

stringtext3;

MembershipUseruser1;

if(!SecUtility.ValidateParameter(refpassword,true,true,false,0x80))

{

status
=MembershipCreateStatus.InvalidPassword;

returnnull;

}


stringtext1=base.GenerateSalt();

stringtext2=base.EncodePassword(password,(int)this._PasswordFormat,text1);

if(text2.Length>0x80)

{

status
=MembershipCreateStatus.InvalidPassword;

returnnull;

}


if(passwordAnswer!=null)

{

passwordAnswer
=passwordAnswer.Trim();

}


if((passwordAnswer!=null)&&(passwordAnswer.Length>0))

{

if(passwordAnswer.Length>0x80)

{

status
=MembershipCreateStatus.InvalidAnswer;

returnnull;

}


text3
=base.EncodePassword(passwordAnswer.ToLower(CultureInfo.InvariantCulture),(int)this._PasswordFormat,text1);

}


else

{

text3
=passwordAnswer;

}


if(!SecUtility.ValidateParameter(reftext3,this.RequiresQuestionAndAnswer,this.RequiresQuestionAndAnswer,false,0x80))

{

status
=MembershipCreateStatus.InvalidAnswer;

returnnull;

}


if(!SecUtility.ValidateParameter(refusername,true,true,true,0x100))

{

status
=MembershipCreateStatus.InvalidUserName;

returnnull;

}


if(!SecUtility.ValidateParameter(refemail,this.RequiresUniqueEmail,this.RequiresUniqueEmail,false,0x100))

{

status
=MembershipCreateStatus.InvalidEmail;

returnnull;

}


if(!SecUtility.ValidateParameter(refpasswordQuestion,this.RequiresQuestionAndAnswer,this.RequiresQuestionAndAnswer,false,0x100))

{

status
=MembershipCreateStatus.InvalidQuestion;

returnnull;

}


if((providerUserKey!=null)&&!(providerUserKeyisGuid))

{

status
=MembershipCreateStatus.InvalidProviderUserKey;

returnnull;

}


if(password.Length<this.MinRequiredPasswordLength)

{

status
=MembershipCreateStatus.InvalidPassword;

returnnull;

}


intnum1=0;

for(intnum2=0;num2<password.Length;num2++)

{

if(!char.IsLetterOrDigit(password,num2))

{

num1
++;

}


}


if(num1<this.MinRequiredNonAlphanumericCharacters)

{

status
=MembershipCreateStatus.InvalidPassword;

returnnull;

}


if((this.PasswordStrengthRegularExpression.Length>0)&&!Regex.IsMatch(password,this.PasswordStrengthRegularExpression))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值