ASP.NET 2.0中使用自訂provider

來源:互聯網
上載者:User
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
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就完成了,可以搭配登陸,註冊等控制項進行使用了。運行程式,首先是出現使用者註冊的頁面,當使用者成功註冊後,則會將使用者引導到登陸頁面,如所示:

  當使用者成功登陸後,如所示:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.