ASP.NET 網頁製作教本 -- 從基本語法學起 第 15 章 會員管

Download Report

Transcript ASP.NET 網頁製作教本 -- 從基本語法學起 第 15 章 會員管

ASP.NET 網頁製作教本 –
從基本語法學起
第 15 章 會員管理、計費網頁
15-1 會員管理
驗證登入者的幾種方案
ASP.NET 提供三種驗證登入者身份的方法:
1. Windows-based 驗證 。
2. Form-based 驗證 。
3. Passport-based 驗證 。
Form-based 驗證之準備工作

1.
2.
3.
想要以 Form-based 方式驗證登入者,
必須先做好以下準備:
將網頁的所在目錄設定成 IIS 的應用程
式。
設定好 web.config 檔案。
提供一個讓上網者輸入帳號及密碼的輸
入表單 。
將網頁的所在目錄設定成 IIS
的應用程式 Step 1-1
以 /kjaspx/ch15 為例,來說明如何將
ch15 目錄設定成 IIS 的應用程式:
1.開啟 Internet Information Services:過程
是開啟「控制台 -> 系統管理工具 ->
Internet Information Services」。

將網頁的所在目錄設定成 IIS
的應用程式 Step 1-2
1.展開至kjaspx目錄
2.按下滑鼠右鈕
3.選取
將網頁的所在目錄設定成 IIS
的應用程式 Step 2
2.在 Internet Information Services 視窗中,
依序展開「本機電腦->網站->預設的網
站->kjaspx」,然後在 ch15 目錄上面按
下滑鼠右鈕,待出現快顯功能表時,選
取「內容」。
 Internet Information Services 程式在
Windows 2000 裡面稱為「Internet 服務
管理員」,其開啟的過程是:控制台 ->
系統管理工具 -> Internet 服務管理員。
將網頁的所在目錄設定成 IIS
的應用程式 Step 3
3.接著會出現「ch15內容」視窗。
1.按下
2.按下
將網頁的所在目錄設定成 IIS
的應用程式 Step 4
4.檢視 IIS 應用程式與目錄的差異:比較
ch14目錄及ch15目錄在圖示上的差異。
表示這是一般目錄
表示這是 IIS 的應用程式
設定好 web.config 檔案

web.config 檔案的內容:
<configuration>
<system.web>
<authentication mode="Forms">
<forms name="kjaspx_ch15" loginUrl="Login.aspx" />
</authentication>
<authorization>
<deny users="?" />
</authorization>
</system.web>
</configuration
提供一個讓上網者輸入帳號及
密碼的輸入表單: Login.aspx

檢驗帳號及密碼是否正確的依據是
Users.mdb 資料庫的 Users 資料表
UserID Password Name
ada
david
Jackie
James
jason
jimmy
kjwang
sam
sue
toto
walter
ad6633
da6666
Ja2255
Ja111010
ja7700
ji1188
kj6688
sa2266
su1155
to6666
wa6677
方雅達
吳大衛
陳龍
詹明文
謝捷森
楊吉米
王國榮
馬山姆
將淑華
江咚咚
李水特
Email
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
點數
30
30
30
30
30
30
30
30
30
30
30
Form-based 驗證之初體驗 Step 1

開啟瀏覽器,然後在網址欄輸入:
http://localhost/kjaspx/ch15/Hello.aspx

結果並不會直接進入 Hello.aspx 網頁,
而是先出現「請先登入您的帳號及密碼」
的 Login.aspx 網頁。
Form-based 驗證之初體驗 Step 2-1
1.輸入 kjwang
2.輸入 kj6688
3.按下

在 Login.aspx 網頁中,「帳號」欄位請
輸入 kjwang、「密碼」欄位請輸入
kj6688,然後按下「登入」鈕,接著就會
進入 Hello.aspx 網頁。
Form-based 驗證之初體驗 Step 2-2
Form-based 驗證之流程圖
瀏覽 Hello.aspx
通過驗證
瀏覽其他 .aspx 網頁
False
Login.aspx
通過驗證
True
True
Hello.aspx
其他 .aspx
網頁
False
Login.aspx
Form-based 驗證之初體驗 Step 3-1

在瀏覽器的網址欄輸入
「http://localhost/kjaspx/ch15/Hello2.aspx」
瀏覽ch15目錄的另一個網頁 Hello2.aspx,
瀏覽之前,請先猜看看是否會先進入
Login.aspx 網頁?
Form-based 驗證之初體驗 Step 3-2
答案是直接進入Hello2.aspx網頁,並不會
先進入Login.aspx。
 說明:為了避免上網者每瀏覽一個網頁
就必須輸入一次帳號及密碼,ASP.NET
會把登入成功的帳號記錄下來,所以不
會重複要求輸入帳號及密碼。

Form-based 驗證之初體驗 Step 4-1

延續步驟3,現在您位於 Hello2.aspx 網頁,
請按下其中的「登出」鈕,接著網頁會
恢復成 Login.aspx 網頁,如下圖:(註:
Hello.aspx 網頁也有提供「登出」鈕,其
功用與 Hello2.aspx 網頁的「登出」鈕相
同)
Form-based 驗證之初體驗 Step 4-2
Login.aspx
Hello2.aspx
按下
Form-based 驗證之初體驗 Step 4-3

說明:一旦登出之後,ASP.NET 就不記
錄剛才登入成功的帳號,接下來如果要
瀏覽 Hello.aspx 網頁或是 Hello2.aspx 網
頁,都必須要重新登入才行。
Form-based 驗證之初體驗 Step 5

在 Login.aspx 網頁中,請重新輸入「帳
號」及「密碼」,然後核取「記得我」
欄位,再按下「登入」鈕,此時會再度
進入 Hello2.aspx 網頁,但接下來不要按
「登出」鈕,請直接關閉瀏覽器,我們
要做個有趣的實驗。
Form-based 驗證之初體驗 Step 6-1

再度開啟瀏覽器,輸入以下網址來瀏覽
Hello.aspx:
http://localhost/kjaspx/ch15/Hello.aspx

而在瀏覽 Hello.aspx 之前,請先猜看看是
否會先進入Login.aspx?
Form-based 驗證之初體驗 Step 6-2
結果並不會先進入Login.aspx,而是直接
進入Hello.aspx網頁。
 說明:「記得我」的功用是把帳號記錄
在Cookie檔案中,所以除非有按「登出」
鈕,否則就算瀏覽器被關閉了,下次重
新啟動時依然有效。

Form-based 驗證之初體驗 Note

最後請按下 Hello.aspx 網頁的「登出」
鈕。由於剛才的步驟 5 我們核取了「記
得我」欄位,所以如果您沒有登出,帳
號會一直記錄在檔案中,而使得您下次
(也許隔了幾週)測試 ch15 的網頁時,都
不會出現 Login.aspx 網頁,到時候您可
能會覺得網頁出了問題,而其實這都是
正常的現象。
瞭解 Login.aspx 的工作原理(1)
Login.aspx Part I
<%@ Import Namespace="System.Web.Security " %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.OleDb" %>
<Html>
<Body>
<Form runat="server">
<H3>請先登入您的帳號及密碼:<HR></H3>
<Blockquote>
瞭解 Login.aspx 的工作原理(2)
Login.aspx Part II
帳號:<asp:TextBox runat="server" id="Account" /><p>
密碼:<asp:TextBox runat="server" id="Password"
TextMode="Password" /><p>
記得我:<asp:CheckBox runat="server" id="RememberMe" /><p>
<asp:Button runat="server" text="登入" OnClick="Login_Click" /><p>
<asp:Label runat="server" id="Msg" ForeColor="Red" />
</Blockquote><HR>
<Font Size=-1 Color=Blue>登入網頁前, 請確定瀏覽器的 Cookie 是開啟
的.</Font>
</Form>
</Body>
</Html>
瞭解 Login.aspx 的工作原理 (3)
Login.aspx Part III
<script language="VB" runat="server">
Sub Login_Click( sender As Object, e As EventArgs )
If Verify( Account.Text, Password.Text ) Then
FormsAuthentication.RedirectFromLoginPage(Account.Text,
RememberMe.Checked)
Else
Msg.Text = "帳號或密碼錯誤, 請重新輸入!"
End If
End Sub
瞭解 Login.aspx 的工作原理 (4)
Login.aspx Part VI
Function Verify( 帳號 As String, 密碼 As String) As Boolean
Dim Conn As OleDbConnection, Cmd As OleDbCommand
Dim Rd As OleDbDataReader, SQL As String
Dim Provider = "Provider=Microsoft.Jet.OLEDB.4.0"
Dim Database = "Data Source=" & Server.MapPath( "Users.mdb" )
Conn = New OleDbConnection( Provider & ";" & DataBase )
Conn.Open()
瞭解 Login.aspx 的工作原理 (5)
Login.aspx Part V
SQL = "Select * From Users Where " & _
"UserID='" & 帳號 & "'" & _
" And Password='" & 密碼 & "'"
Cmd = New OleDbCommand( SQL, Conn )
Rd = Cmd.ExecuteReader()
If Rd.Read() Then ' 表示有找到 UserID 及 Password, 通過驗證
Conn.Close()
Return True
Else
Conn.Close()
Msg.Text = "帳號或密碼錯誤, 請重新輸入!"
Return False
End If
End Function
</script>
瞭解 Login.aspx 的工作原理(6)
表單的佈置
要完成 Login.aspx 網頁,首先要提供一
個輸入表單,本書所提供的輸入表單含
有三個輸入欄位 -- 帳號、密碼、記得我,
而它們分別命名為 Account、Password、
RememberMe。
瞭解 Login.aspx 的工作原理(7)
Login_Click 事件程序: Part I

