基于窗體的身份驗證是 ASP.NET 身份驗證服務(wù),它使應用程序能夠提供它們自己的登錄 UI 和進(jìn)行它們自己的憑據驗證。ASP.NET 驗證用戶(hù)的身份,將未授權的用戶(hù)重定向到登錄頁(yè)并執行所有必要的 Cookie 管理。這種身份驗證是許多 Web 站點(diǎn)使用的流行方法。
應用程序必須被配置成使用基于窗體的身份驗證,將 <authentication> 設置為 Forms 并且拒絕匿名用戶(hù)訪(fǎng)問(wèn)。下面的示例說(shuō)明如何在所需應用程序的 Web.config 文件中完成此配置:
管理員使用基于窗體的身份驗證來(lái)配置要使用的 Cookie 名稱(chēng)、保護類(lèi)型、用于登錄頁(yè)的 URL、Cookie 生效的時(shí)間長(cháng)度以及用于已發(fā)布 Cookie 的路徑。下表顯示了 <Forms> 元素(它是下面的示例中顯示的 <authentication> 元素的子元素)的有效屬性:
| 屬性 | 說(shuō)明 |
|---|---|
| loginUrl | 未授權的用戶(hù)被重定向到的登錄 URL。它可以在同一臺計算機上或在遠程計算機上。如果它在遠程計算機上,兩臺計算機需要對 decryptionkey 屬性使用相同的值。 |
| name | 用于身份驗證目的的 HTTP Cookie 的名稱(chēng)。注意:如果不止一個(gè)應用程序要在一臺計算機上使用基于窗體的身份驗證服務(wù),則每個(gè)應用程序應該配置唯一的 Cookie 值。為了避免在 URL 中導致依賴(lài)項,ASP.NET 在設置身份驗證 Cookie 時(shí)將“/”用作 Path 值,這使 Cookie 被發(fā)送回站點(diǎn)上的每個(gè)應用程序。 |
| timeout | 以整數分鐘為單位的時(shí)間量,超過(guò)此時(shí)間量,Cookie 將過(guò)期。默認值是 30。超時(shí)屬性是一個(gè)變化值,從收到最后一個(gè)請求的時(shí)間開(kāi)始計算,它過(guò)期 n 分鐘。為了避免對性能產(chǎn)生負面影響,也為了避免那些打開(kāi)了 Cookie 警告的應用程序產(chǎn)生多個(gè)瀏覽器警告,Cookie 在超時(shí)時(shí)間過(guò)半時(shí)更新。(這意味著(zhù)在某些情況下會(huì )丟失可能的精度。) |
| path | 用于已發(fā)出 Cookie 的路徑。默認值為“/”以避免因路徑中有不匹配的大小而帶來(lái)的困難,因為在返回 Cookie 時(shí),瀏覽器嚴格區分大小寫(xiě)。共享服務(wù)器環(huán)境中的應用程序應該使用此指令維持專(zhuān)用 Cookie。(另一種方法是,它們可以使用 API 在運行時(shí)指定路徑以發(fā)出 Cookie。) |
| protection | 用于保護 Cookie 數據的方法。有效值如下所示:
|
配置了應用程序后,需要提供一個(gè)登錄頁(yè)。下面的示例顯示了一個(gè)簡(jiǎn)單的登錄頁(yè)。示例在運行時(shí)要求 Default.aspx 頁(yè)。未授權的請求被重定向到登錄頁(yè) (Login.aspx),此頁(yè)顯示一個(gè)簡(jiǎn)單的窗體,提示用戶(hù)輸入電子郵件地址和密碼。(使用 Username="jdoe@somewhere.com" 和 Password="password" 作為憑據。)
驗證了憑據后,應用程序調用下列內容:
<script language=JavaScript> function doClick(index, numTabs, id) { document.all("tab" + id, index).className = "tab"; for (var i=1; i < numTabs; i++) { document.all("tab" + id, (index + i) % numTabs).className = "backtab"; } document.all("code" + id, index).style.display = ""; for (var j=1; j < numTabs; j++) { document.all("code" + id, (index + j) % numTabs).style.display = "none"; } } </script>
FormsAuthentication.RedirectFromLoginPage(UserEmail.Value, PersistCookie.Checked); FormsAuthentication.RedirectFromLoginPage(UserEmail.Value, PersistCookie.Checked) FormsAuthentication.RedirectFromLoginPage(UserEmail.Value, PersistCookie.Checked); | |||
| C# | VB | JScript | |
這將用戶(hù)重定向回當初請求的 URL。不想執行重定向的應用程序可以或者調用 FormsAuthentication.GetAuthCookie 來(lái)檢索 Cookie 值,或者調用 FormsAuthentication.SetAuthCookie 將正確加密的 Cookie 附加到輸出的響應中。對于提供嵌入在包含頁(yè)中的登錄 UI 的應用程序,或者想要更多地控制用戶(hù)被重定向到的位置的應用程序而言,這些方法很有用。身份驗證 Cookie 既可以臨時(shí)又可以永久(“持久”)。臨時(shí) Cookie 只在當前瀏覽器會(huì )話(huà)期間保持。當瀏覽器關(guān)閉時(shí),臨時(shí) Cookie 隨即丟失。永久 Cookie 則被瀏覽器保存,并在瀏覽器會(huì )話(huà)間回發(fā),直到被用戶(hù)顯式刪除。
![]()
|
窗體身份驗證使用的身份驗證 Cookie 由 System.Web.Security.FormsAuthenticationTicket 類(lèi)的線(xiàn)性版本組成。信息包括用戶(hù)名(但沒(méi)有密碼)、使用的窗體身份驗證版本、發(fā)出 Cookie 的日期以及可選的應用程序特定數據的字段。
通過(guò)使用 FormsAuthentication.SignOut 方法,應用程序代碼可以撤消或移除身份驗證 Cookie。這將移除身份驗證 Cookie,不論它是臨時(shí)的還是永久的。
還可以使用配置為基于窗體的身份驗證服務(wù)提供有效憑據的列表,如下例所示:
應用程序然后可以調用 FormsAuthentication.Authenticate 并提供用戶(hù)名和密碼,ASP.NET 將驗證憑據。根據 passwordFormat 屬性的下列值,憑據可以存儲在明文中,或者存儲為 SHA1 或 MD5:
| 哈希類(lèi)型 | 說(shuō)明 |
|---|---|
| Clear | 密碼存儲在明文中 |
| SHA1 | 密碼存儲為 SHA1 摘要 |
| MD5 | 密碼存儲為 MD5 摘要 |
聯(lián)系客服