唐山网站建设

设为主页 加入收藏 繁體中文

ASP.NET 2.0中使用自定义provider

核心提示:ASP.NET2.0中使用自定义provider,浏览ASP.NET2.0中使用自定义provider,在ASP.NET2.0中,新增加的membershipprovider功能,和结合功能强大的1系列注册,登陆控件,可以很方便地对用户的登陆和权限等进行治理(参见<>)。但是,可

在ASP.NET2.0中,新增加的membershipprovider功能,和结合功能强大的1系列注册,登陆控件,可以很方便地对用户的登陆和权限等进行治理(参见<>)。

但是,可能大家会发现,ASP.NET2.0自带的这些登陆控件和membership的治理功能,默许的是和sqlserver2005express搭配使用的,那末,如何改成使用SQLServer2000或是其他的数据源,如access,oracle等呢?假设自己想在利用中,另外重新写1个对登陆用户或用户权限等治理的利用,要如何修改呢?在本文中,将给出在ASP.NET2.0中使用自定义provider,以配合登陆控件来实现1个简单的登陆进程。

为了明白ASP.NET2.0中的provider是如何工作的,首先看下下面的结构图:


由上图可以清楚看到,在最上面的1层,是各类的登陆控件,下面1层是与member有关的membershipapi。在MembershipApi中,membership类履行有关对用户的操纵,比如增加,删除用户,而MembershipUser类则存储有关用户的个人信息,如用户名,密码,EMAIL等信息。

在VisualStudio2005beta2中,默许使用的是Sqlexpressmembershipprovider。Provider的作用,是起到沟通MembershipApi和数据库,使得用户其实不需要关心要使用的是何种数据库,全部的操纵都可以用各类相应的数据provider来实现。

但很多时候,ASP.NET2.0默许支持的provider是不能满足其需要的,我们可以自己根据需要编写provider.在本文中,将先容如何使用access数据库,建立1个数据表,寄存用户的信息。本文先容的方法,也能够适用在其他数据库上。

首先,我们打开VisualStudio2005beta2,选用VB.NET,新建1个WEBSITE站点。在这个例子中,为简单起见,我们设置1个用户注册表单,1个登陆的表单,新用户可以先注册,之落后行登陆。

接着,往默许的窗体中,拖放1个CreateUserWizard的控件,这是1个系统提供的新建用户的自动控件,可以很方便地新建1个用户。为了页面美观,我们点控件右上方的"智能感知",选择"autoformat",在弹出的窗体中,再选择"Elegant"样式,以下图所示:


固然,我们可以任意修改该控件的文字提示。这里我们为了让能使用户在注册后能转到登陆页面,因此,设置该控件的ContinueDestinationPageUrl属性的值为:Login.aspx,这个页面等下会编写。

接着,再拖拉1个LoginView控件到default.aspx页面中。在该控件中,可以设置两种模版:Anonymous模版,表示在用户未登陆前,访客看到的状态;LoggedIn模版,表示等用户成功登陆后,看到的状态(这里可以设置1些文字显示,比如欢迎进进等,同时1般会显示用户的名字)。

在这里,我们在LoginView控件中的LoggedIn模版中,我们输进"Youareloggedin",并且增加1个LoginName和1个LoginStatus控件。其中,LoginName控件显示登陆后用户的ID,而LoginStatus控件,则当用户登陆后,会显示logout(注销)的链接。以下两图所示:


接着,再往项目中新增加1窗体,命名为login.aspx,再往该窗体中增加1个login控件,以下图:


接下来,我们要做的工作是创建数据库了。我们在工作目录下,用access创建1个名为Members.mdb的数据库,数据结构表以下图所示:

FieldNameDataTypeFieldSize
Username(key)Text8
PasswordText8
EmailText50
passwordQuestionText50
passwordAnswerText50
在创建自己的provider前,我们先了解下在ASP.NET2.0中的provider的构造。在ASP.NET2.0beta2中,默许的SqlMembershipProvider是继续MembershipProvider类的,MembershipProvider类又是继续自ProviderBase这个基类的,以下图所示:


假设想修改已有的sqlmembershipprovider,则只需要创建1个类,继续SqlMembershipProvider类,并覆盖其方法便可以够了,比以下面的例子:
 
PublicClassModifiedSqlMembershipProvider
InheritsSqlMembershipProvider

PublicOverridesFunctionCreateUser(...)
...
EndFunction
...
EndClass

假设不想使用在VisualStudio2005beta2中提供的SqlMembershipProvider,则只需要声明自己的类,并且继续MembershipProvider类便可以够了。MembershipProvider类包括了与membership相干的方法和属性。

在SolutionExplorer中,使用"AddNewitem..",增加1个类,命名为AccessMembershipProvider.vb,并按系统提示,将其放到App_Code目录中往。

接下来,援用相干的命名空间,并且写出程序的框架以下:

ImportsMicrosoft.VisualBasic
ImportsSystem.Data

PublicClassAccessMembershipProvider
InheritsMembershipProvider
EndClass

为了要使用自定义的provider,必须在web.config中进行相干的配置。可以新增加1个web.config文件,写进以下的代码:



defaultProvider="AccessMembershipProvider">

type="AccessMembershipProvider"
requiresQuestionAndAnswer="true"
connectionString="Provider=Microsoft.Jet.
OLEDB.4.0;DataSource=C:\NewMembershipProvider\
App_Data\Members.mdb;PersistSecurity
Info=False"/>


其中,要留意以下几点:

必须选择验证方式为"Forms"(authenticationmode="forms").

通过使用标签,增加1个自定义的provider,名称叫AccessMembershipProvider。

其中的requiresQuestionAndAnswer属性,当其值为true时,指出在新注册时,必须填写提示题目和要回答的答案。

ConnectionString,指出要进行数据库连接的连接串。

DefaultProvider属性,指出系统默许使用哪1个provider,由于1个系统中可以设置多个provider.

在AccessMembershipProvider.vb中,增加以下的私有成员

PrivateconnStrAsString
PrivatecommAsNewOleDb.OleDbCommand
Private_requiresQuestionAndAnswerAsBoolean
Private_minRequiredPasswordLengthAsInteger

并且增加Initialize()方法,代码以下

PublicOverridesSubInitialize(ByValnameAsString,ByValconfigAsSystem.Collections.Specialized.NameValueCollection)

’===retrivestheattributevaluessetin
’web.configandassigntolocalvariables===
Ifconfig("requiresQuestionAndAnswer")="true"Then_
_requiresQuestionAndAnswer=True
connStr=config("connectionString")
MyBase.Initialize(name,config)
EndSub

当provider被装载时,会调用Initialize()方法。刚才在web.config文件中,使用标签设置的各类属性值,都能在这个方法中读取。比如,可以通过使用config参数来读取,上面的代码中,就使用config("connectionString")来读取数据库连接字符串,并放到变量connStr变量中往。以后,再设置RequiresQuestionAndAnswer属性,以下:

PublicOverridesReadOnlyProperty_
RequiresQuestionAndAnswer()_
AsBoolean
Get
If_requiresQuestionAndAnswer=TrueThen
ReturnTrue
Else
ReturnFalse
EndIf
EndGet
EndProperty

要留意,必须设置该属性的值,否则,在CreateUserWizard控件中,则不会显示密码提示题目和密码提示答案两个文本框。

接下来,我们可以开始编写新建用户的代码了,CreateUser()方法的代码以下:

PublicOverridesFunctionCreateUser(ByValusernameAsString,ByValpasswordAsString,ByValemailAsString,ByValpasswordQuestionAsString,ByValpasswordAnswerAsString,ByValisApprovedAsBoolean,ByValproviderUserKeyAsObject,ByRefstatusAsSystem.Web.Security.MembershipCreateStatus)AsSystem.Web.Security.MembershipUser
DimconnAsNewOleDb.OleDbConnection(connStr)
Try
conn.Open()
DimsqlAsString="INSERTINTOMembershipVALUES("&_
"@username,@password,@email,"&_
"@passwordQuestion,@passwordAnswer)"
DimcommAsNewOleDb.OleDbCommand(sql,conn)
comm.Parameters.AddWithValue("@username",username)
comm.Parameters.AddWithValue("@password",password)
comm.Parameters.AddWithValue("@email",email)
comm.Parameters.AddWithValue("@passwordQuestion",passwordQuestion)
comm.Parameters.AddWithValue("@passwordAnswer",passwordAnswer)
DimresultAsInteger=comm.ExecuteNonQuery()
conn.Close()

status=MembershipCreateStatus.Success
DimuserAsNewMembershipUser("AccessMembershipProvider",username,Nothing,email,passwordQuestion,Nothing,True,False,Now,Nothing,Nothing,Nothing,Nothing)
Returnuser
CatchexAsException
status=MembershipCreateStatus.UserRejected
ReturnNothing
EndTry
EndFunction

我们解读1下上面的代码,首先,我们往数据库插进了1条记录,在新增用户成功后,我们必须返回1个状态信息status(该status时在传进时以ByRefstatusAsSystem.Web.Security.MembershipCreateStatus方式传进),并且我们要返回1个MembershipUser的类的实例,因此,我们以这样的方式返回实在例:

DimuserAsNewMembershipUser("AccessMembershipProvider",username,Nothing,email,passwordQuestion,Nothing,True,False,Now,Nothing,Nothing,Nothing,Nothing)

其中,使用到MembershipUser类的方法的构造函数有很多,具体的可以查看MSDN,在这里我们只用到了username,email,passwordQuestion,createdate(帐号创建日期,这里使用NOW)。

而在登陆页面里,为了判定是否是为正当用户登陆,则需要编写以下代码:

PublicOverridesFunctionValidateUser(_
ByValusernameAsString,_
ByValpasswordAsString)AsBoolean

DimconnAsNewOleDb.OleDbConnection(connStr)
Try
conn.Open()
DimsqlAsString=_
"Select*FromMembershipWHERE"&_
"username=@usernameANDpassword=@password"
DimcommAsNewOleDb.OleDbCommand(sql,conn)
comm.Parameters.AddWithValue("@username",_
username)
comm.Parameters.AddWithValue("@password",_
password)
DimreaderAsOleDb.OleDbDataReader=_
comm.ExecuteReader
Ifreader.HasRowsThen
ReturnTrue
Else
ReturnFalse
EndIf
conn.Close()

CatchexAsException
Console.Write(ex.ToString)
ReturnFalse
EndTry
EndFunction

就这样,1个简单的自定义provider就完成了,可以搭配登陆,注册等控件进行使用了。运行程序,首先是出现用户注册的页面,当用户成功注册后,则会将用户引导到登陆页面,以下图所示:


当用户成功登陆后,以下图所示:


http://www.fw8.net/
TAG:用户,方法,属性,控件,下图
评论加载中...
内容:
评论者: 验证码: