當(dāng)某個(gè)用戶驗(yàn)證通過(guò)后,Forms Authentication Cookies會(huì)被Forms Authentication類在內(nèi)部自動(dòng)創(chuàng)建。創(chuàng)建的就是一個(gè)FormsAuthenticationTicket類。創(chuàng)建此類的代碼如下: FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, "userName", DateTime.Now, DateTime.Now.AddMinutes(30), // value of time out property false, // Value of IsPersistent property String.Empty, FormsAuthentication.FormsCookiePath); 然后如果在web.config文件中,forms元素的protection屬性被設(shè)置成ALL 或者Encryption,將對(duì)ticket對(duì)象進(jìn)行加密并且創(chuàng)建簽名。加密代碼如下: string encryptedTicket = FormsAuthentication.Encrypt(ticket); 下面將簡(jiǎn)要介紹一下當(dāng)protection屬性被設(shè)置為true時(shí)的流程:
每當(dāng)authentication收到一個(gè)請(qǐng)求,FormsAuthenticationModule從客戶端Cookie獲得一個(gè)authentication ticket,然后解碼,計(jì)算哈希值比對(duì)MAC值,這樣就確認(rèn)了cookie沒(méi)有被人為偽造。最后驗(yàn)證ticket包含的過(guò)期時(shí)間。 注 ASP.NET 并不依賴于 Cookie 的到期日期,因?yàn)樵摃r(shí)間很容易偽造。
?角色授權(quán)(Role Authorization)
在 ASP.NET 2.0 中,角色授權(quán)已經(jīng)得到簡(jiǎn)化。對(duì)用戶進(jìn)行身份驗(yàn)證或者將角色細(xì)節(jié)添加到身份驗(yàn)證 Cookie 時(shí),不再需要檢索角色信息。.NET Framework 2.0 包括一個(gè)角色管理 API,它使您能夠創(chuàng)建和刪除角色,將用戶添加到角色以及從角色刪除用戶。該角色管理 API 將其數(shù)據(jù)存儲(chǔ)在一個(gè)基礎(chǔ)數(shù)據(jù)存儲(chǔ)中,它通過(guò)針對(duì)該數(shù)據(jù)存儲(chǔ)的適當(dāng)角色提供程序訪問(wèn)該存儲(chǔ)。以下角色提供程序?yàn)?.NET Framework 2.0 附帶,可以與窗體身份驗(yàn)證一起使用: ? SQL Server。它是默認(rèn)的提供程序,將角色信息存儲(chǔ)在 SQL Server 數(shù)據(jù)庫(kù)。 ? 授權(quán)管理器 (AzMan)。該提供程序使用 XML 文件、Active Directory 或 Active Directory 應(yīng)用程序模式 (ADAM) 中的一個(gè) AzMan 策略存儲(chǔ)作為其角色存儲(chǔ)。它通常用于 Intranet 或 Extranet 方案中,其中 Windows 身份驗(yàn)證和 Active Directory 用于進(jìn)行身份驗(yàn)證。 How To: Use Role Manager in ASP.NET 2.0.?
MemberShip和LoginControl(成員身份和登錄控件) ASP.NET 2.0 引入了MemberShip功能和一組登錄 Web 服務(wù)器控件,它們簡(jiǎn)化了使用窗體身份驗(yàn)證的應(yīng)用程序的實(shí)現(xiàn)。
MemberShip為應(yīng)用程序用戶提供憑據(jù)存儲(chǔ)和管理。它還提供一個(gè)MemberShip API,可以在使用窗體身份驗(yàn)證時(shí)簡(jiǎn)化用戶憑據(jù)的驗(yàn)證任務(wù)。該MemberShip功能構(gòu)建于提供程序模型之上。該模型允許實(shí)現(xiàn)和配置指向不同用戶存儲(chǔ)的不同提供程序。ASP.NET 2.0 包括以下成員關(guān)系提供程序: ? Active Directory membership provider。該提供程序使用 Active Directory 或 Active Directory 應(yīng)用程序模式 (ADAM) 用戶存儲(chǔ)。 ? SQL Server membership provider。該提供程序使用 SQL Server 用戶存儲(chǔ)。 還可以添加對(duì)自定義用戶存儲(chǔ)的支持。例如,可以添加對(duì)其他輕量級(jí)目錄訪問(wèn)協(xié)議 (LDAP) 目錄或其他現(xiàn)有公共標(biāo)識(shí)存儲(chǔ)的支持。為此,創(chuàng)建一個(gè)從 MembershipProvider 抽象基類繼承的自定義提供程序。 ASP.NET 登錄控件自動(dòng)使用MemberShip和窗體身份驗(yàn)證,并封裝提示用戶輸入憑據(jù),驗(yàn)證用戶,恢復(fù)或替換密碼等所需的邏輯。實(shí)際上,ASP.NET 登錄控件在窗體身份驗(yàn)證和MemberShip上提供一個(gè)抽象層,并且取代了您使用窗體身份驗(yàn)證時(shí)通常必須進(jìn)行的大多數(shù)或全部工作。 有關(guān)使用MemberShip功能和登錄控件的詳細(xì)信息,請(qǐng)參閱 How To: Use Membership in ASP.NET 2.0.?
Web Farm Scenarios(Web 場(chǎng)方案) 在 Web 場(chǎng)中,無(wú)法確保哪個(gè)服務(wù)器將處理連續(xù)請(qǐng)求。如果用戶在一臺(tái)服務(wù)器上經(jīng)過(guò)身份驗(yàn)證,但下一個(gè)請(qǐng)求在另一臺(tái)服務(wù)器上進(jìn)行,則身份驗(yàn)證票將導(dǎo)致驗(yàn)證失敗并請(qǐng)求用戶重新進(jìn)行身份驗(yàn)證。
machineKey 元素中的 validationKey 和 decryptionKey 屬性用于對(duì)窗體身份驗(yàn)證票進(jìn)行哈希操作和加密。這些屬性的默認(rèn)值為 AutoGenerate.IsolateApps。這些密鑰是針對(duì)每個(gè)應(yīng)用程序自動(dòng)生成的,在每臺(tái)服務(wù)器上都不同。因此,在一臺(tái)計(jì)算機(jī)上加密的身份驗(yàn)證票無(wú)法在 Web 場(chǎng)中的另一臺(tái)計(jì)算機(jī)或者同一臺(tái) Web 服務(wù)器上的另一個(gè)應(yīng)用程序中進(jìn)行解密和驗(yàn)證。 為了解決該問(wèn)題, Web 場(chǎng)中所有計(jì)算機(jī)上的 validationKey 和 decryptionKey 值都必須相同。 有關(guān)配置 machineKey 元素的詳細(xì)信息,請(qǐng)參閱 How To: Configure MachineKey in ASP.NET 2.0 本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/lemonnight/archive/2008/08/28/2844283.aspx