If
「登入」鈕所對應的事件程序 Login_Click
Verify( Account.Text, Password.Text ) Then
FormsAuthentication.RedirectFromLoginPage(Account.Text, RememberMe.Checked)
Else
Msg.Text = "帳號或密碼錯誤, 請重新輸入!"
End If
瞭解 Login.aspx 的工作原理(8)
Login_Click 事件程序: Part II

如果已經通過檢驗,則接著呼叫
FormsAuthentication.RedirectFromLoginPage
方法,如下:
FormsAuthentication.RedirectFromLoginPage(Account.Text,
RememberMe.Checked)
瞭解 Login.aspx 的工作原理(9)
Verify 函數

為了檢驗帳號及密碼是否通過驗證,
Verify函數會開啟Users.mdb資料庫,然後
利用以下SQL指令選取資料:
Select * From Users Where UserID='帳號' And Password='密碼'
瞭解 Login.aspx 的工作原理(10)
Hello.aspx
Part
I
<%@ Import Namespace="System.Web.Security " %>
<Html>
<Body>
<H3><%=User.Identity.Name%>, 歡迎使用本網頁!<HR></h3>
<UL>
<LI>當您進入本網頁時,您已經通過 Login.aspx 網頁的驗證。
<LI>ASP.NET 會利用 Cookie 記錄著您已經通過驗證,在沒有關
閉瀏覽器的情況下,您可以瀏覽 ch15 目錄的網頁而不需要重新
輸入帳號及密碼。
<LI>當您不再使用本網頁時,建議您按下「登出」鈕,這樣子可
以保證別人無法在您離開座位時,使用您的帳號瀏覽 ch15 的網
頁。
</UL>
<HR>
瞭解 Login.aspx 的工作原理(10)
Hello.aspx Part II
<Form runat=server>
<asp:Button runat="server" text="登出" OnClick="Logout_Click" />
</Form>
</Body>
</Html>
<script language="VB" runat=server>
Sub Logout_Click(sender As Object, e As EventArgs)
FormsAuthentication.SignOut()
Response.Redirect("Hello.aspx")
End Sub
</script>
瞭解 Login.aspx 的工作原理(11)
mdb 資料庫的保全

為 mdb 資料庫進行「加密」工作,而其
中建立 Connection 物件的程式應改成:
Dim Provider = "Provider=Microsoft.Jet.OLEDB.4.0"
Dim Database = "Data Source=" & Server.MapPath( "UsersPwd.mdb" )
Dim DbPass = "Jet OLEDB:Database Password=kj6688"
Conn = New OleDbConnection( Provider & ";" & DataBase & ";" & DbPass )
Conn.Open()
即時加入會員(1)

範例網頁的組成 :
Member.aspx
會員登錄
加入
舊會員,但是忘了密碼
Forget.aspx
寄出登錄資料
寄出
寫入
讀取
UsersPwd.mdb
(實線):使用者操作的動作
(虛線):程式的動作
即時加入會員 (2)

操作說明(1):
http://localhost/kjaspx/ch15Member/Member.aspx
即時加入會員 (3)

操作說明(2):
如果是舊會員但忘了自己的資料,則可
以按下「舊會員,但是忘了密碼」進入
Forget.aspx 網頁:
即時加入會員 (4)

#52
#53
#54
#55
#56
#57
#58
vbCrLf
#59
#60
#61
#62
#63
#64
Forget.aspx #52~63
mail.Subject = "您的會員資料"
mail.To = Rd.Item("Email")
mail.From = "[email protected]" ' 改成系統維護者的 e-mail
mail.BodyFormat = MailFormat.Text
Body = "使用者名稱:" & Rd.Item("UserID") & vbCrLf
Body = Body & "
密碼:" & Rd.Item("Password") & vbCrLf
Body = Body & "
姓名:" & Rd.Item("Name") & vbCrLf &
Body = Body & "ASP.NET 網頁製作教本 敬上"
mail.Body = Body
On Error Resume Next
SmtpMail.SmtpServer = "msa.hinet.net"
SmtpMail.Send(mail)
15-2 計費網頁
fee00.aspx 網頁之架構 Part I
<%@ Import Namespace="System.Web.Security " %>
<script language="VB" runat=server>
Sub Page_Load(sender As Object, e As EventArgs)
Dim Page As String = Request.ServerVariables("PATH_INFO")
Dim UserID As String = User.Identity.Name
Msg.Text = "帳號: " & UserID & "<br>"
Msg.Text &= "網頁: " & Page
' 接著根據 Page 之計費點數,扣除 UserID 帳號的點數
End Sub
</script>
fee00.aspx 網頁之架構 Part II
<Html>
<Body>
<H2>這是個計費網頁...<HR></H2>
<asp:Label runat="server" id="Msg" ForeColor=Red/>
<p>
...接著根據此一「網頁」之計費點數,扣除此一「帳號」的點數<p>
<HR>
</Body>
</Html>
.htm 網頁的計費(1)

範例網頁的組成
Charge/
Charge/
輸出
Values.aspx 選取計費網頁
Charge.aspx
Tips??.htm
網頁目錄
計費程式
計費網頁
回計費首頁
計費統計
ValList.aspx
計費統計
寫入
讀取
讀取
Users.mdb
.htm 網頁的計費(2)

操作說明(1):瀏覽 Values.aspx 網頁
滑鼠移到此一連結, 暫時不要按下
狀態列顯示的網址是 Charge.aspx, 不是 Tips01.htm
.htm 網頁的計費 (3)

操作說明(2):按下 Tips01.htm 連結
Charge/Charge.aspx?Page=Tips01.htm
內容為 Charge 目錄的 $xo-Tips01.htm
.htm 網頁的計費 (4)

操作說明(3):回到 Values.aspx 網頁,然後依
序按下 Tips02.aspx、Tips04.aspx、
Tips08.aspx 連結,接著再按下 「計費統計」
鈕進入 ValList.aspx 網頁。
.htm 網頁的計費(5)

Pages 資料表的結構:
欄位 資料類型 其他屬性
網頁 文字
介紹 備忘
點數 整數
欄位大小=255
─
.htm 網頁的計費 (6)

Pages 資料表其內容如下:
網頁
介紹
點數
Tips01.htm 如何將 .flc 動畫檔放在某一個 hWnd 之中播放?
5
Tips02.htm 如何改變系統預設的日期格式?
4
Tips03.htm 如何利用程式拉下 ComboBox?
3
Tips04.htm 如何改變桌面的圖片?
5
Tips05.htm 在 ListBox 之中, 如何偵測滑鼠所在位置的選項?
4
Tips06.htm 如何啟動撥號網路中的連線?
3
Tips07.htm 如何取得特殊資料夾的所在目錄?
6
Tips08.htm 如何在 Windows 啟動時自動執行某一個程式?
5
Tips09.htm 如何在DOS程式結束執行時,自動將其關閉?
4
Tips10.htm 如何讓使用者自行輸入方程式, 並且計算其結果?
3
.htm 網頁的計費(7)

Charges 資料表的結構:
欄位
UserID
網頁
點數
時間
資料類型 其他屬性
文字
文字
整數
日期時間
欄位大小=50
欄位大小=255
─
預設值=Now()
.htm 網頁的計費(8)

Charges 資料表其內容如下:
UserID 網頁
點數 時間
kjwang Tips01.htm
5
2002/3/17 下午 01:32:53
kjwang Tips02.htm
4
2002/3/17 下午 01:32:55
kjwang Tips04.htm
5
2002/3/17 下午 01:32:57
kjwang Tips08.htm
5
2002/3/17 下午 01:32:59
htm 網頁的計費(8)

.htm檔案的命名:
一定要為 .htm檔案取別人無法猜到的檔
案名稱,例如本節的計費網頁 $xoTips01.htm~$xo-Tips10.htm,就是為
了讓別人無法猜出,所以特別在原檔案
名稱之前加上 $xo- 這個奇怪的名字 。
htm 網頁的計費(9)

進入Charge.aspx網頁時,我們可以根據
以下資訊得知帳號及上網者所瀏覽的網
頁:
User.Identity.Name ' 帳號
Request("Page")
' Page參數值, 也就是被瀏覽的網頁
htm 網頁的計費(10)

而判斷此一帳號是否瀏覽過此一網頁的
程式如下:
#15
' 判斷此一帳號是否曾經讀過此一網頁
#16
SQL = "Select * From Charges Where " & _
#17
"UserID='" & User.Identity.Name & "' And " & _
#18
"網頁='" & Request("Page") & "'"
#19
Cmd = New OleDbCommand( SQL, Conn )
#20
Rd = Cmd.ExecuteReader()
#21
#23
頁
If Not Rd.Read() Then ' 找不到, 表示此一帳號尚未瀏覽過此一網
htm 網頁的計費(11)

從資料庫中讀出此一帳號的剩餘點數及
此一網頁之點數,如下:
#26
#27
#28
#29
#30
#31
#32
#33
#34
#35
#36
#37
#38
' 讀出此一網頁之點數, 及此一帳號之剩餘點數
SQL = "Select * From Pages Where " & _
"網頁='" & Request("Page") & "'"
Cmd = New OleDbCommand( SQL, Conn )
Rd = Cmd.ExecuteReader()
If Rd.Read() Then 點數 = Rd.Item("點數")
Rd.Close()
SQL = "Select * From Users Where " & _
"UserID='" & User.Identity.Name & "'"
Cmd = New OleDbCommand( SQL, Conn )
Rd = Cmd.ExecuteReader()
If Rd.Read() Then 剩餘點數 = Rd.Item("點數")
Rd.Close()
htm 網頁的計費(12)

若「點數」大於0且「剩餘點數」小於0,
則表示此一帳號尚未瀏覽此一網頁且此
一帳號的剩餘點數已經變成負數了(超用
了),那麼顯示「對不起, 您的點數已經
用盡!」,否則下載網頁到瀏覽器,程式
如下:
#57
#58
#59
If 點數 > 0 And 剩餘點數 <= 0 Then
Response.Write( "<H2>對不起, 您的點數已經用盡!<HR><H2>" )
Else
#60
Response.WriteFile( Server.MapPath("$xo-" &
Request("Page")) )
#61
End If
htm 網頁的計費(13)

在扣點方面,所撰寫的程式如下:
#41
#42
#43
#44
#45
#46
#47
#48
#49
#50
#51
#52
' 將「UserID、網頁、點數」記錄於 Charges 資料表
SQL = "Insert Into Charges (UserID, 網頁, 點數) " & _
"Values ( '" & User.Identity.Name & "', '" & _
Request("Page") & "', " & 點數 & ")"
Cmd = New OleDbCommand( SQL, Conn )
Cmd.ExecuteNonQuery()
' 扣除 Users 資料表的點數
SQL = "Update Users Set 點數=點數-" & 點數 & _
" Where UserID='" & User.Identity.Name & "'"
Cmd = New OleDbCommand( SQL, Conn )
Cmd.ExecuteNonQuery()