1.64k likes | 1.75k Views
Chapter 13. 網站安全管理基礎. 本章提要. 13 - 1 ASP.NET 的安全管理機制 13 - 2 使用會員管理機制 13 - 3 登入控制項 13 - 4 會員維護相關控制項 13 - 5 使用者設定檔. 網站安全管理基礎. 不管是基於保護網站資訊、限制使用者可存取的網頁;或僅只是要為網站提供一些個人化的功能 , 都必須為瀏覽網頁的使用者 『 驗明正身 』, 也就是透過安全管理的驗證機制 , 辨明瀏覽網頁者的身份。 本章就來介紹 ASP.NET 2.0 的安全驗證機制 , 及如何在網頁上實作驗證功能。.
E N D
Chapter 13 網站安全管理基礎
本章提要 • 13 - 1 ASP.NET 的安全管理機制 • 13 - 2 使用會員管理機制 • 13 - 3 登入控制項 • 13 - 4 會員維護相關控制項 • 13 - 5 使用者設定檔
網站安全管理基礎 • 不管是基於保護網站資訊、限制使用者可存取的網頁;或僅只是要為網站提供一些個人化的功能, 都必須為瀏覽網頁的使用者『驗明正身』, 也就是透過安全管理的驗證機制, 辨明瀏覽網頁者的身份。 • 本章就來介紹 ASP.NET 2.0 的安全驗證機制, 及如何在網頁上實作驗證功能。
13 - 1 ASP.NET 的安全管理機制 • ASP.NET 的安全管理可分為驗證與授權兩個層次: • 驗證 (Authentication):簡單的說, 驗證就是查核使用者身份的動作, 例如常見的 Web-Mail 應用, 當我們要連上自己的網路信箱時, 要輸入使用者名稱和密碼, 通過驗證後才能讀信、寫信。
ASP.NET 的安全管理機制 • 授權 (Authorization):授權則是指通過驗證的使用者, 對於網站中各項資源有何存取權限。 例如網路論壇的管理者, 即被授權可以管理論壇的會員帳號、編輯和刪除所有文章等;而一般的註冊會員, 則只能發表新文章, 或是編輯自己發表的文章。
ASP.NET 的安全管理機制 • ASP.NET 即是透過驗證和授權來做網頁的安全管理, 例如系統管理員可設定:使用者通過驗證後才能存取網頁、而權限不同的使用者, 則可執行不同的功能或是瀏覽不同的網頁等等。 • 驗證和授權的基本設定都是放在 Web.Config 之中, 以下就來介紹 Web.Config 中相關標籤的用法。
IIS 伺服器的安全管理 • ASP.NET 動態網頁需放在 IIS 伺服器上執行, 當使用者要瀏覽一個 ASP.NET 網頁時, 當然是先向伺服器提出要求。 • 因此不管這個 ASP.NET 網頁有沒有使用本章介紹的安全控管機制, 在提出要求時, 就會先進入如下的安全驗證程序, 通過後 IIS 才會進一步執行 ASP.NET 網頁:
IIS 伺服器的安全管理 • 1. 提出要求的 IP 位址是在允許存取網站之列。 • 2. 使用者需通過 Windows 安全驗證;不過 IIS 預設允許匿名存取, 且會以網站設定的帳號登入。 • 3. ASP.NET 網頁所在的網站或資料夾有開放可『執行』網頁的權限。 • 4. ASP.NET 網頁若是存於 NTFS 資料夾, 則登入的身份需擁有該 .aspx 檔的存取權限。
IIS 伺服器的安全管理 • 通過上述安全檢查後, 該 ASP.NET 網頁才會被執行, 並進一步傳回執行結果, 或是再進入 ASP.NET 的安全檢查程序。 • 關於 IIS 安全設定的詳細資訊, 可參見 IIS 線上說明;本書附錄則會介紹如何在 Windows XP 安裝 IIS 伺服器。
Web.Config 的驗證設定 • ASP.NET 支援的驗證方式有下列 3 種: • Windows 驗證:使用 Windows 的網域或本機帳戶進行驗證。使用此法時, 就是直接承襲 IIS 的 Windows 驗證結果, 因此網頁不需再自行做驗證。 • Forms 驗證:在網頁中詢問使用者名稱及密碼進行驗證。本書以下都將此種驗證稱為表單驗證。
Web.Config 的驗證設定 • Passport 驗證:使用微軟的 .NET Passport (現更名為 Windows Live!) 系統進行驗證, 需另外安裝 Passport SDK 才能使用, 因此本書將不介紹。 • 如上所列, 使用 Windows 驗證時, ASP.NET 並不需進行『驗證』的動作;而使用 Passport 驗證又需額外的開發套件才能使用, 因此本章就將重點放在表單驗證。
Web.Config 的驗證設定 • 要使用表單驗證, 可在 Web.config 的 <system.web> 標籤下使用 <authentication> 標籤設定:
Web.Config 的驗證設定 • 啟用表單驗證後, 可在 <authentication> 標籤下加上 <forms> 標籤設定驗證相關參數, 但在進一步說明這些設定前, 我們先認識一下表單驗證的運作方式。 • 網站使用表單驗證時, 當有瀏覽器提出瀏覽 ASP.NET 網頁的要求, 即進入 ASP.NET 的安全管理程序:
Web.Config 的驗證設定 • 1. ASP.NET 的驗證模組會檢查瀏覽者是否持有驗證使用者身份的 Ticket, 若無則進入網站所設定的登入網頁, 要求瀏覽者進行驗證。 • 2. 瀏覽者通過驗證後, 系統會產生記錄登入資訊的 Ticket, 此 Ticket 可存於 Cookie 或以 URL 查詢字串的形式存在。
Web.Config 的驗證設定 • 3. 之後瀏覽者繼續瀏覽網站中的任何網頁時, ASP.NET 即可由 Ticket 取得使用者身份, 並檢查該身份是否有足夠授權存取網頁, 有授權即允許存取網頁。 • 至於代表驗證通過的 Ticket 是用 Cookie 或其它方式儲存、Cookie 的效期為何, 這些都可在 <forms> 標籤中用下列屬性來設定:
Web.Config 的驗證設定 • cookieless:設定 Ticket 的存放方式, 可為下列值: • UseCookies:以 Cookie 存放驗證的 Ticket。 • UseUri:不使用 Cookie, Ticket 會以編碼過的方式呈現在 URL 中。 • AutoDetect:自動偵測, 若瀏覽端支援 Cookie 時就會選用 Cookie。 • UseDeviceProfile:此為預設值, 表示依 machine.config 中的設定, 依裝置類型決定是否使用 Cookie。
Web.Config 的驗證設定 • name:指定 cookie 的名稱, 預設值為 ".ASPXAUTH"。 • path:指定 cookie 的路徑名稱, 預設值為 "\", 也就是根目錄。 • timeout:指定 cookie 的有效時間 (分鐘), 預設值為 30。
Web.Config 的驗證設定 • slidingExpiration:設定 cookie 有效時間,是否要隨使用者重新上線而自動延長。預設值為 "False", 亦即不延長;若設為 "True", 則在 cookie 的有效時間快到期前, 使用者又重新連上網站, cookie 的有效時間會自動改為從這一次登入的時間開始計算。
Web.Config 的驗證設定 • protection:指定 Ticket 是否加密及查驗 (validation), 可設為: • All:要加密及查驗。 • None:都不要。 • Encryption:只做加密。 • Validation:只做查驗。
Web.Config 的驗證設定 • loginUrl:當瀏覽者尚未通過驗證時, 會導向至此屬性所指定的驗證網頁。預設值為 "login.aspx"。 • defaultUrl:當瀏覽者過驗證通過後, 會導向至此屬性所指網頁。預設值為 "Default.aspx"。
Web.Config 的驗證設定 • 例如以下的片段是設定驗證通過後, 導向到 "memberOnly.aspx" 網頁, 且驗證通過後, cookie 會保留 1 天:
Web.Config 的授權設定 • 設好驗證方式後, 若要再進一步控管使用者可瀏覽哪些網頁, 就需加入 <authorization> 標籤設定授權方式。 • 設定方式是在 <authorization>...<authorization> 內加入 <allow/> 及 <deny/> 標籤, 指定要授權或拒絕使用者存取網站或做何種操作:
Web.Config 的授權設定 • <allow/> 及 <deny/> 標籤可使用的屬性如下: • users:要設定授權的使用者名稱, 若同時設定多人, 可用逗號分隔。另外也可用兩個符號:"?" 表示所有匿名 (Anonymous) 使用者;"*" 則表示所有的使用者。
Web.Config 的授權設定 • roles:除了直接指名使用者, 也可用此屬性指定授權對象的『角色』, 角色 (role) 的用途類似於 Windows 中的群組帳戶, 我們可將一組使用者設為相同的角色, 再設定此角色的授權, 如此一來就等於設定這一組使用者的授權。 關於如何建立角色, 會在下一節設定。
Web.Config 的授權設定 • verbs:設定對 HTTP 通訊協定動作的授權, 可設定的值包括 GET、HEAD、POST、DEBUG, 若要同時列出多個值則要用逗號分隔;預設值為 "*", 表示全部項目。 • 以下片段就是拒絕所有匿名使用者存取任何網頁的授權設定:
表單驗證的基礎 • 在 ASP.NET 中, 共有兩套實作表單驗證的方式, 其中之一為早期 ASP.NET 即提供, 使用 FormAuthentication 類別進行驗證的方式;另一個則是 ASP.NET 2.0 新增的會員管理機制。 • 本節先介紹前者, 13-2 節再介紹會員機制。
表單驗證的基礎 • 建構使用 FormAuthentication 類別驗證的系統, 除了前述修改 Web.Config 的設定外, 還必須: • 建立使用者帳號及密碼。 • 在網頁中用 FormAuthentication 類別的靜態 (static) 方法進行驗證相關操作。
建立使用者帳號及密碼 • 使用表單驗證時, 如果要用 FormAuthentication 類別提供的方法進行驗證, 則需將帳號及密碼記錄在 Web.config 之中。 • 若想將帳號 / 密碼存於資料庫或文字檔, 則進行驗證時, 就必須自行用程式讀出帳號 / 密碼, 並與瀏覽者輸入的帳號 / 密碼進行比對。
建立使用者帳號及密碼 • 要將帳號及密碼存放在 Web.config 之中, 需在 <forms> 標籤內加入 <credentials> 標籤, 然後在 <credentials> 標籤中可用 <user/> 標籤建立帳號及密碼, 格式如下:
帳號 建立使用者帳號及密碼 • <credentials> 的 passwordFormat 屬性, 是用來設定 <user/> 標籤中密碼字串的格式。若 passwordFormat 屬性設為 "Clear" 表示 password 屬性的字串就是密碼字串: • 若覺得將密碼字串直接存於 Web.config 中安全性太低, 則可改存編碼後的字串。
建立使用者帳號及密碼 • 此時可將 <credentials> 的 passwordFormat 屬性設為 “MD5” 或 “SHA1”, 表示 Web.config 中記錄的是以 MD5 (Message Digest 5) 或 SHA1 (Secure Hash Algorithm) 雜湊演算法編碼過後的字串。 • 例如密碼 “123” 經過 MD5 編碼後的字串是 "202CB962AC59075B964B07152D234B70", 此時 <user/> 標籤內就需寫成:
建立使用者帳號及密碼 • 如何產生編碼過的密碼字串, 請參見後面方框的說明, 在本節的範例仍使用未編碼的密碼做示範。 • 所以我們就先在網站的 Web.config 中, 找到 <authentication> 標籤, 將它修改成如下的內容, 並加上拒絕匿名使用者存取的設定:
建立使用者帳號及密碼 • 以上我們設定了使用表單驗證, 並將預設登入網頁設為 Ch13-01.aspx (稍後建立), 同時建立一組帳號 / 密碼:ken / 123。 • 另外我們也將網站設為拒絕匿名使用者存取, 所以一定要登入才能存取網頁, 以下就來看如何在網頁中驗證使用者。
產生編碼的密碼字串 • 要用程式產生編碼過後的密碼字中, 可使用 FormsAuthentication 類別的靜態方法 HashPasswordForStoringInConfigFile(), 以密碼字串及演算法名稱 (“MD5” 或 “SHA1”) 為參數呼叫此方法, 即會傳回編碼過的字串內容, 例如: • 則最後 md5pass 的值就是 "123" 經過 MD5 演算法編碼後的字串。
在網頁中進行驗證 • 剛剛在 Web.Config 中設定了預設的登入網頁為 Ch13-01.aspx, 因此我們就來設計這個登入網頁, 網頁中使用兩個 TextBox 以供輸入帳號及密碼, 再加上一個登入按鈕:
在網頁中進行驗證 • 在登入按鈕的事件處理程序中, 要做的就是驗證瀏覽者所輸入的帳號及密碼是否與 Web.config 中設定的相同, 此動作可用 FormsAuthentication 的 Authenticate() 方法進行, 呼叫時的參數就是帳號及密碼, 驗證通過則傳回 True。 • 所以按鈕的處理程序可寫成:
在網頁中進行驗證 • 第 9 行呼叫的 RedirectFromLoginPage() 會在驗證成功時, 將登入者導向到指定的網頁:若使用者是從網站中其它網頁導向進來, 此方法會讓使用者回到該網頁;否則就是自動連上 <forms> 標籤 defaultUrl 屬性所指的網頁 (預設為 Default.aspx)。 RedirectFromLoginPage() 的第 1 個參數為帳號名稱, 如此可讓轉向過去的網頁取得使用者資訊, 第 2 個參數則是設定是否要將登入資訊存於 Cookie 中。
在網頁中進行驗證 • 如果要由程式指定轉向的網頁, 可加上網頁名稱 (相對路徑) 字串當成第 3 個參數。 • 第 11 行則會在 Authentication() 方法傳回 False 時顯示『登入失敗』的訊息。 • 為了測試導向功能, 我們再設計一個 Ch13-02.aspx, 此網頁只有一段歡迎訊息及一個 Literal 控制項。
在網頁中進行驗證 • 我們讓網頁載入時, 就會將登入的使用者名稱顯示在 Literal 控制項中, 使用者名稱的取得方式, 是使用 Page 的 User 物件, 並透過其 Identity.Name 屬性取得:
在網頁中進行驗證 • 將兩個檔案都存檔後, 請先用瀏覽器開啟 Ch13-02.aspx, 此時因尚未通過驗證, 因此會自動導到 Ch13-01.aspx 網頁:
在網頁中進行驗證 • 以上就是一個簡單的表單驗證範例, 由建立的過程中可發現, 此種設計方式並不適用於使用者較多的網站:
在網頁中進行驗證 • 要將帳號 / 密碼一一加到 Web.config 中非常不便, 如果要將密碼字串編碼, 還需另行處理。 • Web.config 的帳號並不支援群組帳號 / 角色這類功能, 因此網站中如要對多人做不同的授權, 設定工作也很鎖碎。 • 若要將帳號 / 密碼存於資料庫或其它位置, 則需自行撰寫讀取及比對帳號 / 密碼的驗證程式。
在網頁中進行驗證 • 因此在 ASP.NET 2.0 增加了一套功能完整的會員 (Membership) 與角色 (Role) 管理機制, 並提供相對應的控制項, 讓登入帳號的建立與管理、權限管理、網頁的設計都更加方便。 • 本章後續內容就以建立會員系統及相關控制項的使用為例來說明
13 - 2 使用會員管理機制 • ASP.NET 2.0 的會員管理是建構於表單驗證系統上的新功能, 其特色包括: • 所有使用者的登入資料 (會員資料) 都存於 SQL Server 2005 Express 資料庫中。 • 提供角色管理, 將多位會員設為同一角色, 再透過角色設定存取權限, 就不需一一設定個別會員的授權。 • 提供管理介面管理會員與角色。 • 提供登入及基本會員新增、維護功能的控制項, 方便網頁開發。
使用會員管理機制 • 會員與角色資料庫是以資料庫檔案的形式, 存於網站的 App_Data 資料夾下。換言之, 網頁執行時, 會以使用者執行個體的方式執行 SQL Server 2005 Express, 並附加此會員資料庫以便存取。 • 如果想使用其它的資料來源, 必須另行設定及撰寫程式, 詳細資訊請參見 MSDN 網站上的說明。
建立會員及會員資料庫 • 雖然資料是存於 SQL Server 2005 Express 資料庫, 但我們不必自行建立、管理資料庫, 所有的會員管理動作, 都可透過 ASP.NET 應用程式管理員進行。 • 只要逕行建立第一個會員, ASP.NET 應用程式管理員就會替我們建立必要的資料庫及資料表。請在 VWD 中執行『網站 / ASP.NET 組態』命令, 並依如下步驟建立第 1 個會員: