chapter 13 n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
Chapter 13 PowerPoint Presentation
Download Presentation
Chapter 13

Loading in 2 Seconds...

play fullscreen
1 / 164

Chapter 13 - PowerPoint PPT Presentation


  • 105 Views
  • Uploaded on

Chapter 13. 網站安全管理基礎. 本章提要. 13 - 1 ASP.NET 的安全管理機制 13 - 2 使用會員管理機制 13 - 3 登入控制項 13 - 4 會員維護相關控制項 13 - 5 使用者設定檔. 網站安全管理基礎. 不管是基於保護網站資訊、限制使用者可存取的網頁;或僅只是要為網站提供一些個人化的功能 , 都必須為瀏覽網頁的使用者 『 驗明正身 』, 也就是透過安全管理的驗證機制 , 辨明瀏覽網頁者的身份。 本章就來介紹 ASP.NET 2.0 的安全驗證機制 , 及如何在網頁上實作驗證功能。.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Chapter 13' - satin


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
chapter 13

Chapter 13

網站安全管理基礎

slide2
本章提要
  • 13 - 1 ASP.NET 的安全管理機制
  • 13 - 2 使用會員管理機制
  • 13 - 3 登入控制項
  • 13 - 4 會員維護相關控制項
  • 13 - 5 使用者設定檔
slide3
網站安全管理基礎
  • 不管是基於保護網站資訊、限制使用者可存取的網頁;或僅只是要為網站提供一些個人化的功能, 都必須為瀏覽網頁的使用者『驗明正身』, 也就是透過安全管理的驗證機制, 辨明瀏覽網頁者的身份。
  • 本章就來介紹 ASP.NET 2.0 的安全驗證機制, 及如何在網頁上實作驗證功能。
13 1 asp net
13 - 1 ASP.NET 的安全管理機制
  • ASP.NET 的安全管理可分為驗證與授權兩個層次:
    • 驗證 (Authentication):簡單的說, 驗證就是查核使用者身份的動作, 例如常見的 Web-Mail 應用, 當我們要連上自己的網路信箱時, 要輸入使用者名稱和密碼, 通過驗證後才能讀信、寫信。
asp net
ASP.NET 的安全管理機制
  • 授權 (Authorization):授權則是指通過驗證的使用者, 對於網站中各項資源有何存取權限。

例如網路論壇的管理者, 即被授權可以管理論壇的會員帳號、編輯和刪除所有文章等;而一般的註冊會員, 則只能發表新文章, 或是編輯自己發表的文章。

asp net1
ASP.NET 的安全管理機制
  • ASP.NET 即是透過驗證和授權來做網頁的安全管理, 例如系統管理員可設定:使用者通過驗證後才能存取網頁、而權限不同的使用者, 則可執行不同的功能或是瀏覽不同的網頁等等。
  • 驗證和授權的基本設定都是放在 Web.Config 之中, 以下就來介紹 Web.Config 中相關標籤的用法。
slide7
IIS 伺服器的安全管理
  • ASP.NET 動態網頁需放在 IIS 伺服器上執行, 當使用者要瀏覽一個 ASP.NET 網頁時, 當然是先向伺服器提出要求。
  • 因此不管這個 ASP.NET 網頁有沒有使用本章介紹的安全控管機制, 在提出要求時, 就會先進入如下的安全驗證程序, 通過後 IIS 才會進一步執行 ASP.NET 網頁:
slide8
IIS 伺服器的安全管理
  • 1. 提出要求的 IP 位址是在允許存取網站之列。
  • 2. 使用者需通過 Windows 安全驗證;不過 IIS 預設允許匿名存取, 且會以網站設定的帳號登入。
  • 3. ASP.NET 網頁所在的網站或資料夾有開放可『執行』網頁的權限。
  • 4. ASP.NET 網頁若是存於 NTFS 資料夾, 則登入的身份需擁有該 .aspx 檔的存取權限。
slide10
IIS 伺服器的安全管理
  • 通過上述安全檢查後, 該 ASP.NET 網頁才會被執行, 並進一步傳回執行結果, 或是再進入 ASP.NET 的安全檢查程序。
  • 關於 IIS 安全設定的詳細資訊, 可參見 IIS 線上說明;本書附錄則會介紹如何在 Windows XP 安裝 IIS 伺服器。
web config
Web.Config 的驗證設定
  • ASP.NET 支援的驗證方式有下列 3 種:
    • Windows 驗證:使用 Windows 的網域或本機帳戶進行驗證。使用此法時, 就是直接承襲 IIS 的 Windows 驗證結果, 因此網頁不需再自行做驗證。
    • Forms 驗證:在網頁中詢問使用者名稱及密碼進行驗證。本書以下都將此種驗證稱為表單驗證。
