著作權所有 © 旗標出版股份有限公司
Chapter 13
網站安全管理基礎
2
本章提要 13 - 1 ASP.NET 的安全管理機制 13 - 2 使用會員管理機制 13 - 3 登入控制項 13 - 4 會員維護相關控制項 13 - 5 使用者設定檔
3
網站安全管理基礎 不管是基於保護網站資訊、限制使用者可
存取的網頁;或僅只是要為網站提供一些個人化的功能 , 都必須為瀏覽網頁的使用者『驗明正身』 , 也就是透過安全管理的驗證機制 , 辨明瀏覽網頁者的身份。
本章就來介紹 ASP.NET 2.0 的安全驗證機制 , 及如何在網頁上實作驗證功能。
4
13 - 1 ASP.NET 的安全管理機制 ASP.NET 的安全管理可分為驗證與授權兩
個層次: 驗證 (Authentication) :簡單的說 , 驗證就
是查核使用者身份的動作 , 例如常見的 Web-Mail 應用 , 當我們要連上自己的網路信箱時 , 要輸入使用者名稱和密碼 , 通過驗證後才能讀信、寫信。
5
ASP.NET 的安全管理機制 授權 (Authorization) :授權則是指通過驗證
的使用者 , 對於網站中各項資源有何存取權限。
例如網路論壇的管理者 , 即被授權可以管理論壇的會員帳號、編輯和刪除所有文章等;而一般的註冊會員 , 則只能發表新文章 , 或是編輯自己發表的文章。
6
ASP.NET 的安全管理機制 ASP.NET 即是透過驗證和授權來做網頁的
安全管理 , 例如系統管理員可設定:使用者通過驗證後才能存取網頁、而權限不同的使用者 , 則可執行不同的功能或是瀏覽不同的網頁等等。
驗證和授權的基本設定都是放在 Web.Config 之中 , 以下就來介紹 Web.Config 中相關標籤的用法。
7
IIS 伺服器的安全管理 ASP.NET 動態網頁需放在 IIS 伺服器上
執行 , 當使用者要瀏覽一個 ASP.NET 網頁時 , 當然是先向伺服器提出要求。
因此不管這個 ASP.NET 網頁有沒有使用本章介紹的安全控管機制 , 在提出要求時 , 就會先進入如下的安全驗證程序 , 通過後 IIS 才會進一步執行 ASP.NET 網頁:
8
IIS 伺服器的安全管理 1. 提出要求的 IP 位址是在允許存取網站之
列。 2. 使用者需通過 Windows 安全驗證;不
過 IIS 預設允許匿名存取 , 且會以網站設定的帳號登入。
3. ASP.NET 網頁所在的網站或資料夾有開放可『執行』網頁的權限。
4. ASP.NET 網頁若是存於 NTFS 資料夾 , 則登入的身份需擁有該 .aspx 檔的存取權限。
9
IIS
伺服器的安全管理
10
IIS 伺服器的安全管理 通過上述安全檢查後 , 該 ASP.NET 網頁
才會被執行 , 並進一步傳回執行結果 , 或是再進入 ASP.NET 的安全檢查程序。
關於 IIS 安全設定的詳細資訊 , 可參見 IIS 線上說明;本書附錄則會介紹如何在 Windows XP 安裝 IIS 伺服器。
11
Web.Config 的驗證設定 ASP.NET 支援的驗證方式有下列 3 種:
Windows 驗證:使用 Windows 的網域或本機帳戶進行驗證。使用此法時 , 就是直接承襲 IIS 的 Windows 驗證結果 , 因此網頁不需再自行做驗證。
Forms 驗證:在網頁中詢問使用者名稱及密碼進行驗證。本書以下都將此種驗證稱為表單驗證。
12
Web.Config 的驗證設定 Passport 驗證:使用微軟的 .NET Passpor
t ( 現更名為 Windows Live!) 系統進行驗證 , 需另外安裝 Passport SDK 才能使用 , 因此本書將不介紹。
如上所列 , 使用 Windows 驗證時 , ASP.NET 並不需進行『驗證』的動作;而使用 Passport 驗證又需額外的開發套件才能使用 , 因此本章就將重點放在表單驗證。
13
Web.Config 的驗證設定 要使用表單驗證 , 可在 Web.config 的 <s
ystem.web> 標籤下使用 <authentication> 標籤設定:
14
Web.Config 的驗證設定 啟用表單驗證後 , 可在 <authentication>
標籤下加上 <forms> 標籤設定驗證相關參數 , 但在進一步說明這些設定前 , 我們先認識一下表單驗證的運作方式。
網站使用表單驗證時 , 當有瀏覽器提出瀏覽 ASP.NET 網頁的要求 , 即進入 ASP.NET 的安全管理程序:
15
Web.Config 的驗證設定 1. ASP.NET 的驗證模組會檢查瀏覽者是否持有驗證使用者身份的 Ticket, 若無則進入網站所設定的登入網頁 , 要求瀏覽者進行驗證。
2. 瀏覽者通過驗證後 , 系統會產生記錄登入資訊的 Ticket, 此 Ticket 可存於 Cookie 或以 URL 查詢字串的形式存在。
16
Web.Config 的驗證設定 3. 之後瀏覽者繼續瀏覽網站中的任何網頁時 ,
ASP.NET 即可由 Ticket 取得使用者身份 , 並檢查該身份是否有足夠授權存取網頁 , 有授權即允許存取網頁。
至於代表驗證通過的 Ticket 是用 Cookie 或其它方式儲存、 Cookie 的效期為何 , 這些都可在 <forms> 標籤中用下列屬性來設定:
17
Web.Config 的驗證設定 cookieless :設定 Ticket 的存放方式 , 可
為下列值: UseCookies :以 Cookie 存放驗證的 Ticke
t 。 UseUri :不使用 Cookie, Ticket 會以編碼過
的方式呈現在 URL 中。 AutoDetect :自動偵測 , 若瀏覽端支援 Coo
kie 時就會選用 Cookie 。 UseDeviceProfile :此為預設值 , 表示依 m
achine.config 中的設定 , 依裝置類型決定是否使用 Cookie 。
18
Web.Config 的驗證設定 name :指定 cookie 的名稱 , 預設值為 ".
ASPXAUTH" 。 path :指定 cookie 的路徑名稱 , 預設值為
"\", 也就是根目錄。 timeout :指定 cookie 的有效時間 ( 分鐘 ),
預設值為 30 。
19
Web.Config 的驗證設定 slidingExpiration :設定 cookie 有效時間 ,
是否要隨使用者重新上線而自動延長。預設值為 "False", 亦即不延長;若設為 "True", 則在 cookie 的有效時間快到期前 , 使用者又重新連上網站 , cookie 的有效時間會自動改為從這一次登入的時間開始計算。
20
Web.Config 的驗證設定 protection :指定 Ticket 是否加密及查驗
(validation), 可設為: All :要加密及查驗。 None :都不要。 Encryption :只做加密。 Validation :只做查驗。
21
Web.Config 的驗證設定 loginUrl :當瀏覽者尚未通過驗證時 , 會導
向至此屬性所指定的驗證網頁。預設值為 "login.aspx" 。
defaultUrl :當瀏覽者過驗證通過後 , 會導向至此屬性所指網頁。預設值為 "Default.aspx" 。
22
Web.Config 的驗證設定 例如以下的片段是設定驗證通過後 , 導向到 "memberOnly.aspx" 網頁 , 且驗證通過後 , cookie 會保留 1 天:
23
Web.Config 的授權設定 設好驗證方式後 , 若要再進一步控管使用者可
瀏覽哪些網頁 , 就需加入 <authorization> 標籤設定授權方式。
設定方式是在 <authorization>...<authorization> 內加入 <allow/> 及 <deny/> 標籤 , 指定要授權或拒絕使用者存取網站或做何種操作:
24
Web.Config 的授權設定 <allow/> 及 <deny/> 標籤可使用的屬性如
下: users :要設定授權的使用者名稱 , 若同時
設定多人 , 可用逗號分隔。另外也可用兩個符號: "?" 表示所有匿名 (Anonymous) 使用者; "*" 則表示所有的使用者。
25
Web.Config 的授權設定 roles :除了直接指名使用者 , 也可用此屬性指定授權對象的『角色』 , 角色 (role) 的用途類似於 Windows 中的群組帳戶 , 我們可將一組使用者設為相同的角色 , 再設定此角色的授權 , 如此一來就等於設定這一組使用者的授權。
關於如何建立角色 , 會在下一節設定。
26
Web.Config 的授權設定 verbs :設定對 HTTP 通訊協定動作的授權 ,
可設定的值包括 GET 、 HEAD 、 POST 、DEBUG, 若要同時列出多個值則要用逗號分隔;預設值為 "*", 表示全部項目。
以下片段就是拒絕所有匿名使用者存取任何網頁的授權設定:
27
表單驗證的基礎 在 ASP.NET 中 , 共有兩套實作表單驗證
的方式 , 其中之一為早期 ASP.NET 即提供 , 使用 FormAuthentication 類別進行驗證的方式;另一個則是 ASP.NET 2.0 新增的會員管理機制。
本節先介紹前者 , 13-2 節再介紹會員機制。
28
表單驗證的基礎 建構使用 FormAuthentication 類別驗證的
系統 , 除了前述修改 Web.Config 的設定外 , 還必須: 建立使用者帳號及密碼。 在網頁中用 FormAuthentication 類別的靜
態 (static) 方法進行驗證相關操作。
29
建立使用者帳號及密碼 使用表單驗證時 , 如果要用 FormAuthenti
cation 類別提供的方法進行驗證 , 則需將帳號及密碼記錄在 Web.config 之中。
若想將帳號 / 密碼存於資料庫或文字檔 , 則進行驗證時 , 就必須自行用程式讀出帳號 / 密碼 , 並與瀏覽者輸入的帳號 / 密碼進行比對。
30
建立使用者帳號及密碼 要將帳號及密碼存放在 Web.config 之中 ,
需在 <forms> 標籤內加入 <credentials> 標籤 , 然後在 <credentials> 標籤中可用 <user/> 標籤建立帳號及密碼 , 格式如下:
31
建立使用者帳號及密碼 <credentials> 的 passwordFormat 屬性 ,
是用來設定 <user/> 標籤中密碼字串的格式。若 passwordFormat 屬性設為 "Clear" 表示 password 屬性的字串就是密碼字串:
若覺得將密碼字串直接存於 Web.config 中安全性太低 , 則可改存編碼後的字串。
帳號
32
建立使用者帳號及密碼 此時可將 <credentials> 的 passwordFor
mat 屬性設為 “MD5” 或 “ SHA1”, 表示 Web.config 中記錄的是以 MD5 (Message Digest 5) 或 SHA1 (Secure Hash Algorithm) 雜湊演算法編碼過後的字串。
例如密碼 “ 123” 經過 MD5 編碼後的字串是 "202CB962AC59075B964B07152D234B70", 此時 <user/> 標籤內就需寫成:
33
建立使用者帳號及密碼
如何產生編碼過的密碼字串 , 請參見後面方框的說明 , 在本節的範例仍使用未編碼的密碼做示範。
所以我們就先在網站的 Web.config 中 , 找到 <authentication> 標籤 , 將它修改成如下的內容 , 並加上拒絕匿名使用者存取的設定:
34
建立使用者帳號及密碼
35
建立使用者帳號及密碼 以上我們設定了使用表單驗證 , 並將預設
登入網頁設為 Ch13-01.aspx (稍後建立 ), 同時建立一組帳號 / 密碼: ken / 123 。
另外我們也將網站設為拒絕匿名使用者存取 , 所以一定要登入才能存取網頁 , 以下就來看如何在網頁中驗證使用者。
36
產生編碼的密碼字串 要用程式產生編碼過後的密碼字中 , 可使用 F
ormsAuthentication 類別的靜態方法 HashPasswordForStoringInConfigFile(), 以密碼字串及演算法名稱 (“MD5” 或 “ SHA1”) 為參數呼叫此方法 , 即會傳回編碼過的字串內容 , 例如:
則最後 md5pass 的值就是 "123" 經過 MD5 演算法編碼後的字串。
37
在網頁中進行驗證 剛剛在 Web.Config 中設定了預設的登入
網頁為 Ch13-01.aspx, 因此我們就來設計這個登入網頁 , 網頁中使用兩個 TextBox 以供輸入帳號及密碼 , 再加上一個登入按鈕:
38
在網頁中進行驗證
39
在網頁中進行驗證 在登入按鈕的事件處理程序中 , 要做的就
是驗證瀏覽者所輸入的帳號及密碼是否與 Web.config 中設定的相同 , 此動作可用 FormsAuthentication 的 Authenticate() 方法進行 , 呼叫時的參數就是帳號及密碼 , 驗證通過則傳回 True 。
所以按鈕的處理程序可寫成:
40
在網頁中進行驗證
41
在網頁中進行驗證 第 9 行呼叫的 RedirectFromLoginPage()
會在驗證成功時 , 將登入者導向到指定的網頁:若使用者是從網站中其它網頁導向進來 , 此方法會讓使用者回到該網頁;否則就是自動連上 <forms> 標籤 defaultUrl 屬性所指的網頁 ( 預設為 Default.aspx) 。
RedirectFromLoginPage() 的第 1 個參數為帳號名稱 , 如此可讓轉向過去的網頁取得使用者資訊 , 第 2 個參數則是設定是否要將登入資訊存於 Cookie 中。
42
在網頁中進行驗證 如果要由程式指定轉向的網頁 , 可加上網頁
名稱 ( 相對路徑 ) 字串當成第 3 個參數。 第 11 行則會在 Authentication() 方法傳回
False 時顯示『登入失敗』的訊息。 為了測試導向功能 , 我們再設計一個 Ch1
3-02.aspx, 此網頁只有一段歡迎訊息及一個 Literal 控制項。
43
在網頁中進行驗證 我們讓網頁載入時 , 就會將登入的使用者
名稱顯示在 Literal 控制項中 , 使用者名稱的取得方式 , 是使用 Page 的 User 物件 , 並透過其 Identity.Name 屬性取得:
44
在網頁中進行驗證 將兩個檔案都存檔後 , 請先用瀏覽器開啟
Ch13-02.aspx, 此時因尚未通過驗證 , 因此會自動導到 Ch13-01.aspx 網頁:
45
在網頁中進行驗證
以上就是一個簡單的表單驗證範例 , 由建立的過程中可發現 , 此種設計方式並不適用於使用者較多的網站:
46
在網頁中進行驗證 要將帳號 / 密碼一一加到 Web.config 中非
常不便 , 如果要將密碼字串編碼 , 還需另行處理。
Web.config 的帳號並不支援群組帳號 / 角色這類功能 , 因此網站中如要對多人做不同的授權 , 設定工作也很鎖碎。
若要將帳號 / 密碼存於資料庫或其它位置 , 則需自行撰寫讀取及比對帳號 / 密碼的驗證程式。
47
在網頁中進行驗證 因此在 ASP.NET 2.0 增加了一套功能完整
的會員 (Membership) 與角色 (Role) 管理機制 , 並提供相對應的控制項 , 讓登入帳號的建立與管理、權限管理、網頁的設計都更加方便。
本章後續內容就以建立會員系統及相關控制項的使用為例來說明
48
13 - 2 使用會員管理機制 ASP.NET 2.0 的會員管理是建構於表單驗
證系統上的新功能 , 其特色包括: 所有使用者的登入資料 ( 會員資料 ) 都存於
SQL Server 2005 Express 資料庫中。 提供角色管理 , 將多位會員設為同一角色 ,
再透過角色設定存取權限 , 就不需一一設定個別會員的授權。
提供管理介面管理會員與角色。 提供登入及基本會員新增、維護功能的控
制項 , 方便網頁開發。
49
使用會員管理機制 會員與角色資料庫是以資料庫檔案的形式 ,
存於網站的 App_Data 資料夾下。換言之 , 網頁執行時 , 會以使用者執行個體的方式執行 SQL Server 2005 Express, 並附加此會員資料庫以便存取。
如果想使用其它的資料來源 , 必須另行設定及撰寫程式 , 詳細資訊請參見 MSDN 網站上的說明。
50
建立會員及會員資料庫 雖然資料是存於 SQL Server 2005 Expres
s 資料庫 , 但我們不必自行建立、管理資料庫 , 所有的會員管理動作 , 都可透過 ASP.NET 應用程式管理員進行。
只要逕行建立第一個會員 , ASP.NET 應用程式管理員就會替我們建立必要的資料庫及資料表。請在 VWD 中執行『網站 / ASP.NET 組態』命令 , 並依如下步驟建立第 1 個會員:
51
建立會員及會員資料庫
52
建立會員及會員資料庫
53
建立會員及會員資料庫
54
建立會員及會員資料庫
55
建立會員及會員資料庫
56
建立會員及會員資料庫 建好會員之後 , 由 VWD 的方案總管窗格檢視 App_Data 資料夾 , 即可看到已建好一個 ASPNETDB.MDF 資料庫。
如果您想瞭解資料庫中有哪些資料表 , 可在資料庫總管窗格中檢視 , 但請不要自行更動資料庫內容 , 以免造成會員系統損毀。
57
建立會員及會員資料庫
為方便後續測試 , 我們再建立一位會員 , 請再進入建立會員的網頁:
58
建立會員及會員資料庫
59
帳號及密碼相關設定 在建立帳號及密碼的過程中 , 讀者或許覺得密碼強制至少 7 個字元、至少含 1 特殊符號、一定要輸入問題等限制 , 對使用者並不友善。
如果想放寬限制 , 可到 machine.config 中設定。
在 machine.config 中的 <membership> 標籤下 , 即有會員資料提供者的相關參數 , 其中也包括帳號、密碼限制的設定:
60
帳號及密碼相關設定
61
帳號及密碼相關設定 以下說明其中幾個重要的屬性:
EnablePasswordReset :是否允許使用者重設密碼 , 在 13-4 節會介紹重設密碼的方式。
EnablePasswordRetrieval :是否允許使用 MembershipProvider 類別的 GetPassword() 方法 , 由資料庫中取得使用者密碼;但如果以下的 PasswordFormat 屬性為 "Hashed", 則密碼是無法被取得的 ( 因雜湊演算法是單向演算法 , 無法由雜湊值推算回原本的密碼為何 ) 。
62
帳號及密碼相關設定 MinRequiredNonAlphanumericCharacters :
指定密碼中至少要含幾個文數字以外的特殊符號字元 , 若要讓會員不必費心想出奇怪的密碼 , 可將此屬性值設為 0 。
MinRequiredPasswordLength :設定密碼最短長度 , 若要容許較短的密碼 , 就將此屬性設為較小的數值。
63
帳號及密碼相關設定 PasswordFormat :指定密碼儲存在資料表
中的格式 , 可使用的值包括 "Clear" ( 明碼 ) 、 "Encrypted" ( 加密 ) 、 "Hashed" ( 以雜湊演算法編碼 ) 三種。
RequiresQuestionAndAnswer :是否一定要用問 / 答的資料 , 才能重新取得密碼。
RequiresUniqueEmail :是否強制會員都要用不同的電子郵件地址註冊 , 例如設為 "true" 即表示同一個電子郵件不能重複註冊。
64
建立與設定角色 在一般的網路作業系統中 , 為方便管理 ,
都會用『群組』來管理使用者的存取權限。 例如設定 Administrators 群組可執行任何
程式 , 則所有屬於此群組的使用者 , 都具有執行任何程式的權限。
而為了方便管理會員的授權 , 我們也可透過角色來設定網站的權限 , 讓屬於同一角色的會員 , 都能具有相同的授權。
65
建立與設定角色 初次建立會員與會員資料庫時 , 預設不會
啟用角色功能 , 因此我們要先啟用才能建立角色 , 請在 ASP.NET 應用程式管理員的安全性頁面做如下設定:
66
建立與設定角色
67
建立與設定角色
68
建立與設定角色
69
建立與設定角色
70
建立與設定角色 要將既有的會員加入角色中 , 可依如下方式進
行:
71
建立與設定角色
72
建立與設定角色
73
建立與設定角色 此外 , 在啟 用角色功能 後 , 建立使 用者時 , 即 可勾選要讓 新使用者隸 屬的角色:
74
設定權限 建好會員及角色後 , 就可開始設定網站的
存取權限。 為方便測試 , 我們先在網站中加入一個子
資料夾:
75
設定權限 我們要讓這個子資料夾只供屬於 Admin 角色的會員進入 , 所以必需設定禁止一般會員存取 , 但 Admin 可存取。
請再執行『網站 / ASP.NET 組態』命令 , 進入安全性頁面進行如下設定:
76
設定權限
77
設定權限
78
設定權限
79
設定權限
80
設定權限
81
設定權限
82
設定權限
83
設定權限 但網頁上方的說明文字提到:當有多個規
則時 , 位於較上方的規則設定 , 將會蓋住較下方的規則。
而在我們的例子中 , 雖然設定了允許 Admin 角色存取 Admin 資料夾 , 但此規則因位於第 2 個位置 , 會被『拒絕所有會員存取』的規則蓋過去 , 所以要將這 2 個規則的位置對調一下:
84
設定權限
85
設定權限
86
設定權限
87
設定權限 建好會員帳號及相關授權設定後 , 我們就
可設計網頁來測試會員與角色的功能。 不過我們並不需像前面表單驗證一樣 , 自
行設計登入的畫面與驗證程式 , 這些都已有現成的控制項可使用 , 以下就來介紹搭配會員機制使用的登入控制項。
88
13 - 3 登入控制項 為簡化設計會員登入功能 , ASP.NET 2.0 特別提供了一組與會員登入相關的控制項 , 這些控制項本身即會存取會員資料庫的資訊 , 也提供驗證、維護等相關功能 , 讓我們能在不必撰寫程式碼的情況下 , 即可實做出功能完整的登入網頁。
89
Login 、 LoginName 、 LoginStatus 控制項 首先來介紹 Login 和 LoginName 這兩個
控制項 , 前者的用途就是提供類似範例 Ch13-01.aspx 的輸入帳號 / 密碼及登入按鈕的登入功能;後者則是單純顯示登入使用者的名稱。
以下就來設計兩個網頁示範其功能 , 請先建立新網頁 Ch13-03.aspx, 並在設計模式下 , 將 Login 控制項拉曳到網頁中:
90
Login 、 LoginName 、 LoginStatus 控制項
91
Login 、 LoginName 、 LoginStatus 控制項
92
Login 、 LoginName 、 LoginStatus 控制項 如此就算完成一個可以運作的登入網頁了。 但我們還可做一些額外的設定 , 例如 Desti
nationPageUrl 屬性可設定在登入成功後 , 自動導向到指定的網頁:
93
Login 、 LoginName 、 LoginStatus 控制項
94
Login 、 LoginName 、 LoginStatus 控制項 上圖的設定是讓使用者登入成功後 , 自動導向到 Ch13-04.aspx, 所以我們現在要用 LoginName 和 LoginStatus 控制項建立這個登入後的歡迎網頁:
95
Login 、 LoginName 、 LoginStatus 控制項
96
Login 、 LoginName 、 LoginStatus 控制項 LoginName 控制項的功能很簡單 , 就是顯示目前登入的帳號名稱 , 不過我們可在 FormatString 屬性中加入其它要顯示的文字 ( 例如歡迎訊息 ) :
97
Login 、 LoginName 、 LoginStatus 控制項
98
Login 、 LoginName 、 LoginStatus 控制項 LoginStatus 則會依使用者是否登入 , 顯示
不同的內容:預設在有使用者登入時 , 顯示登出的超連結;使用者未登入時則顯示登入的超連結。
最後我們在 Admin 資料夾中再放入一個類似的網頁 Ch13-05.aspx, 以便測試前一節對 Admin 資料夾做的授權設定:
99
Login 、 LoginName 、 LoginStatus 控制項
100
Login 、 LoginName 、 LoginStatus 控制項 為測試此處及後續的範例 , 我們將 Web.confi
g 中 <forms> 標籤所設的登入網頁改成指向 Ch13-03.aspx, 同時也將拒絕匿名使用者連線的授權設定標示為註解 ( 或直接刪除之 ) :
101
Login 、 LoginName 、 LoginStatus 控制項 存檔後 , 用瀏覽器開啟 Ch13-03.aspx 即
會看到如下的登入畫面:
102
Login 、 LoginName 、 LoginStatus 控制項
103
Login 、 LoginName 、 LoginStatus 控制項
104
Login 、 LoginName 、 LoginStatus 控制項
105
Login 、 LoginName 、 LoginStatus 控制項 如上的範例 , 我們只需在會員資料庫設好
各會員所屬的角色、各角色的權限 , ASP.NET 就會自行替我們做相關的安全控管 , 不需我們自行撰寫相關檢查程式。
如果想自行用程式檢查使用者角色 , 可呼叫 Roles 類別的下列 2 個方法:
106
使用 LoginView 控制項 在上一個例子中 , 由於我們已將 Web.confi
g 中拒絕匿名使用者的授權設定去掉 , 所以匿名使用者可直接連上網站時 , 若他們連上 Ch13-04.aspx 時 , 則會看到如下的畫面:
107
使用 LoginView 控制項 由於使用者未登入 , 所以 LoginName 控
制項無法取得登入帳號名稱 , 因此未顯示任何內容。
我們雖可修改網頁 , 用程式判斷使用者是否已登入 , 再顯示合適的訊息及內容 , 但其實有個更方便的作法 , 就是改用 LoginView 控制項。
108
使用 LoginView 控制項 LoginView 也是以 Template 構成的控制
項 , 同樣分為未登入及已登入的 Template, 我們只要分別設計好兩個 Template 的內容 , 網頁被瀏覽時 , 控制項就會自動判斷使用者是否已登入 , 並據以顯示合適的 Template 。
以下就先建立一個空白網頁 (Ch13-06.aspx), 並將 LoginView 控制項加到網頁中:
109
使用 LoginView 控制項
110
使用 LoginView 控制項
111
使用 LoginView 控制項
112
使用 LoginView 控制項
113
使用 LoginView 控制項 網站已上線的會員人數資訊 , 可透過 Mem
bership 類別的 GetNumberOfUsersOnline() 方法取得 , 因此可在 Page_Load 事件中做如下處理即可在網頁中顯示已上線的會員人數:
114
使用 LoginView 控制項 存檔後瀏覽網頁即可看到如下效果:
115
使用 LoginView 控制項
116
使用 LoginView 控制項
117
使用 LoginView 控制項 在上圖可看到 , 雖然我們已經登出 , 但仍
被 ASP.NET 視為在線上 , 這是因為對伺服器端動態網頁程式而言 , 當網頁已傳送給瀏覽器 , 連線就結束了 , 在伺服器端根本無從判斷對方是否仍在線上 ( 使用者可能仍在閱讀網頁 , 也可能已關閉瀏覽器視窗 ) 。
因此 GetNumberOfUsersOnline() 方法其實只是根據會員資料庫中所記錄的最近一次登入時間 , 是否超過 15 分鐘 , 來計算上線會員數:
118
使用 LoginView 控制項 若會員上次登入時間距今未超過 15 分鐘 ,
則視為仍在線上。 若會員上次登入時間距今已超過 15 分鐘 ,
則視為仍在線上。 如果覺得 15 分鐘的時間太長 , 對上線人
數有灌水之嫌 , 則可在 Web.config 中加入 <membership> 標籤 , 以 userIsOnlineTimeWindow 屬性來設定較短的時間 ( 單位為分鐘 ) :
119
使用 LoginView 控制項
與登入狀態相關的控制項就介紹到此 , 下一節繼續介紹搭配會員機制的維護用控制項。
120
13 - 4 會員維護相關控制項 如果要讓管理員自行在 ASP.NET 應用程
式管理員中建立所有會員帳號不僅不方便 , 也使網站運作相當沒有彈性。
因此 ASP.NET 2.0 特別提供 3 個繼承自 Wizard 控制項而產生的維護用途控制項:
121
會員維護相關控制項 CreateUserWizard 控制項:可供線上註冊。
ChangePassword 控制項:可供使用者修改密碼。
PasswordRecovery 控制項:可在使用者忘記密碼時 , 供使用者取得或重設密碼。
122
CreateUserWizard CreateUserWizard 如其名稱 , 是建立會員
帳號的控制項 , 而最常見的用途即是放在網站提供線上即時註冊的功能 , 如此就不需由管理員預先建立帳號 , 任一位造訪網站的人 , 都能選擇立即註冊建立新帳號。
此控制項也是拉曳到網頁中即可使用:
123
CreateUserWizard
124
CreateUserWizard 其實前面使用 ASP.NET 應用程式管理員建立會員帳號時的畫面 , 就是使用 CreateUserWizard 控制項建立的。
但此控制項原本有兩個步驟: 第 1 個就是上圖看到的會員資料輸入畫面內容
下一步則是註冊成功的訊息:
125
CreateUserWizard
126
CreateUserWizard 在屬性窗格中除了可修改、自訂控制項中
各部份的文字外 , 也可透過以下幾個屬性改變其行為: AutoGeneratePassword :若設為 "true",
則控制項中不會出現密碼欄位 , 密碼是由控制項自動產生。
ContinueDestinationPageUrl :設定在註冊成功的畫面中 , 繼續鈕所代表的網頁連結 ( 例如網站首頁 ), 在本範例中 , 我們將之設為 "~/Ch13-06.aspx" 。
127
CreateUserWizard LoginCreatedUser :是否在建立成功後 ,
就自動以新帳號驗證、登入 , 預設為 "true" 。 RequireEmail :設定是否顯示電子郵件欄位。
由於 CreateUserWizard 控制項類別是繼承 Wizard 控制項所產生的 , 因此具備和 Wizard 控制項相同的特性。
128
CreateUserWizard 此外當您在設計頁面中設計完成時 , 要記得將頁面選回第 1 步驟 , ActiveStepIndex 屬性才會自動回復為 0, 否則將會使得瀏覽網頁時 , 一開始即進入後面的步驟。
設定完成並存檔後 , 瀏覽網頁時即可在線上註冊新帳號:
129
CreateUserWizard
130
CreateUserWizard
131
CreateUserWizard CreateUserWizard 控制項和 Wizard 控制
項一樣可以隨意加入新的步驟 , 設定方式與 Wizard 控制項類似 , 請參見第 5 章。
132
ChangePassword 控制項 有些使用者在註冊後會想要改變密碼 , 此
時可利用 ChangePassword 控制項在網頁上提供相關功能 , 此控制項也是拉曳到網頁中即可使用:
133
ChangePassword 控制項
134
ChangePassword 控制項 ChangePassword 控制項的使用技巧、注意事項和 CreateUserWizard 控制項差不多。
此外還可透過下列 2 個屬性 , 設定使用者操作時的行為: CancelDestinationPageUrl :設定使用者按
取消鈕時要進入哪一個網頁。 ContinuedDestinationPageUrl :設定變更成功按繼續鈕要導向到哪一個網頁。
135
ChangePassword 控制項 本範例仍是將這兩個屬性都設為 "~/Ch13-
06.aspx" 。 在預設情況下 , 使用者必須登入後才能變
更密碼 , 不過 ChangePassword 控制項還提供一種變通的方式:只要將 DisplayUserName 屬性設為 "true", 則控制項中會多出一個使用者名稱欄位 , 可供未登入的使用者輸入其帳號名稱:
136
ChangePassword 控制項
137
ChangePassword 控制項 如果使用者已登入 , 則使用者名稱欄會自
動填入目前登入的名稱。 存檔後瀏覽網頁就可測試其效果:
138
ChangePassword 控制項
139
PasswordRecovery 控制項 幾乎每個人都有忘記密碼的經驗 , 如果網
站會員忘記密碼 , 則可用 PasswordRecovery 控制項來重設密碼。
網站使用 PasswordRecovery 控制項重設密碼的流程如下: 1. 使用者連上網站要重設密碼。 2. 進入使用 PasswordRecovery 控制項的
網頁 , 輸入使用者名稱。
140
PasswordRecovery 控制項 3. PasswordRecovery 控制項會自動產生一
組新密碼 , 並將新密碼寄到使用者註冊時所輸入的郵件信箱。
由於 PasswordRecovery 控制項是以電子郵件將新密碼寄給使用者 , 所以我們必須先用 ASP.NET 應用程式管理員在 Web.config 做好 SMTP 的設定 ( 設定方式請參見第 10 章 ), PasswordRecovery 控制項才能正常運作。
141
PasswordRecovery 控制項 當您已設妥網站的 SMTP 設定 , 即可在網
頁中使用 PasswordRecovery 控制項 , 並測試其效果:
142
PasswordRecovery 控制項
143
PasswordRecovery 控制項 前面介紹的 2 個控制項預設的步驟都只有
2 個 , 但 PasswordRecovery 控制項則有 3 個 , 分別是:詢問使用者名稱、詢問問題答案、最後的成功訊息 , 您可依需要自訂這些步驟的 Template 或加入新的步驟。
144
PasswordRecovery 控制項 儲存檔案後 , 即可在瀏覽器中測試其效果:
145
PasswordRecovery 控制項
146
PasswordRecovery 控制項 稍候在會員當初註冊時所輸入的郵件信箱
就會收到如下的郵件內容:
147
PasswordRecovery 控制項 附帶說明 , 當您的網站已建立重設密碼的
網頁 , 即可在 Login 控制項中用下列 2 個屬性 , 讓 Login 控制項中出現重設密碼網頁的連結: PasswordRecoveryText :代表『重設密碼
網頁』的連結文字。 PasswordRecoveryUrl :『重設密碼網頁』
的網址 , 例如 "~/Ch13-09.aspx" 。
148
13 - 5 使用者設定檔 許多會員網站都會提供記錄會員設定的功
能 , 像是會員目前所選的佈景主題、是否在會員網頁顯示網站新聞 ... 等等。
這類設定並不適合以 Cookie 存在用戶端 , 因為使用者換一台電腦登入網站 , 網站就讀不到前次設定 , 只能依預設值顯示網頁 , 失去會員設定的效果。
149
使用者設定檔 因此這類資訊必須存放在伺服器端 , 而 AS
P.NET 2.0 更進一步提供使用設定檔 (Profile) 功能 , 讓我們能很方便地在伺服器端儲存會員設定。
150
建立 Profile 項目 ASP.NET 2.0 的設定檔 (Profile) 功能是整合於會員管理機制 , 在建立會員資料庫時 , 也會自動建立用來存放設定資訊的 Profile 資料表。
雖然資料表已建好 , 但我們仍需先在 Web.config 中定義打算要存放的設定檔屬性 , 之後才能用程式儲存、讀取會員的個人設定。
151
建立 Profile 項目 要定義設定值屬性 , 需在 <profile> 標籤下
的 <properties> 標籤下 , 用 <add> 標籤來定義 , 其格式為:
152
建立 Profile 項目 例如我們想用設定檔記錄會員喜好的顏色
及年齡 , 則可用如下的 <add> 標籤設定之:
153
以程式存取 Profile 設定值 只要使用者已登入 , 在網頁程式中即可用
『 Profile. 設定檔屬性名稱』的形式 , 存取目前登入者的設定:
為測試上述設定的效果 , 我們撰寫一個簡單的範例網頁。
154
以程式存取 Profile 設定值 此網頁是由表格分為左右兩邊 , 左邊含一
LoginView 控制項;右邊則是可供會員輸入年齡的 TextBox 控制項、選擇喜好顏色的 RadioButtonList 控制項、以及儲存設定的 Button 控制項:
155
以程式存取 Profile 設定值
156
以程式存取 Profile 設定值 當網頁載入時 , 程式要判斷目前使用者是
否已通過驗證 (已登入 ), 是就立即從資料庫取得其設定資料 , 並反應在網頁中 ( 若使用者尚無設定值 , 則會出現預設值 ) 。
至於儲存設定按鈕的 Click 事件處理程序 , 則只是將新的設定值寫入 Profile 之中:
157
以程式存取 Profile 設定值
158
以程式存取 Profile 設定值
159
以程式存取 Profile 設定值 第 11 、 29 行 , 是透過控制項的 Style.Ite
m 屬性 , 設定 "background-color" (背景顏色 ) 的屬性 , 本例中 , 就是用 Profile.FavoriteColor 的值來設定背景顏色。
第 14 行開始的 Else 區塊 , 則會在使用者尚未登入的情況下 , 將各控制項的 Enabled 屬性設為 False, 也就是讓控制項都不能被操作。
如果將此網頁設定成只有驗證通過的使用者才能存取 , 就不需做這類檢查及設定。
160
以程式存取 Profile 設定值 存檔後瀏覽網頁即可看到如下的效果:
161
以程式存取 Profile 設定值
162
以程式存取 Profile 設定值
163
以程式存取 Profile 設定值
164
以程式存取 Profile 設定值