基於表單的身分識別驗證
//登陸頁面
protected void Button1_Click(object sender, EventArgs e)
{
string username = "tsuser";
string userpwd = "resust";
string roles = "Adminstrator";
//產生驗證票據對象.
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
1,
username,
DateTime.Now, DateTime.Now.AddMinutes(1),
false,
roles);
//加密驗證票
string encrytedTicket = FormsAuthentication.Encrypt(authTicket);
//產生Cookie對象.
//FormsAuthentication.FormsCookieName取得WebConfig中<Authentication>
//配置節中Name的值作為Cookie的名字.
HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName,
encrytedTicket);
Response.Cookies.Add(authCookie);
//跳轉到使用者的初試請求頁.
string ddd = FormsAuthentication.GetRedirectUrl(username, false);
Response.Redirect( "WebForm1.aspx" );
//Server.Transfer("WebForm1.aspx");
}
//Global.asax中《加上using System.Security.Principal;命名空間》
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
//擷取使用者的角色。
string cookieName = FormsAuthentication.FormsCookieName;//從驗證票據擷取Cookie的名字。
//取得Cookie.
HttpCookie authCookie = Context.Request.Cookies[cookieName];
if (null == authCookie)
{
return;
}
FormsAuthenticationTicket authTicket = null;
//擷取驗證票據。
authTicket = FormsAuthentication.Decrypt(authCookie.Value);
if (null == authTicket)
{
return;
}
//驗證票據的UserData中存放的是使用者角色資訊。
//UserData本來存放使用者自訂資訊。此處用來存放使用者角色。
string[] roles = authTicket.UserData.Split(new char[] { ',' });
FormsIdentity id = new FormsIdentity(authTicket);
GenericPrincipal principal = new GenericPrincipal(id, roles);
//把產生的驗證票資訊和角色資訊賦給目前使用者.
Context.User = principal;
}
//不通過驗證直接進入首頁,會返回到default.aspx頁面*/
//也可以在新頁面中判斷
if ( !HttpContext.Current.User.IsInRole("Adminstrator") )
{
Response.Redirect("Default.aspx");
}
/*//web.config中添加
<authentication mode="Forms">
<forms name="MYWEBAPP.ASPXAUTH"
loginUrl="default.aspx"
protection="All"
path="/"/>
</authentication>
<!-- 設定對本地目錄的訪問。如果驗證票據未通過,則無法訪問
-->
<authorization>
<!-- Order and case are important below -->
<allow roles="Adminstrator"/>
<deny users="*"/>
</authorization>
基於表單的身分識別驗證是一項 ASP.NET 驗證服務,它使應用程式能夠提供自己的登入使用者介面並進行自己的憑據驗證。ASP.NET 對使用者進行身分識別驗證,將未經身分識別驗證的使用者重新導向到登入頁,並執行所有必要的 Cookie 管理。這種身分識別驗證是許多網站使用的流行方法。
應用程式必須配置為使用基於表單的身分識別驗證,方法是將 <authentication> 設定為 Forms,並拒絕匿名使用者存取。下面的樣本示範如何在所需應用程式的 Web.config 檔案中完成此操作:
<configuration><system.web><authentication mode="Forms"/><authorization><deny users="?" /></authorization></system.web></configuration>
管理員使用基於表單的身分識別驗證來配置要使用的 Cookie 的名稱、保護類型、用於登入頁的 URL、Cookie 有效時間長度,以及用於已發出的 Cookie 的路徑。下表顯示 <Forms> 元素的有效屬性,該元素是下面的樣本中顯示的 <authentication> 元素的子項目:
<authentication mode="Forms"><forms name=".ASPXCOOKIEDEMO" loginUrl="login.aspx" defaultUrl="default.aspx"protection="All" timeout="30" path="/" requireSSL="false"slidingExpiration="true" enableCrossAppRedirects="false"cookieless="UseDeviceProfile" domain=""><!-- protection="[All|None|Encryption|Validation]" --><!-- cookieless="[UseUri | UseCookies | AutoDetect | UseDeviceProfile]" --></forms></authentication>
屬性 |
說明 |
cookieless |
ASP.NET 2.0 Forms 身分識別驗證可以將 Forms 身分識別驗證票儲存在 Cookie 中也可以以無 Cookie 的表示形式儲存在 URL 上。UseDeviceProfile 的預設值表示 ASP.NET 根據預先計算得到的瀏覽器設定檔來確定儲存票證的位置。AutoDetect 選項使 ASP.NET 動態確定瀏覽器是否支援 Cookie。UseUri 和 UseCookies 分彆強制實施無 Cookie 票證和有 Cookie 票證。 |
defaultUrl |
指定在成功登入後,請求將重新導向到的預設 URL。在登入後進行重新導向時,如果重新導向 URL 對於 Forms 身分識別驗證不可用,則使用此值。 |
domain |
指定包含 Forms 身分識別驗證票的 HttpCookie 的 Domain 屬性的值。顯式設定此屬性可使應用程式共用同一個 Cookie,前提是這些應用程式共用某個 DNS 命名空間的一個公用部分(例如,如果 domain 屬性設定為“contoso.com”,則 appA.contoso.com 和 appB.contoso.com 可以共用一個 Cookie)。 |
enableCrossAppRedirects |
在 ASP.NET 2.0 中,Forms 身分識別驗證允許以查詢字串變數或表單 POST 變數的形式在應用程式之間傳遞 Forms 身分識別驗證票。將此屬性設定為 true 可使 FormsAuthenticationModule 能夠從查詢字串或表單 POST 變數提取票證。 |
loginUrl |
指定未經身分識別驗證的使用者的請求將被重新導向到的 URL。該 URL 可以在同一台電腦上或在遠端電腦上。如果是在遠端電腦上,則兩台電腦上 machineKey 配置元素中的 decryptionkey 和 validationKey 屬性都需要使用相同的值。 |
name |
用於身分識別驗證的 HTTP Cookie 的名稱。注意,如果多個應用程式需要在一台電腦上使用基於表單的驗證服務,並且每個應用程式都希望由應用程式隔離 Forms 身分識別驗證 Cookie,則每個應用程式都應配置一個唯一的 Cookie 值。為避免在 URL 中產生依賴項,在設定身分識別驗證 Cookie 時,ASP.NET 還使用“/”作為 Path 值,以便將這些 Cookie 發送回網站上的每個應用程式。 |
path |
用於發出的 Cookie 的路徑。預設值為“/”,以避免路徑中大小寫不匹配的造成的困難,因為在返回 Cookie 時,瀏覽器是嚴格區分大小寫。共用伺服器環境中的應用程式應使用此指令來維護專用 Cookie。(它們還可以使用 API 在運行時指定路徑來發出 Cookie。) |
protection |
用於保護 Cookie 資料的方法。有效值如下:
- All:同時使用資料驗證和加密來保護 Cookie。所配置的資料驗證演算法是基於 <machinekey> 元素的。如果密鑰足夠長(48 個字元),預設情況下將使用 AES 進行加密。All 是預設(和建議)值。
- None:用於僅將 Cookie 用於個人化並且安全性要求不高的網站。加密和驗證都可以被禁用。儘管以此方式使用 Cookie 需謹慎,但對於使用 .NET Framework 實現個人化的任何方法,此設定提供了最佳效能。
- Encryption:使用 AES、TripleDES 或 DES 加密 Cookie,但不對 Cookie 進行資料驗證。這類 Cookie 容易受到精心選擇的純文字的攻擊。
- Validation:不加密 Cookie 的內容,但驗證 Cookie 資料在傳輸過程中是否未被更改。若要建立 Cookie,驗證密鑰在緩衝區中與 Cookie 資料連線,並且計算出 MAC 並將其追加到輸出的 Cookie。
|
requireSSL |
如果設定為 true,則 Forms 身分識別驗證會設定 Forms 身分識別驗證 Cookie 的安全位元。相容的瀏覽器只將 Cookie 通過 SSL 串連發送回 ASP.NET。注意,如果使用無 Cookie Forms 身分識別驗證,則此設定無效。 |
slidingExpiration |
如果設定為 true,則 Forms 身分識別驗證將定期更新 Forms 身分識別驗證票的生存期。無論票證是包含在 Cookie 中,還是以無 Cookie 的格式包含在 URL 中,都會進行此操作。 |
timeout |
時間量(以整數分鐘為單位),經過該時間量之後,Cookie 則會到期。預設值是 30。逾時屬性是一個可調值,從收到上次請求的時間開始計算,它將在 n 分鐘後到期。為了避免對效能產生負面影響,也為了避免那些開啟了 Cookie 警告的應用程式產生多個瀏覽器警告,Cookie 在逾時時間過半時更新。(這意味著在某些情況下可能會出現精度損失。) |
配置了應用程式後,需要提供一個登入頁。下面的樣本示範一個簡單的登入頁。該樣本在運行時需要 Default.aspx 頁。未經身分識別驗證的請求被重新導向到登入頁 (Login.aspx),該頁顯示一個簡單表單,提示使用者輸入電子郵件地址和密碼。(使用 Username="someone@www.contoso.com" 和 Password="password" 作為憑據。)
驗證了憑據後,應用程式調用以下內容:
C# |
VB |
|
FormsAuthentication.RedirectFromLoginPage(UserEmail.Value, PersistCookie.Checked); FormsAuthentication.RedirectFromLoginPage(UserEmail.Value, PersistCookie.Checked) |
這將使用者重新導向回最初請求的 URL。不想執行重新導向的應用程式既可以調用 FormsAuthentication.GetAuthCookie 來檢索 Cookie 值,也可以調用 FormsAuthentication.SetAuthCookie 將正確加密的 Cookie 附加到輸出的響應中。對於提供嵌入在包含頁中的登入使用者介面的應用程式,或者想要更多地控制使用者被重新導向到的位置的應用程式而言,這些方法很有用。
身分識別驗證 Cookie 既可以是臨時的,也可以是永久(“持久”)的。臨時 Cookie 只在當前瀏覽器會話期間保持。當瀏覽器關閉時,Cookie 即會丟失。永久 Cookie 由瀏覽器儲存,並在瀏覽器各會話期間發回,除非使用者顯式刪除 Cookie 或 Cookie 的生存期結束。臨時 Cookie 和永久 Cookie 的 Cookie 生存期由 timeout
配置屬性確定。這一點在行為上與 ASP.NET 的早期版本相比稍有更改,在早期版本中永久 Cookie 的生存期為 50 年。在 ASP.NET 2.0 中,臨時 Cookie 和永久 Cookie 的到期日期設定為目前時間加上 timeout
配置屬性的值。
C# Forms-Based/Cookie Authentication
Forms 身分識別驗證所使用的身分識別驗證 Cookie 由 System.Web.Security.FormsAuthenticationTicket 類的序列化版本組成。資訊包括使用者名稱(但沒有密碼)、使用的 Forms 身分識別驗證版本、發出 Cookie 的日期以及可選的應用程式特定資料的欄位。
通過使用 FormsAuthentication.SignOut 方法,應用程式代碼可以撤消或移除身分識別驗證 Cookie。這將移除身分識別驗證 Cookie,不論它是臨時的還是永久的。
還可以使用配置為基於表單的驗證服務提供有效憑據的列表,如下例所示:
<authentication><credentials passwordFormat="SHA1" ><user name="Mary" password="94F85995C7492EEC546C321821AA4BECA9A3E2B1"/><user name="John" password="5753A498F025464D72E088A9D5D6E872592D5F91"/></credentials></authentication>
還可以通過使用 FormsAuthentication.HashPasswordForStoringInConfigFile(String password, String passwordFormat)
API 產生密碼的雜湊表示形式。此方法支援使用 SHA1 或 MD5 產生雜湊值。然後,應用程式可以調用 FormsAuthentication.Authenticate 並提供使用者名稱和密碼,ASP.NET 將驗證憑據。根據 passwordFormat 屬性的下列值,憑據可以儲存在明文中,也可以儲存為 SHA1 或 MD5:
Hash 類型 |
說明 |
Clear |
密碼以明文形式儲存 |
SHA1 |
密碼儲存為 SHA1 摘要 |
MD5 |
密碼儲存為 MD5 摘要 |