`

ASP.NET 2.0中使用自定义provider (2)

阅读更多
 在tech ed 2005上,有对asp.net 2.0的介绍,其中讲到asp.net 2.0提供了很多功能,让程序员做少很多东西,这引起了大家的疑惑:asp.net 2.0的自定义能力如何?扩展能力如何?程序员可以扩展微软提供的东西么?下面,我对asp.net 2.0的provider进行了考察,结合资料编译了下文,讲解如何自定义provider于登陆控件使用,同时可以参考http://jackyrong.cnblogs.com/archive/2005/09/02/228533.html一文中,本文可以看做是该文的扩展吧(本文同时发表在http://dev.yesky.com/msdn/373/2128373.shtml?412上)
    

asp.net 2.0中,新增加的membership provider功能,以及结合功能强大的一系列注册,登陆控件,可以很方便地对用户的登陆和权限等进行管理(参见
<<asp.net 2.0登陆控件简介>>一文(http://www.yesky.com/466/1870966.shtml)。<!----><o:p></o:p>

但是,可能大家会发现,asp.net 2.0自带的这些登陆控件和membership的管理功能,默认的是和sql server 2005 express搭配使用的,那么,如何改成使用sql server 2000或者是其他的数据源,如access,oracle等呢?如果自己想在应用中,另外重新写一个对登陆用户或者用户权限等管理的应用,要如何修改呢?在本文中,将给出在asp.net 2.0中使用自定义provider,以配合登陆控件来实现一个简单的登陆过程。<o:p></o:p>

为了明白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
End Get
End Property

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

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

Public Overrides Function CreateUser(ByVal username As String, ByVal password As String, ByVal email As String, ByVal passwordQuestion As String, ByVal passwordAnswer As String, ByVal isApproved As Boolean, ByVal providerUserKey As Object, ByRef status As System.Web.Security.MembershipCreateStatus) As System.Web.Security.MembershipUser
Dim conn As New OleDb.OleDbConnection(connStr)
Try
conn.Open()
Dim sql As String = "INSERT INTO Membership VALUES (" & _
"@username, @password, @email, " & _
" @passwordQuestion, @passwordAnswer )"
Dim comm As New OleDb.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)
Dim result As Integer = comm.ExecuteNonQuery()
conn.Close()

status = MembershipCreateStatus.Success
Dim user As New MembershipUser("AccessMembershipProvider", username, Nothing, email, passwordQuestion, Nothing, True, False, Now, Nothing, Nothing, Nothing, Nothing)
Return user
Catch ex As Exception
status = MembershipCreateStatus.UserRejected
Return Nothing
End Try
End Function

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

Dim user As New MembershipUser("AccessMembershipProvider", username, Nothing, email, passwordQuestion, Nothing, True, False, Now, Nothing, Nothing, Nothing, Nothing)

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

  而在登陆页面里,为了判断是否为合法用户登陆,则需要编写如下代码:

Public Overrides Function ValidateUser( _
ByVal username As String, _
ByVal password As String) As Boolean

Dim conn As New OleDb.OleDbConnection(connStr)
Try
conn.Open()
Dim sql As String = _
"Select * From Membership WHERE " & _
"username=@username AND password=@password"
Dim comm As New OleDb.OleDbCommand(sql, conn)
comm.Parameters.AddWithValue("@username", _
username)
comm.Parameters.AddWithValue("@password", _
password)
Dim reader As OleDb.OleDbDataReader = _
comm.ExecuteReader
If reader.HasRows Then
Return True
Else
Return False
End If
conn.Close()

Catch ex As Exception
Console.Write(ex.ToString)
Return False
End Try
End Function

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

相关推荐

    圣殿祭司配书盘 asp.net2.0开发详解 示范案例

    而"范例数据库"则可能包含了与范例程序配合使用的数据,用于演示如何在ASP.NET 2.0环境中操作和展示数据库数据。 学习这个资源,不仅可以提升对ASP.NET 2.0技术的理解,也能为实际项目开发积累宝贵经验。通过动手...

    ASP.NET2.0快速入门教程

    ASP.NET 2.0是微软开发的一个用于构建Web应用程序的框架,它是在.NET Framework 2.0的基础上构建的。这个快速入门教程旨在帮助初学者快速理解并掌握ASP.NET 2.0的核心概念和技术,以便能够高效地开发动态网页。 1. ...

    asp.net2.0中一个简单的用户登录注册的例子

    5. **Membership Provider**: 这是ASP.NET 2.0中处理用户数据的抽象层。开发者可以选择SQL Server Membership Provider,将用户数据存储在SQL Server数据库中,也可以选择其他支持的提供者。 6. **数据库设计**: 在...

    ASP.net2.0的新特性

    ASP.NET 2.0加强了缓存机制,允许开发者更有效地管理应用程序的内存使用,减少对服务器资源的依赖,从而提高性能和响应速度。 6. **URL重写(URL Mapping)**: ASP.NET 2.0引入了URL重写功能,允许开发者将友好...

    ASP.NET 2.0技术详解与应用实例 源码

    本书的后四章介绍了ASE.NET2.0 Person Starter Kits,ASE.NET 2.0 Club Starter Kit,ASE.NET Classifieds Starter Kit和ASE.NET Time Tracker Start kit的实现要点,进一步说明了ASENET2.0新技术的实际使用。...

    ASP.NET 2.0+sql2005电子商务网站

    ASP.NET 2.0+SQL Server 2005电子商务网站构建是微软技术栈中的一个重要组合,它为电子商务解决方案提供了一个强大而安全的平台。在当今数字化时代,电子商务网站的建设和维护不仅要求技术的先进性,还要求系统的...

    2008微软认证-Web应用开发-ASP.NET2.0

    对于"2008微软认证-Web应用开发-ASP.NET2.0",考生需要掌握以下知识点: 1. **生命周期和页面事件**:理解ASP.NET页面的生命周期,包括初始化、加载、回发、保存状态和卸载等各个阶段,以及对应的关键事件。 2. *...

    asp.net 2.0 .cook

    在ASP.NET 2.0中,最重要的提升是增强了Web应用程序的开发效率和功能。以下是一些关键知识点: 1. **控件模型**:ASP.NET 2.0引入了一种新的控件模型,它允许开发者创建声明性代码,使得界面设计更加直观。控件如...

    ASP.NET 2.0网页制作彻底研究(程序代码)

    通过深入学习"ASP.NET 2.0网页制作彻底研究",开发者可以全面掌握该框架的使用,包括从基础的页面结构和控件,到高级的性能优化和安全策略,为构建高质量的Web应用程序打下坚实的基础。在实践中不断探索和实践,才能...

    ASP.NET 2.0快速入门(6):ASP.NET 2.0 成员管理

    在这个“ASP.NET 2.0快速入门(6):ASP.NET 2.0 成员管理”的教程中,我们将深入探讨如何在ASP.NET 2.0中实现用户注册、登录以及相关的权限控制。 1. **成员资格提供程序**:ASP.NET 2.0引入了一种灵活的方式来管理...

    ASP.NET 2.0 + SQL Server 动态网站开发从基础到实践Chapter13

    2. **Web Forms**:ASP.NET 2.0的核心是Web Forms模型,它允许开发者使用类似Windows编程的事件驱动模式来创建网页。本章将教授如何使用Web Forms创建视频点播页面,包括播放、暂停、停止等交互功能。 3. **SQL ...

    ASP.NET2.0全程指南

    2. **Web表单(Web Forms)**:ASP.NET 2.0中的Web Forms模型允许开发者使用事件驱动的编程模型,类似于桌面应用程序开发。控件如TextBox、Button等可以直接在页面上拖放,通过事件处理程序实现交互逻辑。 3. **ASP...

    ASP.NET 2.0快速入门(15):ASP.NET 2.0 的扩展应用

    8. ** Membership 和 Role Provider**:ASP.NET 2.0的Membership和Role Provider为用户管理和权限控制提供了标准化的接口。开发者可以轻松集成用户注册、登录、权限验证等功能,而无需从零开始构建这些基础架构。 9...

    深入挖掘ASP.NET 2.0系列课程(6):个性化定制ASP.NET 2.0

    8. **提供程序模型(Provider Model)**:ASP.NET 2.0的提供程序模型允许开发者使用预定义的接口来实现自己的数据存储机制,如数据库、XML文件或Active Directory,这使得个性化功能能够适应各种后端环境。...

    asp.net 2.0技术内幕(中文版)part5-7

    3. **Web服务与WCF**:可能涉及ASP.NET 2.0中的Web服务开发,以及如何使用Windows Communication Foundation(WCF)进行更高级的服务集成。 4. **配置管理**:介绍如何使用Web.config文件进行应用程序配置,以及...

    ASP.NET 2.0编程珠玑

    在ASP.NET 2.0中,每个服务器控件都有一个生命周期,包括初始化、加载视图状态、处理事件、渲染等阶段。理解这个生命周期对于优化性能和正确处理用户交互至关重要。 三、母版页(Master Pages) 母版页是ASP.NET ...

    ASP.NET 2.0 网上书城

    - **ADO.NET**:ASP.NET 2.0使用ADO.NET作为数据访问层,它提供了连接数据库、执行SQL语句、处理结果集等功能。 - **DataSet/DataTable**:内存中的数据缓存,可以用来存储从数据库检索的数据,支持离线操作。 - ...

    ASP.NET 2.0全程指南(程序)

    2. **控件体系**:ASP.NET 2.0提供了丰富的服务器控件,如TextBox、Button、Label等,这些控件可以方便地处理用户输入和响应事件。同时,控件的声明式编程方式简化了页面逻辑的编写。 3. **View State**:为了保持...

    asp.net 2.0 基础知识

    GridView 控件是在 ASP.NET 2.0 中新加入的一个强大控件,它取代了 ASP.NET 1.x 中的 DataGrid 控件。GridView 控件提供了更为丰富的数据展示功能,支持分页、排序、编辑等操作。此外,GridView 控件还支持自定义...

Global site tag (gtag.js) - Google Analytics