ASP.NET教程之用好VS2005之扩大membership服务
我觉得很重要,一般所说的不重要应该指的是:你学好一种以后再学另一种就很容易了。(因为这样大家可能有一个错觉就是语言不是很重要,只要随便学一种就可以了,其实不是这样的。 ASP.NET2.0中新增的最好功效之一是新的成员身份服务,它供应了用于创立和办理用户帐户的易于利用的API。ASP.NET1.x年夜范围引进了窗体身份考证,但仍旧请求您编写相称数目的代码来实行实践操纵中的窗体身份考证。成员身份服务弥补了ASP.NET1.x窗体身份考证服务的不敷,而且使完成窗体身份考证变得比之前复杂很多。成员身份API经由过程两个新的类公然:Membership和MembershipUser。前者包括了用于创立用户、考证用户和完成其他事情的静态办法。MembershipUser代表单个用户,它包括了用于检索和变动暗码、猎取前次登录日期和完成相似事情的办法和属性。经由过程这两个新的类,我们能够不必写一行代码,便利得完成对用户的办理。可是在实践开辟过程当中,相对不克不及满意我们一样平常开辟的必要。经由一样平常项目标开辟和收集上材料的搜刮,现将其逐一列出:
1、默许的各种的数据库是利用sqlexpress的,而我们在实践开辟中常常利用sqlsever2000大概sqlserver2005,这时候就必要我们修正数据库的范例。
微软给我们供应了一个Aspnet_regsql的命令来修正默许数据库。翻开VisualStudio2005命令提醒,输出aspnet_regsql,依照提醒一步一步举行便可。
此时翻开数据库,能够发明多处来了一系列"aspnet_"开首的存储历程,这就是我们利用membership所必须的存储历程。
此时翻开IIS,[属性]→→[编纂设置]:
[惯例],毗连参数LocalSqlServer依照一般的sql毗连字符串格局。
[身份考证],形式为Forms,办理供应程序的minRequiredNonalphanumericCharacters为0,这时候就能够往失落默许反常的必须必要输出字母,数字等组合的暗码平安了。此步也可修正暗码最低长度和最年夜长度等等。
经由此步骤,体系会主动在web.config中设置好了我们所需的划定规矩。很便利,修正web.config今后都能够经由过程这类图形化工具来了。
2、因为自带的login控件和membership类,只供应了复杂的用户信息录进,不克不及满意我们项目标必要。比方:我们要用户注册的时分同时输出QQ号码,德律风号码,家庭地点。那末默许的是没有举措办理的。我这里给出两种办理计划。我分离用在了分歧的项目中。优弱点人人自行判别。
1、利用profile。此类办法网上教程已良多。不在出反复叙说,免除赚稿费的怀疑:)。这里只是给出网上没有的部分辩明。
因为membership只能列出来指定组的用户名,而不克不及列出其他的具体信息,我们实践利用中,常常必要对组中的别的信息举行同时修正。我接纳的是自行机关datatable的办法。见代码:
publicstaticDataTablelistuser(stringuserRoles)//列出指定组的用户信息
{
string[]users=Roles.GetUsersInRole(userRoles);
//列出指定组下的用户
DataTabledt=newDataTable();
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(stringiinusers)
{
DataRowdr=dt.NewRow();
MembershipUsermu=Membership.GetUser(i);
失掉用户基础信息
ProfileCommonp=Profile.GetProfile(i);//失掉用户的profile信息
dr=mu.username;
dr=p.QQ;
//profile是强范例,能够很便利的经由过程感知来增加。
dr=p.phone;
dr=p.address;
dr=mu.email;
dt.Rows.Add(dr);
dt.AcceptChanges();
}
returndt;
}
publicstaticvoiddeleteuser(stringusername)/删除指定用户
{
Membership.DeleteUser(username);
//体系会主动删除profile下的指定用户的信息
}
publicstaticvoidupdateuser(stringusername)/更新指定用户
{
ProfileCommonp=Profile.GetProfile(i);
//失掉用户的profile信息
p.phone="德律风";
p.address="地点;
p.QQ="QQ号码";
p.Save();
//保留所作修正。
}
2、自界说一个membershipinfo表格,同membership体系标联系关系起来。本人编写SQL语句来举行查询,修正等功效。
列出指定组的用户
select*fromaspnet_membershipinnerjoinaspnet_userson
aspnet_membership.userid=aspnet_users.useridleftjoinmemberinfoonaspnet_membership.userid=memberinfo.userid
whereaspnet_membership.userid=(selectuseridfromaspnet_usersinrolesinnerjoin
aspnet_rolesonaspnet_usersinroles.roleid=aspnet_roles.roleidwhererolename=admin)
删除、修正等功效对照复杂,这里就不作叙说。能够接纳membership的createuser办法创建,然后再用sql语句写进memberinfo表。
关于创建用户,我们能够接纳扩大CreateUserWizard控件,大概自行写上岸界面。
<P> 1、接纳扩大CreateUserWizard控件,我们可使用它的模版列,此时必要注重的是:用户名,暗码,提醒成绩,提醒成绩谜底,Email,他们的ID必定要分离是username,Password,Question,Answer,Email不然会堕落,并且此时考证控件均不克不及利用。嫌疑是IDE的一个Bug。
以下所示,我们界说好的款式应该是:
<WizardSteps>
<asp:CreateUserWizardSteprunat="server">自界说代码部分<ContentTemplate>
</ContentTemplate>
</asp:CreateUserWizardStep>
</WizardSteps>
代码部分:
protectedvoidCreateUserWizard1_CreatedUser(objectsender,EventArgse)
{
//因为体系会主动给们创建基础的信息表,以是我们只必要对profile大概membershipinfo标举行修正便可。
Roles.AddUserToRole(CreateUserWizard1.UserName,"shop");
//增加用户到响应的组
ProfileCommonp=(ProfileCommon)ProfileCommon.Create(CreateUserWizard1.UserName,true);
p.QQ=((TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("QQ")).Text.Trim();
p.address=((TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("address")).Text.Trim();
p.phone=((TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("phone")).Text.Trim();p.Save();//保留所作修正
}
2、接纳本人写UI,团体保举利用这类办法。天真性对照年夜,并且可使用2005壮大的考证控件。
页脸部分对照复杂略过不再报告。上面具体先容一下代码部分。
此时我们必要利用membership的CreateUser()办法。语法我们就不再先容。他会依据创建用户的了局前往成一个MembershipCreateStatus列举类,它具体的包括了一切创建用户不乐成的毛病信息。我们只必要依据他的值,就能够前往给界面响应的提醒,如:用户名已存在,电子邮件已存在等等。
关于自界说用户信息部分我们仍旧能够接纳profile大概自界说membershipinfo表的办法。
列出profile创建用户的办法。SQL语句对照复杂,略过不写。
protectedvoidButton1_Click(objectsender,EventArgse)
{
MembershipCreateStatusstatus;
MembershipUsernewUser=Membership.CreateUser(username.Text.Trim(),Password.Text.Trim(), Email.Text.Trim(),Question.Text.Trim(),Answer.Text.Trim(),true,outstatus);
//利用membership创建用户,并把创建了局前往给MembershipCreateStatus
if(newUser==null)//没有新用户,则意味着堕落。
{
GetErrorMessage(status);
//挪用GetErrorMessage函数,前往具体毛病信息
}else{
Roles.AddUserToRole(newUser.UserName,"jiancai");
//增加用户到响应组ProfileCommon
p=(ProfileCommon)ProfileCommon.Create(newUser.UserName,true);
p.QQ=QQ.Text.Trim();
p.address=address.Text.Trim();
p.phone=phone.Text.Trim();
p.Save();
}
}
publicvoidGetErrorMessage(MembershipCreateStatusstatus)
{
switch(status)
{
caseMembershipCreateStatus.DuplicateUserName:DisplayAlert("以后用户已存在,请从头选择");
break;
//其他各类毛病信息,请检察MSDN的MembershipCreateStatus列举类。
default:DisplayAlert("注册00000000用户失利,请反省您的用户名,暗码等信息");
break;
}
}
团体看法:接纳profile的办法,对照便利,因为profile是强范例,能够经由过程智能感知功效削减代码的输出量。接纳自界说数据表的办法,必要输出大批的sql语句,可是查询速率对照快,功能对照强,因为Roles.GetUsersInRole()办法没法分页读取数据,只能一次性读出来一切数据,而自写SQL语句能够很便利的根分页分离起来。跟着用户量的增加,故不保举profile办法。
<P> 3、暗码成绩。
团体以为暗码是一个对照头疼的成绩。我们在实践开辟中老是必要admin组有对用户举行暗码修正的权限。Membership供应的修正暗码办法只能在已晓得暗码提醒谜底的时分才干修正。而admin组基本不成能晓得用户的暗码提醒谜底的。这里有点可笑。岂非是中东方文明差别?
列出团体对membership暗码研讨的一些心得。
人人都晓得machine.config和web.config,假如二者产生抵触,那末以web.config优先。
默许形态下,membership是接纳SHA1的办法举行加密,然后接纳一种机制,与passwordsalt举行再次加密,最初构成数据库中显现的暗码。可见跟着MD5加密的破解,微软对暗码的平安也挖空心思。
有的伴侣不喜好默许的SHA1加密情势,我们只必要在web.config中设置以下代码来掩盖machine.config中对暗码的设置就行了:
<machineKey
validationKey="AutoGenerate,IsolateApps"
decryptionKey="AutoGenerate,IsolateApps"
decryption="Auto"
validation="MD5/SHA1/Clear"/>
个中:
Clear-暗码以明文情势存储。用户暗码可与此值间接对照,而不必要举行进一步的转换。
MD5-利用动静择要5(MD5)哈希择要存储暗码。为了考证凭证,将利用MD5算法对用户暗码举行哈希运算并将盘算出来的值与存储的值举行对照。利用此值时,从不存储或对照明文暗码。此算法的功能比SHA1好。
SHA1-利用SHA1哈希择要存储暗码。为了考证凭证,将利用SHA1算法对用户暗码举行哈希运算并将盘算出来的值与存储的值举行对照。从不存储明文暗码。利用该算法能够取得比MD5算法高的平安性。
但是固然MembershipUser供应了GetPassword办法,可是这是后只要在加密情势设置成Clear,即暗码在数据库中以密码的情势存在,才干失掉暗码。而ChangePassword必需要供应旧暗码大概暗码提醒谜底才能够修正。对用户办理形成了很年夜的方便。找了很多材料无解。特地提带一下:微软的membership机制劈头于csblog,并举行了必定的修正。
Csblog对暗码的战略:起首对用户输出的暗码举行加密(SHA1大概MD5),然后依据体系主动天生的密匙再次对加密后的暗码举行DES加密。不外我依照csblog的办法举行加密的时分,情势不异,暗码却分歧,今朝正在演就中。也接待人人配合会商。
假如passwordsalt和password流动,那末用户暗码一定必定。以是今朝我接纳的一个办法就是给用户从头设置成流动暗码的功效。
起首获得已知用户暗码的passwordsalt和password,然后交换响应用户的passwordsalt和password字段。这时候,用户的暗码就已恢复成已知的暗码了。
不成否定,membership给我们开辟中制造了很年夜的便当,其便利的Roles功效,关于我们举行权限办理的时分供应了很好的办理计划。2005很多功效均退化自csblog这优异的开源项目,有乐趣者能够研讨csblog,以进一步的懂得membership的运作机制。限于篇幅,MSDN上边有做先容的我就不再反复叙说。只先容MSDN上没有列出的技能跟我在项目开辟中的一些心得。ASP.NET2.0为利用窗体身份考证的Web站点供应了主要的平安性上风。经由过程供应用户设置文件储蓄库和对脚色的撑持,窗体身份考证将走出ASP.NET熟行的视野,而得以更普遍地完成。Java欺骗了我们那么多年,如今的多核时代,我认为它气数已尽! 提供基于组件、事件驱动的可编程网络表单,大大简化了编程。还可以用ASP.NET建立网络服务。 在asp.net虚拟主机的服务提供商中,目前首推的是CNNIC的其中一家域名注册机构---时代互联(www.now.net.cn),他们早在2001年微软刚推出Asp.net时就推出了对应的Asp.net虚拟主机了,经笔者的使用测试,他提供的Asp.net性能非常的稳定,版本也会定期的更新,目前他的 ASP(ActiveServerPages)是Microsfot公司1996年11月推出的WEB应用程序开发技术,它既不是一种程序语言,也不是一种开发工具,而是一种技术框架,不须使用微软的产品就能编写它的代码。 能产生和执行动态、交互式、高效率的站占服务器的应用程序。运用ASP可将VBscript、javascript等脚本语言嵌入到HTML中,便可快速完成网站的应用程序,无需编译,可在服务器端直接执行。容易编写。 对于中小项目来说.net技术是完全可以胜任,但为什么现在大型公司或网站都选择php或java呢?就是因为微软不够开放,没有提供从硬件到应用服务器再到业务应用的整套解决方案。 ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象。 比如封装性、继承性、多态性等等,这就解决了刚才谈到的ASP的那些弱点。封装性使得代码逻辑清晰,易于管理,并且应用到ASP.Net上就可以使业务逻辑和Html页面分离,这样无论页面原型如何改变。
页:
[1]