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