当前位置:编程学习 > C#/ASP.NET >>

ASP.NET 2.0中使用自定义provider

答案:     在ASP.NET 2.0中,新增加的membership provider功能,以及结合功能强大的一系列注册,登陆控件,可以很方便地对用户的登陆和权限等进行管理(参见<<ASP.NET 2.0登陆控件简介>>)。
  
    但是,可能大家会发现,ASP.NET 2.0自带的这些登陆控件和membership的管理功能,默认的是和sql server 2005 express搭配使用的,那么,如何改成使用SQL Server 2000或者是其他的数据源,如access,oracle等呢?如果自己想在应用中,另外重新写一个对登陆用户或者用户权限等管理的应用,要如何修改呢?在本文中,将给出在ASP.NET 2.0中使用自定义provider,以配合登陆控件来实现一个简单的登陆过程。
  
    为了明白ASP.NET 2.0中的provider是如何工作的,首先看下下面的结构图:
  
  
  由上图可以清楚看到,在最上面的一层,是各类的登陆控件,下面一层是与member有关的membership api。在Membership Api中,membership 类执行有关对用户的操作,比如增加,删除用户,而MembershipUser类则存储有关用户的个人信息,如用户名,密码,EMAIL等信息。
  
    在Visual Studio 2005 beta 2中,默认使用的是Sql express membership provider。Provider的作用,是起到沟通Membership Api以及数据库,使得用户并不需要关心要使用的是何种数据库,全部的操作都可以用各类相应的数据provider来实现。
  
    但很多时候,ASP.NET 2.0默认支持的provider是不能满足其需要的,我们可以自己根据需要编写provider.在本文中,将介绍如何使用access数据库,建立一个数据表,存放用户的信息。本文介绍的方法,也可以适用在其他数据库上。
  
    首先,我们打开Visual Studio 2005 beta 2,选用VB.NET,新建一个WEB SITE站点。在这个例子中,为简单起见,我们设置一个用户注册表单,一个登陆的表单,新用户可以先注册,之后进行登陆。
  
    接着,往默认的窗体中,拖放一个CreateUserWizard的控件,这是一个系统提供的新建用户的自动控件,可以很方便地新建一个用户。为了页面美观,我们点控件右上方的"智能感知",选择"auto format",在弹出的窗体中,再选择"Elegant"样式,如下图所示:
  
  当然,我们可以任意修改该控件的文字提示。这里我们为了让能使用户在注册后能转到登陆页面,因此,设置该控件的ContinueDestinationPageUrl属性的值为:Login.aspx,这个页面等下会编写。
  
    接着,再拖拉一个LoginView控件到default.aspx页面中。在该控件中,可以设置两种模版:Anonymous模版,表示在用户未登陆前,访客看到的状态;LoggedIn 模版,表示等用户成功登陆后,看到的状态(这里可以设置一些文字显示,比如欢迎进入等,同时一般会显示用户的名字)。
  
    在这里,我们在LoginView控件中的LoggedIn 模版中,我们输入"You are logged in",并且增加一个LoginName和一个LoginStatus控件。其中,LoginName控件显示登陆后用户的ID,而LoginStatus控件,则当用户登陆后,会显示logout(注销)的链接。如下两图所示:
  
  
  接着,再往项目中新增加一窗体,命名为login.aspx,再往该窗体中增加一个login控件,如下图:
  
  接下来,我们要做的工作是创建数据库了。我们在工作目录下,用access创建一个名为Members.mdb的数据库,数据结构表如下图所示:
  
  Field Name Data Type Field Size
  Username (key) Text 8
  Password Text 8
  Email Text 50
  passwordQuestion Text 50
  passwordAnswer Text 50
  
  在创建自己的provider前,我们先了解下在ASP.NET 2.0中的provider的构造。在ASP.NET 2.0 beta 2中,默认的SqlMembershipProvider是继承MembershipProvider类的,MembershipProvider类又是继承自ProviderBase这个基类的,如下图所示:
  
  如果想修改已有的sql membership provider,则只需要创建一个类,继承SqlMembershipProvider类,并覆盖其方法就可以了,比如下面的例子:
  
  Public Class ModifiedSqlMembershipProvider
  Inherits SqlMembershipProvider
  
  Public Overrides Function CreateUser (...)
  ...
  End Function
  ...
  End Class
  
  如果不想使用在Visual Studio 2005 beta 2中提供的SqlMembershipProvider,则只需要声明自己的类,并且继承MembershipProvider类就可以了。MembershipProvider类包含了与membership相关的方法和属性。
  
    在Solution Explorer中,使用"Add New item..",增加一个类,命名为AccessMembershipProvider.vb,并按系统提示,将其放到App_Code目录中去。
  
    接下来,引用相关的命名空间,并且写出程序的框架如下:
  
  Imports Microsoft.VisualBasic
  Imports System.Data
  
  Public Class AccessMembershipProvider
  Inherits MembershipProvider
  End Class
  
    为了要使用自定义的provider,必须在web.config中进行相关的配置。可以新增加一个web.config文件,写入如下的代码:
  
  <system.web>
  <authentication mode="Forms"/>
  <membership
  defaultProvider="AccessMembershipProvider" >
  <providers>
  <add name="AccessMembershipProvider"
  type="AccessMembershipProvider"
  requiresQuestionAndAnswer="true"
  connectionString="Provider=Microsoft.Jet.
  OLEDB.4.0;Data Source=C:\NewMembershipProvider\
  App_Data\Members.mdb;Persist Security
  Info=False" />
  </providers>
  </membership>
  </system.web>
  
    其中,要留意如下几点:
  
    必须选择验证方式为"Forms"(authentication mode="forms").
  
    通过使用<add>标签,增加一个自定义的provider,名称叫AccessMembershipProvider。
  
    其中的requiresQuestionAndAnswer属性,当其值为true时,指出在新注册时,必须填写提示问题和要回答的答案。
  
    ConnectionString,指出要进行数据库连接的连接串。
  
    DefaultProvider属性,指出系统默认使用哪一个provider,因为一个系统中可以设置多个provider.
  
    在AccessMembershipProvider.vb中,增加以下的私有成员
  
  Private connStr As String
  Private comm As New OleDb.OleDbCommand
  Private _requiresQuestionAndAnswer As Boolean
  Private _minRequiredPasswordLength As Integer
  
    并且增加Initialize()方法,代码如下
  
  Public Overrides Sub Initialize(ByVal name As String, ByVal config As System.Collections.Specialized.NameValueCollection)
  
  ’===retrives the attribute values set in
  ’web.config and assign to local variables===
  If config("requiresQuestionAndAnswer") = "true" Then _
  _requiresQuestionAndAnswer = True
  connStr = config("connectionString")
  MyBase.Initialize(name, config)
  End Sub
  
    当provider被装载时,会调用Initialize()方法。刚才在web.config文件中,使用<add>标签设置的各类属性值,都能在这个方法中读取。比如,可以通过使用config参数来读取,上面的代码中,就使用config("connectionString")来读取数据库连接字符串,并放到变量connStr变量中去。之后,再设置RequiresQuestionAndAnswer属性,如下:
  
  Public Overrides ReadOnly Property _
  RequiresQuestionAndAnswer() _
  As Boolean
  Get
  If _requiresQuestionAndAnswer = True Then
  Return True
  Else
  Return False
  End If

上一个:用ashx动态生成文件
下一个:.net打包自动安装数据库

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,