web config1
Web.Config 的驗證設定
    • Passport 驗證:使用微軟的 .NET Passport (現更名為 Windows Live!) 系統進行驗證, 需另外安裝 Passport SDK 才能使用, 因此本書將不介紹。
  • 如上所列, 使用 Windows 驗證時, ASP.NET 並不需進行『驗證』的動作;而使用 Passport 驗證又需額外的開發套件才能使用, 因此本章就將重點放在表單驗證。
web config2
Web.Config 的驗證設定
  • 要使用表單驗證, 可在 Web.config 的 <system.web> 標籤下使用 <authentication> 標籤設定:
web config3
Web.Config 的驗證設定
  • 啟用表單驗證後, 可在 <authentication> 標籤下加上 <forms> 標籤設定驗證相關參數, 但在進一步說明這些設定前, 我們先認識一下表單驗證的運作方式。
  • 網站使用表單驗證時, 當有瀏覽器提出瀏覽 ASP.NET 網頁的要求, 即進入 ASP.NET 的安全管理程序:
web config4
Web.Config 的驗證設定
  • 1. ASP.NET 的驗證模組會檢查瀏覽者是否持有驗證使用者身份的 Ticket, 若無則進入網站所設定的登入網頁, 要求瀏覽者進行驗證。
  • 2. 瀏覽者通過驗證後, 系統會產生記錄登入資訊的 Ticket, 此 Ticket 可存於 Cookie 或以 URL 查詢字串的形式存在。
web config5
Web.Config 的驗證設定
    • 3. 之後瀏覽者繼續瀏覽網站中的任何網頁時, ASP.NET 即可由 Ticket 取得使用者身份, 並檢查該身份是否有足夠授權存取網頁, 有授權即允許存取網頁。
  • 至於代表驗證通過的 Ticket 是用 Cookie 或其它方式儲存、Cookie 的效期為何, 這些都可在 <forms> 標籤中用下列屬性來設定:
web config6
Web.Config 的驗證設定
  • cookieless:設定 Ticket 的存放方式, 可為下列值:
    • UseCookies:以 Cookie 存放驗證的 Ticket。
    • UseUri:不使用 Cookie, Ticket 會以編碼過的方式呈現在 URL 中。
    • AutoDetect:自動偵測, 若瀏覽端支援 Cookie 時就會選用 Cookie。
    • UseDeviceProfile:此為預設值, 表示依 machine.config 中的設定, 依裝置類型決定是否使用 Cookie。
web config7
Web.Config 的驗證設定
  • name:指定 cookie 的名稱, 預設值為 ".ASPXAUTH"。
  • path:指定 cookie 的路徑名稱, 預設值為 "\", 也就是根目錄。
  • timeout:指定 cookie 的有效時間 (分鐘), 預設值為 30。
web config8
Web.Config 的驗證設定
  • slidingExpiration:設定 cookie 有效時間,是否要隨使用者重新上線而自動延長。預設值為 "False", 亦即不延長;若設為 "True", 則在 cookie 的有效時間快到期前, 使用者又重新連上網站, cookie 的有效時間會自動改為從這一次登入的時間開始計算。
web config9
Web.Config 的驗證設定
  • protection:指定 Ticket 是否加密及查驗 (validation), 可設為:
    • All:要加密及查驗。
    • None:都不要。
    • Encryption:只做加密。
    • Validation:只做查驗。
web config10
Web.Config 的驗證設定
  • loginUrl:當瀏覽者尚未通過驗證時, 會導向至此屬性所指定的驗證網頁。預設值為 "login.aspx"。
  • defaultUrl:當瀏覽者過驗證通過後, 會導向至此屬性所指網頁。預設值為 "Default.aspx"。
web config11
Web.Config 的驗證設定
  • 例如以下的片段是設定驗證通過後, 導向到 "memberOnly.aspx" 網頁, 且驗證通過後, cookie 會保留 1 天:
web config12
Web.Config 的授權設定
  • 設好驗證方式後, 若要再進一步控管使用者可瀏覽哪些網頁, 就需加入 <authorization> 標籤設定授權方式。
  • 設定方式是在 <authorization>...<authorization> 內加入 <allow/> 及 <deny/> 標籤, 指定要授權或拒絕使用者存取網站或做何種操作:
web config13
Web.Config 的授權設定
  • <allow/> 及 <deny/> 標籤可使用的屬性如下:
    • users:要設定授權的使用者名稱, 若同時設定多人, 可用逗號分隔。另外也可用兩個符號:"?" 表示所有匿名 (Anonymous) 使用者;"*" 則表示所有的使用者。
web config14
Web.Config 的授權設定
  • roles:除了直接指名使用者, 也可用此屬性指定授權對象的『角色』, 角色 (role) 的用途類似於 Windows 中的群組帳戶, 我們可將一組使用者設為相同的角色, 再設定此角色的授權, 如此一來就等於設定這一組使用者的授權。

關於如何建立角色, 會在下一節設定。

web config15
Web.Config 的授權設定
    • verbs:設定對 HTTP 通訊協定動作的授權, 可設定的值包括 GET、HEAD、POST、DEBUG, 若要同時列出多個值則要用逗號分隔;預設值為 "*", 表示全部項目。
  • 以下片段就是拒絕所有匿名使用者存取任何網頁的授權設定:
slide27
表單驗證的基礎
  • 在 ASP.NET 中, 共有兩套實作表單驗證的方式, 其中之一為早期 ASP.NET 即提供, 使用 FormAuthentication 類別進行驗證的方式;另一個則是 ASP.NET 2.0 新增的會員管理機制。
  • 本節先介紹前者, 13-2 節再介紹會員機制。
slide28
表單驗證的基礎
  • 建構使用 FormAuthentication 類別驗證的系統, 除了前述修改 Web.Config 的設定外, 還必須:
    • 建立使用者帳號及密碼。
    • 在網頁中用 FormAuthentication 類別的靜態 (static) 方法進行驗證相關操作。
slide29
建立使用者帳號及密碼
  • 使用表單驗證時, 如果要用 FormAuthentication 類別提供的方法進行驗證, 則需將帳號及密碼記錄在 Web.config 之中。
  • 若想將帳號 / 密碼存於資料庫或文字檔, 則進行驗證時, 就必須自行用程式讀出帳號 / 密碼, 並與瀏覽者輸入的帳號 / 密碼進行比對。
slide30
建立使用者帳號及密碼
  • 要將帳號及密碼存放在 Web.config 之中, 需在 <forms> 標籤內加入 <credentials> 標籤, 然後在 <credentials> 標籤中可用 <user/> 標籤建立帳號及密碼, 格式如下:
slide31

帳號

建立使用者帳號及密碼
  • <credentials> 的 passwordFormat 屬性, 是用來設定 <user/> 標籤中密碼字串的格式。若 passwordFormat 屬性設為 "Clear" 表示 password 屬性的字串就是密碼字串:
  • 若覺得將密碼字串直接存於 Web.config 中安全性太低, 則可改存編碼後的字串。
slide32
建立使用者帳號及密碼
  • 此時可將 <credentials> 的 passwordFormat 屬性設為 “MD5” 或 “SHA1”, 表示 Web.config 中記錄的是以 MD5 (Message Digest 5) 或 SHA1 (Secure Hash Algorithm) 雜湊演算法編碼過後的字串。
  • 例如密碼 “123” 經過 MD5 編碼後的字串是 "202CB962AC59075B964B07152D234B70", 此時 <user/> 標籤內就需寫成:
slide33
建立使用者帳號及密碼
  • 如何產生編碼過的密碼字串, 請參見後面方框的說明, 在本節的範例仍使用未編碼的密碼做示範。
  • 所以我們就先在網站的 Web.config 中, 找到 <authentication> 標籤, 將它修改成如下的內容, 並加上拒絕匿名使用者存取的設定:
slide35
建立使用者帳號及密碼
  • 以上我們設定了使用表單驗證, 並將預設登入網頁設為 Ch13-01.aspx (稍後建立), 同時建立一組帳號 / 密碼:ken / 123。
  • 另外我們也將網站設為拒絕匿名使用者存取, 所以一定要登入才能存取網頁, 以下就來看如何在網頁中驗證使用者。
slide36
產生編碼的密碼字串
  • 要用程式產生編碼過後的密碼字中, 可使用 FormsAuthentication 類別的靜態方法 HashPasswordForStoringInConfigFile(), 以密碼字串及演算法名稱 (“MD5” 或 “SHA1”) 為參數呼叫此方法, 即會傳回編碼過的字串內容, 例如:
  • 則最後 md5pass 的值就是 "123" 經過 MD5 演算法編碼後的字串。
slide37
在網頁中進行驗證
  • 剛剛在 Web.Config 中設定了預設的登入網頁為 Ch13-01.aspx, 因此我們就來設計這個登入網頁, 網頁中使用兩個 TextBox 以供輸入帳號及密碼, 再加上一個登入按鈕:
slide39
在網頁中進行驗證
  • 在登入按鈕的事件處理程序中, 要做的就是驗證瀏覽者所輸入的帳號及密碼是否與 Web.config 中設定的相同, 此動作可用 FormsAuthentication 的 Authenticate() 方法進行, 呼叫時的參數就是帳號及密碼, 驗證通過則傳回 True。
  • 所以按鈕的處理程序可寫成:
slide41
在網頁中進行驗證
  • 第 9 行呼叫的 RedirectFromLoginPage() 會在驗證成功時, 將登入者導向到指定的網頁:若使用者是從網站中其它網頁導向進來, 此方法會讓使用者回到該網頁;否則就是自動連上 <forms> 標籤 defaultUrl 屬性所指的網頁 (預設為 Default.aspx)。

RedirectFromLoginPage() 的第 1 個參數為帳號名稱, 如此可讓轉向過去的網頁取得使用者資訊, 第 2 個參數則是設定是否要將登入資訊存於 Cookie 中。

slide42
在網頁中進行驗證
    • 如果要由程式指定轉向的網頁, 可加上網頁名稱 (相對路徑) 字串當成第 3 個參數。
    • 第 11 行則會在 Authentication() 方法傳回 False 時顯示『登入失敗』的訊息。
  • 為了測試導向功能, 我們再設計一個 Ch13-02.aspx, 此網頁只有一段歡迎訊息及一個 Literal 控制項。
slide43
在網頁中進行驗證
  • 我們讓網頁載入時, 就會將登入的使用者名稱顯示在 Literal 控制項中, 使用者名稱的取得方式, 是使用 Page 的 User 物件, 並透過其 Identity.Name 屬性取得:
slide44
在網頁中進行驗證
  • 將兩個檔案都存檔後, 請先用瀏覽器開啟 Ch13-02.aspx, 此時因尚未通過驗證, 因此會自動導到 Ch13-01.aspx 網頁:
slide45
在網頁中進行驗證
  • 以上就是一個簡單的表單驗證範例, 由建立的過程中可發現, 此種設計方式並不適用於使用者較多的網站:
slide46
在網頁中進行驗證
  • 要將帳號 / 密碼一一加到 Web.config 中非常不便, 如果要將密碼字串編碼, 還需另行處理。
  • Web.config 的帳號並不支援群組帳號 / 角色這類功能, 因此網站中如要對多人做不同的授權, 設定工作也很鎖碎。
  • 若要將帳號 / 密碼存於資料庫或其它位置, 則需自行撰寫讀取及比對帳號 / 密碼的驗證程式。
slide47
在網頁中進行驗證
  • 因此在 ASP.NET 2.0 增加了一套功能完整的會員 (Membership) 與角色 (Role) 管理機制, 並提供相對應的控制項, 讓登入帳號的建立與管理、權限管理、網頁的設計都更加方便。
  • 本章後續內容就以建立會員系統及相關控制項的使用為例來說明
slide48
13 - 2 使用會員管理機制
  • ASP.NET 2.0 的會員管理是建構於表單驗證系統上的新功能, 其特色包括:
    • 所有使用者的登入資料 (會員資料) 都存於 SQL Server 2005 Express 資料庫中。
    • 提供角色管理, 將多位會員設為同一角色, 再透過角色設定存取權限, 就不需一一設定個別會員的授權。
    • 提供管理介面管理會員與角色。
    • 提供登入及基本會員新增、維護功能的控制項, 方便網頁開發。
slide49
使用會員管理機制
  • 會員與角色資料庫是以資料庫檔案的形式, 存於網站的 App_Data 資料夾下。換言之, 網頁執行時, 會以使用者執行個體的方式執行 SQL Server 2005 Express, 並附加此會員資料庫以便存取。
  • 如果想使用其它的資料來源, 必須另行設定及撰寫程式, 詳細資訊請參見 MSDN 網站上的說明。
slide50
建立會員及會員資料庫
  • 雖然資料是存於 SQL Server 2005 Express 資料庫, 但我們不必自行建立、管理資料庫, 所有的會員管理動作, 都可透過 ASP.NET 應用程式管理員進行。
  • 只要逕行建立第一個會員, ASP.NET 應用程式管理員就會替我們建立必要的資料庫及資料表。請在 VWD 中執行『網站 / ASP.NET 組態』命令, 並依如下步驟建立第 1 個會員:
slide56
建立會員及會員資料庫
  • 建好會員之後, 由 VWD 的方案總管窗格檢視 App_Data 資料夾, 即可看到已建好一個 ASPNETDB.MDF 資料庫。
  • 如果您想瞭解資料庫中有哪些資料表, 可在資料庫總管窗格中檢視, 但請不要自行更動資料庫內容, 以免造成會員系統損毀。
slide57
建立會員及會員資料庫
  • 為方便後續測試, 我們再建立一位會員, 請再進入建立會員的網頁:
slide59
帳號及密碼相關設定
  • 在建立帳號及密碼的過程中, 讀者或許覺得密碼強制至少 7 個字元、至少含 1 特殊符號、一定要輸入問題等限制, 對使用者並不友善。
  • 如果想放寬限制, 可到 machine.config 中設定。
  • 在 machine.config 中的 <membership> 標籤下, 即有會員資料提供者的相關參數, 其中也包括帳號、密碼限制的設定:
slide61
帳號及密碼相關設定
  • 以下說明其中幾個重要的屬性:
    • EnablePasswordReset:是否允許使用者重設密碼, 在 13-4 節會介紹重設密碼的方式。
    • EnablePasswordRetrieval:是否允許使用 MembershipProvider 類別的 GetPassword() 方法, 由資料庫中取得使用者密碼;但如果以下的 PasswordFormat 屬性為 "Hashed", 則密碼是無法被取得的 (因雜湊演算法是單向演算法, 無法由雜湊值推算回原本的密碼為何)。
slide62
帳號及密碼相關設定
  • MinRequiredNonAlphanumericCharacters:指定密碼中至少要含幾個文數字以外的特殊符號字元, 若要讓會員不必費心想出奇怪的密碼, 可將此屬性值設為 0。
  • MinRequiredPasswordLength:設定密碼最短長度, 若要容許較短的密碼, 就將此屬性設為較小的數值。
slide63
帳號及密碼相關設定
  • PasswordFormat:指定密碼儲存在資料表中的格式, 可使用的值包括 "Clear" (明碼)、 "Encrypted" (加密)、"Hashed" (以雜湊演算法編碼) 三種。
  • RequiresQuestionAndAnswer:是否一定要用問 / 答的資料, 才能重新取得密碼。
  • RequiresUniqueEmail:是否強制會員都要用不同的電子郵件地址註冊, 例如設為 "true" 即表示同一個電子郵件不能重複註冊。
slide64
建立與設定角色
  • 在一般的網路作業系統中, 為方便管理, 都會用『群組』來管理使用者的存取權限。
  • 例如設定 Administrators 群組可執行任何程式, 則所有屬於此群組的使用者, 都具有執行任何程式的權限。
  • 而為了方便管理會員的授權, 我們也可透過角色來設定網站的權限, 讓屬於同一角色的會員, 都能具有相同的授權。
slide65
建立與設定角色
  • 初次建立會員與會員資料庫時, 預設不會啟用角色功能, 因此我們要先啟用才能建立角色, 請在 ASP.NET 應用程式管理員的安全性頁面做如下設定:
slide70
建立與設定角色
  • 要將既有的會員加入角色中, 可依如下方式進行:
slide73
建立與設定角色
  • 此外, 在啟

用角色功能

後, 建立使

用者時, 即

可勾選要讓

新使用者隸

屬的角色:

slide74
設定權限
  • 建好會員及角色後, 就可開始設定網站的存取權限。
  • 為方便測試, 我們先在網站中加入一個子資料夾:
slide75
設定權限
  • 我們要讓這個子資料夾只供屬於 Admin 角色的會員進入, 所以必需設定禁止一般會員存取, 但 Admin 可存取。
  • 請再執行『網站 / ASP.NET 組態』命令, 進入安全性頁面進行如下設定:
slide83
設定權限
  • 但網頁上方的說明文字提到:當有多個規則時, 位於較上方的規則設定, 將會蓋住較下方的規則。
  • 而在我們的例子中, 雖然設定了允許 Admin 角色存取 Admin 資料夾, 但此規則因位於第 2 個位置, 會被『拒絕所有會員存取』的規則蓋過去, 所以要將這 2 個規則的位置對調一下:
slide87
設定權限
  • 建好會員帳號及相關授權設定後, 我們就可設計網頁來測試會員與角色的功能。
  • 不過我們並不需像前面表單驗證一樣, 自行設計登入的畫面與驗證程式, 這些都已有現成的控制項可使用, 以下就來介紹搭配會員機制使用的登入控制項。
slide88
13 - 3 登入控制項
  • 為簡化設計會員登入功能, ASP.NET 2.0 特別提供了一組與會員登入相關的控制項, 這些控制項本身即會存取會員資料庫的資訊, 也提供驗證、維護等相關功能, 讓我們能在不必撰寫程式碼的情況下, 即可實做出功能完整的登入網頁。
login loginname loginstatus
Login、LoginName、LoginStatus 控制項
  • 首先來介紹 Login 和 LoginName 這兩個控制項, 前者的用途就是提供類似範例 Ch13-01.aspx 的輸入帳號 / 密碼及登入按鈕的登入功能;後者則是單純顯示登入使用者的名稱。
  • 以下就來設計兩個網頁示範其功能, 請先建立新網頁 Ch13-03.aspx, 並在設計模式下, 將 Login 控制項拉曳到網頁中:
login loginname loginstatus3
Login、LoginName、LoginStatus 控制項
  • 如此就算完成一個可以運作的登入網頁了。
  • 但我們還可做一些額外的設定, 例如DestinationPageUrl屬性可設定在登入成功後, 自動導向到指定的網頁:
login loginname loginstatus5
Login、LoginName、LoginStatus 控制項
  • 上圖的設定是讓使用者登入成功後, 自動導向到 Ch13-04.aspx, 所以我們現在要用 LoginName 和 LoginStatus 控制項建立這個登入後的歡迎網頁:
login loginname loginstatus7
Login、LoginName、LoginStatus 控制項
  • LoginName 控制項的功能很簡單, 就是顯示目前登入的帳號名稱, 不過我們可在 FormatString 屬性中加入其它要顯示的文字 (例如歡迎訊息):
login loginname loginstatus9
Login、LoginName、LoginStatus 控制項
  • LoginStatus 則會依使用者是否登入, 顯示不同的內容:預設在有使用者登入時, 顯示登出的超連結;使用者未登入時則顯示登入的超連結。
  • 最後我們在 Admin 資料夾中再放入一個類似的網頁 Ch13-05.aspx, 以便測試前一節對 Admin 資料夾做的授權設定:
login loginname loginstatus11
Login、LoginName、LoginStatus 控制項
  • 為測試此處及後續的範例, 我們將 Web.config 中 <forms> 標籤所設的登入網頁改成指向 Ch13-03.aspx, 同時也將拒絕匿名使用者連線的授權設定標示為註解 (或直接刪除之):
login loginname loginstatus12
Login、LoginName、LoginStatus 控制項
  • 存檔後, 用瀏覽器開啟 Ch13-03.aspx 即會看到如下的登入畫面:
login loginname loginstatus16
Login、LoginName、LoginStatus 控制項
  • 如上的範例, 我們只需在會員資料庫設好各會員所屬的角色、各角色的權限, ASP.NET 就會自行替我們做相關的安全控管, 不需我們自行撰寫相關檢查程式。
  • 如果想自行用程式檢查使用者角色, 可呼叫 Roles 類別的下列 2 個方法:
loginview
使用 LoginView 控制項
  • 在上一個例子中, 由於我們已將 Web.config 中拒絕匿名使用者的授權設定去掉, 所以匿名使用者可直接連上網站時, 若他們連上 Ch13-04.aspx 時, 則會看到如下的畫面:
loginview1
使用 LoginView 控制項
  • 由於使用者未登入, 所以 LoginName 控制項無法取得登入帳號名稱, 因此未顯示任何內容。
  • 我們雖可修改網頁, 用程式判斷使用者是否已登入, 再顯示合適的訊息及內容, 但其實有個更方便的作法, 就是改用 LoginView 控制項。
loginview2
使用 LoginView 控制項
  • LoginView 也是以 Template 構成的控制項, 同樣分為未登入及已登入的 Template, 我們只要分別設計好兩個 Template 的內容, 網頁被瀏覽時, 控制項就會自動判斷使用者是否已登入, 並據以顯示合適的 Template。
  • 以下就先建立一個空白網頁 (Ch13-06.aspx), 並將 LoginView 控制項加到網頁中:
loginview7
使用 LoginView 控制項
  • 網站已上線的會員人數資訊, 可透過 Membership 類別的 GetNumberOfUsersOnline() 方法取得, 因此可在 Page_Load 事件中做如下處理即可在網頁中顯示已上線的會員人數:
loginview8
使用 LoginView 控制項
  • 存檔後瀏覽網頁即可看到如下效果:
loginview11
使用 LoginView 控制項
  • 在上圖可看到, 雖然我們已經登出, 但仍被 ASP.NET 視為在線上, 這是因為對伺服器端動態網頁程式而言, 當網頁已傳送給瀏覽器, 連線就結束了, 在伺服器端根本無從判斷對方是否仍在線上 (使用者可能仍在閱讀網頁, 也可能已關閉瀏覽器視窗)。
  • 因此 GetNumberOfUsersOnline() 方法其實只是根據會員資料庫中所記錄的最近一次登入時間, 是否超過 15 分鐘, 來計算上線會員數:
loginview12
使用 LoginView 控制項
    • 若會員上次登入時間距今未超過15 分鐘, 則視為仍在線上。
    • 若會員上次登入時間距今已超過15 分鐘, 則視為仍在線上。
  • 如果覺得 15 分鐘的時間太長, 對上線人數有灌水之嫌, 則可在 Web.config 中加入 <membership> 標籤, 以 userIsOnlineTimeWindow 屬性來設定較短的時間 (單位為分鐘):
