亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

ASP.NET 2.0中使用自定義provider

2019-11-18 19:10:33
字體:
來源:轉載
供稿:網友

  在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就完成了,可以搭配登陸,注冊等控件進行使用了。運行程序,首先是出現用戶注冊的頁面,當用戶成功注冊后,則會將用戶引導到登陸頁面,如下圖所示:


  當用戶成功登陸后,如下圖所示:



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品视频1区| 国内精品小视频| 国产精品最新在线观看| 精品国产福利视频| 免费av一区二区| 国产这里只有精品| 精品国产乱码久久久久酒店| www.欧美免费| 国产亚洲精品美女久久久| 国产情人节一区| 中文字幕在线看视频国产欧美| 欧美一级电影在线| 日本一区二区三区在线播放| 91精品久久久久久久| 成人两性免费视频| 欧美激情乱人伦一区| 欧美理论电影在线播放| 欧美精品一本久久男人的天堂| 国产999视频| 欧美激情中文字幕在线| 欧美性猛交xxxx乱大交极品| 亚洲欧美另类人妖| 欧美性xxxx极品hd满灌| 欧美在线影院在线视频| 亚洲xxxx在线| 国产精品视频大全| 国产精品福利在线观看网址| 国产精品视频一区二区高潮| 国产欧美韩国高清| www国产亚洲精品久久网站| 亚洲欧洲第一视频| 日韩视频在线免费观看| 欧美精品性视频| 欧美中文在线字幕| 精品成人国产在线观看男人呻吟| 亚洲免费影视第一页| 日韩人体视频一二区| 亚洲一区二区自拍| 亚洲国产91精品在线观看| 国内精品视频在线| 成人欧美在线视频| 亚洲电影免费观看高清完整版| 久久夜精品香蕉| 欧美另类在线观看| 国产精品91久久久| 91最新在线免费观看| 国产91热爆ts人妖在线| 欧美日韩免费观看中文| 中文字幕精品视频| 欧美日韩中文字幕在线视频| 国产精品国语对白| 成人午夜黄色影院| 亚洲欧美国产高清va在线播| 国产精品一二三在线| 中文字幕亚洲无线码在线一区| 成人av.网址在线网站| 日韩在线中文视频| www.日韩欧美| 欧美日韩福利在线观看| 亚洲一区中文字幕| 亚洲成人精品视频在线观看| 中文字幕成人精品久久不卡| 亚洲一区二区三区成人在线视频精品| 日韩欧美国产中文字幕| 97婷婷涩涩精品一区| 欧美劲爆第一页| 国自在线精品视频| 性欧美xxxx视频在线观看| 欧美精品少妇videofree| 欧美一级电影在线| 最近2019好看的中文字幕免费| 久久久精品视频在线观看| 国内精品400部情侣激情| 91超碰caoporn97人人| 亚洲四色影视在线观看| 色噜噜狠狠狠综合曰曰曰88av| 理论片在线不卡免费观看| 亚洲综合色av| 中日韩午夜理伦电影免费| 日韩美女毛茸茸| 久久久久久国产精品美女| 欧美午夜www高清视频| 亚洲久久久久久久久久久| 久久久久久国产精品| 日韩有码视频在线| 亚洲成年人影院在线| 亚洲精品二三区| 97av在线视频免费播放| 亚洲欧美福利视频| 国产男女猛烈无遮挡91| 国产一区二区在线播放| 欧美激情在线播放| 国产自产女人91一区在线观看| 777国产偷窥盗摄精品视频| 国产精自产拍久久久久久| 亚洲成人久久电影| 久久影院免费观看| 久久天天躁狠狠躁老女人| 亚洲美女久久久| 永久免费毛片在线播放不卡| 97福利一区二区| 久久精品中文字幕免费mv| 亚洲第一偷拍网| 日韩美女免费线视频| 国产精品91久久| 日韩美女视频中文字幕| 精品亚洲夜色av98在线观看| 欧美一级淫片播放口| 91黑丝在线观看| 日韩av电影在线网| 久久精品影视伊人网| 亚洲午夜未满十八勿入免费观看全集| 欧美日韩国产一区二区| 日韩av理论片| 亚洲免费av电影| 欧美激情欧美激情在线五月| 久久精品一本久久99精品| 高清日韩电视剧大全免费播放在线观看| 亚洲成人免费网站| 亚洲欧美一区二区三区久久| 热久久美女精品天天吊色| 中文字幕最新精品| 91亚洲精品一区二区| 美日韩精品免费观看视频| 欧美黄色片在线观看| 伊人伊成久久人综合网小说| 亚洲精品小视频在线观看| 久久免费少妇高潮久久精品99| 国产精品男女猛烈高潮激情| 九九热r在线视频精品| 亚洲一区久久久| 欧美怡红院视频一区二区三区| 欧美精品久久一区二区| 精品久久久久久久久国产字幕| 亚洲电影成人av99爱色| 国产精品91久久| 亚洲国产高清福利视频| 亚洲第一色在线| 亚洲精品91美女久久久久久久| 国产va免费精品高清在线观看| 狠狠色香婷婷久久亚洲精品| 亚洲综合在线小说| 国模叶桐国产精品一区| 亚洲综合大片69999| 超碰日本道色综合久久综合| 国产亚洲欧美一区| 亚洲欧美国产一区二区三区| 91久久国产精品91久久性色| 97在线精品视频| 精品久久久久久久久久ntr影视| 欧美精品福利在线| 九色91av视频| 国产成人av在线播放| 精品久久久久久久久久久久| 精品欧美一区二区三区| 国产精品网站入口| 欧美中文字幕在线视频| 亚洲男人天堂网站| 久久久久久久电影一区| 欧美日韩成人在线观看| 欧洲成人午夜免费大片| 久久久久久久电影一区| 亚洲国产精品系列| 粗暴蹂躏中文一区二区三区|