loginview13
使用 LoginView 控制項
  • 與登入狀態相關的控制項就介紹到此, 下一節繼續介紹搭配會員機制的維護用控制項。
slide120
13 - 4 會員維護相關控制項
  • 如果要讓管理員自行在 ASP.NET 應用程式管理員中建立所有會員帳號不僅不方便, 也使網站運作相當沒有彈性。
  • 因此 ASP.NET 2.0 特別提供 3 個繼承自 Wizard 控制項而產生的維護用途控制項:
slide121
會員維護相關控制項
  • CreateUserWizard 控制項:可供線上註冊。
  • ChangePassword 控制項:可供使用者修改密碼。
  • PasswordRecovery 控制項:可在使用者忘記密碼時, 供使用者取得或重設密碼。
createuserwizard
CreateUserWizard
  • CreateUserWizard 如其名稱, 是建立會員帳號的控制項, 而最常見的用途即是放在網站提供線上即時註冊的功能, 如此就不需由管理員預先建立帳號, 任一位造訪網站的人, 都能選擇立即註冊建立新帳號。
  • 此控制項也是拉曳到網頁中即可使用:
createuserwizard2
CreateUserWizard
  • 其實前面使用 ASP.NET 應用程式管理員建立會員帳號時的畫面, 就是使用 CreateUserWizard 控制項建立的。
  • 但此控制項原本有兩個步驟:
    • 第 1 個就是上圖看到的會員資料輸入畫面內容
    • 下一步則是註冊成功的訊息:
createuserwizard4
CreateUserWizard
  • 在屬性窗格中除了可修改、自訂控制項中各部份的文字外, 也可透過以下幾個屬性改變其行為:
    • AutoGeneratePassword:若設為 "true", 則控制項中不會出現密碼欄位, 密碼是由控制項自動產生。
    • ContinueDestinationPageUrl:設定在註冊成功的畫面中,繼續鈕所代表的網頁連結 (例如網站首頁), 在本範例中, 我們將之設為 "~/Ch13-06.aspx"。
createuserwizard5
CreateUserWizard
    • LoginCreatedUser:是否在建立成功後, 就自動以新帳號驗證、登入, 預設為 "true"。
    • RequireEmail:設定是否顯示電子郵件欄位。
  • 由於 CreateUserWizard 控制項類別是繼承 Wizard 控制項所產生的, 因此具備和 Wizard 控制項相同的特性。
createuserwizard6
CreateUserWizard
  • 此外當您在設計頁面中設計完成時, 要記得將頁面選回第 1 步驟, ActiveStepIndex 屬性才會自動回復為 0, 否則將會使得瀏覽網頁時, 一開始即進入後面的步驟。
  • 設定完成並存檔後, 瀏覽網頁時即可在線上註冊新帳號:
createuserwizard9
CreateUserWizard
  • CreateUserWizard 控制項和 Wizard 控制項一樣可以隨意加入新的步驟, 設定方式與 Wizard 控制項類似, 請參見第 5 章。
changepassword
ChangePassword 控制項
  • 有些使用者在註冊後會想要改變密碼, 此時可利用 ChangePassword 控制項在網頁上提供相關功能, 此控制項也是拉曳到網頁中即可使用:
changepassword2
ChangePassword 控制項
  • ChangePassword 控制項的使用技巧、注意事項和 CreateUserWizard 控制項差不多。
  • 此外還可透過下列 2 個屬性, 設定使用者操作時的行為:
    • CancelDestinationPageUrl:設定使用者按取消鈕時要進入哪一個網頁。
    • ContinuedDestinationPageUrl:設定變更成功按繼續鈕要導向到哪一個網頁。
changepassword3
ChangePassword 控制項
  • 本範例仍是將這兩個屬性都設為 "~/Ch13-06.aspx" 。
  • 在預設情況下, 使用者必須登入後才能變更密碼, 不過 ChangePassword 控制項還提供一種變通的方式:只要將DisplayUserName 屬性設為 "true", 則控制項中會多出一個使用者名稱欄位, 可供未登入的使用者輸入其帳號名稱:
changepassword5
ChangePassword 控制項
  • 如果使用者已登入, 則使用者名稱欄會自動填入目前登入的名稱。
  • 存檔後瀏覽網頁就可測試其效果:
passwordrecovery
PasswordRecovery 控制項
  • 幾乎每個人都有忘記密碼的經驗, 如果網站會員忘記密碼, 則可用 PasswordRecovery 控制項來重設密碼。
  • 網站使用 PasswordRecovery 控制項重設密碼的流程如下:
    • 1. 使用者連上網站要重設密碼。
    • 2. 進入使用 PasswordRecovery 控制項的網頁, 輸入使用者名稱。
passwordrecovery1
PasswordRecovery 控制項
    • 3. PasswordRecovery 控制項會自動產生一組新密碼, 並將新密碼寄到使用者註冊時所輸入的郵件信箱。
  • 由於 PasswordRecovery 控制項是以電子郵件將新密碼寄給使用者, 所以我們必須先用 ASP.NET 應用程式管理員在 Web.config 做好 SMTP 的設定 (設定方式請參見第 10 章), PasswordRecovery 控制項才能正常運作。
passwordrecovery2
PasswordRecovery 控制項
  • 當您已設妥網站的 SMTP 設定, 即可在網頁中使用 PasswordRecovery 控制項, 並測試其效果:
passwordrecovery4
PasswordRecovery 控制項
  • 前面介紹的 2 個控制項預設的步驟都只有 2 個, 但 PasswordRecovery 控制項則有 3 個, 分別是:詢問使用者名稱、詢問問題答案、最後的成功訊息, 您可依需要自訂這些步驟的 Template 或加入新的步驟。
passwordrecovery5
PasswordRecovery 控制項
  • 儲存檔案後, 即可在瀏覽器中測試其效果:
passwordrecovery7
PasswordRecovery 控制項
  • 稍候在會員當初註冊時所輸入的郵件信箱就會收到如下的郵件內容:
passwordrecovery8
PasswordRecovery 控制項
  • 附帶說明, 當您的網站已建立重設密碼的網頁, 即可在 Login 控制項中用下列 2 個屬性, 讓 Login 控制項中出現重設密碼網頁的連結:
    • PasswordRecoveryText:代表『重設密碼網頁』的連結文字。
    • PasswordRecoveryUrl:『重設密碼網頁』的網址, 例如 "~/Ch13-09.aspx"。
slide148
13 - 5 使用者設定檔
  • 許多會員網站都會提供記錄會員設定的功能, 像是會員目前所選的佈景主題、是否在會員網頁顯示網站新聞...等等。
  • 這類設定並不適合以 Cookie 存在用戶端, 因為使用者換一台電腦登入網站, 網站就讀不到前次設定, 只能依預設值顯示網頁, 失去會員設定的效果。
slide149
使用者設定檔
  • 因此這類資訊必須存放在伺服器端, 而 ASP.NET 2.0 更進一步提供使用設定檔 (Profile) 功能, 讓我們能很方便地在伺服器端儲存會員設定。
profile
建立 Profile 項目
  • ASP.NET 2.0 的設定檔 (Profile) 功能是整合於會員管理機制, 在建立會員資料庫時, 也會自動建立用來存放設定資訊的 Profile 資料表。
  • 雖然資料表已建好, 但我們仍需先在 Web.config 中定義打算要存放的設定檔屬性, 之後才能用程式儲存、讀取會員的個人設定。
profile1
建立 Profile 項目
  • 要定義設定值屬性, 需在 <profile> 標籤下的 <properties> 標籤下, 用 <add> 標籤來定義, 其格式為:
profile2
建立 Profile 項目
  • 例如我們想用設定檔記錄會員喜好的顏色及年齡, 則可用如下的 <add> 標籤設定之:
profile3
以程式存取 Profile 設定值
  • 只要使用者已登入, 在網頁程式中即可用『Profile. 設定檔屬性名稱』的形式, 存取目前登入者的設定:
  • 為測試上述設定的效果, 我們撰寫一個簡單的範例網頁。
profile4
以程式存取 Profile 設定值
  • 此網頁是由表格分為左右兩邊, 左邊含一 LoginView 控制項;右邊則是可供會員輸入年齡的 TextBox 控制項、選擇喜好顏色的 RadioButtonList 控制項、以及儲存設定的 Button 控制項:
profile6
以程式存取 Profile 設定值
  • 當網頁載入時, 程式要判斷目前使用者是否已通過驗證 (已登入), 是就立即從資料庫取得其設定資料, 並反應在網頁中 (若使用者尚無設定值, 則會出現預設值)。
  • 至於儲存設定按鈕的 Click 事件處理程序, 則只是將新的設定值寫入 Profile 之中:
profile9
以程式存取 Profile 設定值
  • 第 11、29 行, 是透過控制項的 Style.Item 屬性, 設定 "background-color" (背景顏色) 的屬性, 本例中, 就是用 Profile.FavoriteColor 的值來設定背景顏色。
  • 第 14 行開始的 Else 區塊, 則會在使用者尚未登入的情況下, 將各控制項的 Enabled 屬性設為 False, 也就是讓控制項都不能被操作。

如果將此網頁設定成只有驗證通過的使用者才能存取, 就不需做這類檢查及設定。

profile10
以程式存取 Profile 設定值
  • 存檔後瀏覽網頁即可看到如下的效果: