ASP.NET 應用程式的安全性模型
本單元內(nèi)容
功能 ASP.NET 應(yīng)用程式依賴於許多不同元素及技術(shù)的成功交互操作。每個(gè)方案元件都提供安全性功能,以滿足其自身的需求。然而,純粹從個(gè)別元件的角度考量安全性還不夠。若要提供整體方案的安全性,您還必須考量元件如何彼此互動。
本單元介紹 .NET Web 應(yīng)用程式架構(gòu)及安全性,提供本手冊其他單元補(bǔ)充的參考框架。並提供涵蓋典型 .NET Web 應(yīng)用程式各層的安全性功能和服務(wù)的概觀。它還介紹了 .NET Framework 安全性,並說明哪些元素對於 ASP.NET Web 應(yīng)用程式開發(fā)人員最為重要。
回到頁首目標(biāo)
透過此單元即可:
| ? | 瞭解 .NET Web 應(yīng)用程式架構(gòu)的主要技術(shù),以及邏輯及實(shí)體應(yīng)用程式層的概念。 | 
| ? | 瞭解用於建置 .NET Web 應(yīng)用程式的每項(xiàng)實(shí)作技術(shù)提供了哪些安全性功能,以及這些功能如何一同運(yùn)作。 | 
| ? | 開始瞭解 .NET Framework 安全性功能,並瞭解哪些元素對於 Web 應(yīng)用程式安全性最為重要。 | 
| ? | 比較對照用於 Web 應(yīng)用程式的授權(quán)及驗(yàn)證機(jī)制。 | 
| ? | 瞭解 .NET Web 應(yīng)用程式如何使用原則及身分識別物件。 | 
| ? | 識別應(yīng)用程式中可以用來強(qiáng)制信任界限的 Gatekeeper 及閘道。 | 
適用於
本單元適用於下列產(chǎn)品及技術(shù):
| ? | Windows XP 或 Windows 2000 Server 及更新的作業(yè)系統(tǒng) | 
| ? | Internet Information Services (IIS) | 
| ? | .NET Framework 1.0 版及更新版本 | 
如何使用本單元
若要充分瞭解此單元:
| ? | 您必須具有開發(fā) ASP.NET Web 應(yīng)用程式的經(jīng)驗(yàn)。這可以協(xié)助您瞭解單元中所討論的各種安全性元素在何處與應(yīng)用程式整合。 | 
| ? | 請閱讀第 1 單元<簡介>。其在強(qiáng)調(diào)驗(yàn)證、授權(quán)及安全通訊對於建立安全分散式 Web 應(yīng)用程式的重要性。同時(shí)也指出開發(fā)安全 Web 應(yīng)用程式時(shí)應(yīng)採用的主要原則及實(shí)務(wù)。 | 
.NET Web 應(yīng)用程式
本節(jié)簡短介紹 .NET Web 應(yīng)用程式,並從邏輯和實(shí)體觀點(diǎn)說明它的特性。此外,還介紹各種用來建置 .NET Web 應(yīng)用程式的實(shí)作技術(shù)。
邏輯層
邏輯應(yīng)用程式架構(gòu)把任何系統(tǒng)均視為由下列各層組成的合作服務(wù)集合:
| ? | 使用者服務(wù) | 
| ? | 商業(yè)服務(wù) | 
| ? | 資料服務(wù) | 
邏輯架構(gòu)觀點(diǎn)的價(jià)值在於識別任何系統(tǒng)一般固定的服務(wù)類型、提供適當(dāng)?shù)姆侄?#xff0c;以及定義層與層之間的介面。分段能讓您在實(shí)作各層時(shí)製作更周密的架構(gòu)和設(shè)計(jì)選項(xiàng),並建置更好維護(hù)的應(yīng)用程式。
各層介紹如下:
| ? | 「使用者服務(wù)」負(fù)責(zé)用戶端與系統(tǒng)的互動,並提供連接到由「商業(yè)服務(wù)」層元件所封裝的核心商務(wù)邏輯的共通橋樑。以往「使用者服務(wù)」經(jīng)常與互動式使用者有關(guān)聯(lián)。但也會初始處理其他系統(tǒng)的程式設(shè)計(jì)要求 (不涉及可見的使用者介面)。驗(yàn)證及授權(quán) (其精確的本質(zhì),取決於用戶端類型),通常在「使用者服務(wù)」層中執(zhí)行。 | 
| ? | 「商業(yè)服務(wù)」提供系統(tǒng)核心功能,並會封裝商務(wù)邏輯。這些服務(wù)與傳送通道和後端系統(tǒng)或資料來源互不相關(guān)。因此其所提供的穩(wěn)定性和彈性,得以讓系統(tǒng)支援其他的新通道和後端系統(tǒng)。服務(wù)特定商業(yè)要求時(shí),通常需要「商業(yè)服務(wù)」層中的許多合作元件。 | 
| ? | 「資料服務(wù)」可透過一般介面存取資料 (裝載於系統(tǒng)界限內(nèi)) 和其他 (後端) 系統(tǒng),這種方式便於由「商業(yè)服務(wù)」層中的元件使用?!纲Y料服務(wù)」會摘要出大多數(shù)的後端系統(tǒng)和資料來源,並且將特定的存取規(guī)則和資料格式封裝起來。 | 
系統(tǒng)服務(wù)類型的邏輯分類可能與實(shí)作服務(wù)元件的實(shí)體分佈相互關(guān)聯(lián),但是彼此之間則相互獨(dú)立。
請記得您可以在任何彙總層級中識別邏輯層,亦即可以識別出整個(gè)系統(tǒng) (在其環(huán)境和與外部互動的內(nèi)容中) 或內(nèi)含的任何子系統(tǒng)中的各層,這點(diǎn)十分重要。例如,每個(gè)裝載 Web 服務(wù)的遠(yuǎn)端節(jié)點(diǎn)都包含「使用者服務(wù)」(處理傳入要求和訊息)、「商業(yè)服務(wù)」和「資料服務(wù)」。
實(shí)體部署模型
前述三個(gè)邏輯服務(wù)層,並不代表特定數(shù)目的實(shí)體層。這三個(gè)邏輯服務(wù)實(shí)際上可能都在同一臺電腦上,但也可能分散在多臺電腦上。
網(wǎng)頁伺服器作為應(yīng)用程式伺服器
.NET Web 應(yīng)用程式的一般部署模式是將商業(yè)和資料存取元件放在網(wǎng)頁伺服器上。這能減少網(wǎng)路躍點(diǎn),以提高效能。圖 2.1 顯示這個(gè)模型。
圖 2.1
網(wǎng)頁伺服器作為應(yīng)用程式伺服器
遠(yuǎn)端應(yīng)用程式層
遠(yuǎn)端應(yīng)用程式層為一般部署模式,尤其是對 Web 層能在周邊網(wǎng)路 (又稱為 DMZ、非軍事區(qū)域和過濾子網(wǎng)路) 中獨(dú)立運(yùn)作的網(wǎng)際網(wǎng)路案例而言,它使用封包篩選防火牆來與使用者和遠(yuǎn)端應(yīng)用程式層分隔開。圖 2.2 顯示遠(yuǎn)端應(yīng)用程式層。
圖 2.2
遠(yuǎn)端應(yīng)用程式層簡介
實(shí)作技術(shù)
.NET Web 應(yīng)用程式通常使用下列技術(shù),實(shí)作一或多個(gè)邏輯服務(wù):
| ? | ASP.NET | 
| ? | Enterprise Services | 
| ? | Web 服務(wù) | 
| ? | .NET 遠(yuǎn)端處理 | 
| ? | ADO.NET 及 Microsoft? SQL Server? 2000 | 
| ? | 網(wǎng)際網(wǎng)路通訊協(xié)定安全性 (IPSec) | 
| ? | 安全通訊端層 (SSL) | 
安全性架構(gòu)
圖 2.3 顯示遠(yuǎn)端應(yīng)用程式層模型,以及前述各種技術(shù)所提供的安全性服務(wù)集合。驗(yàn)證及授權(quán)會發(fā)生在各層的許多個(gè)別點(diǎn)上。這些服務(wù)主要是由 Internet Information Services (IIS)、ASP.NET、Enterprise Services 和 SQL Server 提供的。安全通訊通道也可套用到各層,並從用戶端瀏覽器或裝置一直伸展到資料庫。結(jié)合「安全通訊端層 (SSL)」或 IPSec 以確保通道的安全。
圖 2.3
安全性架構(gòu)
各層間的安全性
表 2.1 摘要出前述技術(shù)所提供的驗(yàn)證、授權(quán)和安全通訊功能。
表 2.1:安全性功能
| 技術(shù) | 驗(yàn)證 | 授權(quán) | 安全通訊 | 
| IIS | 匿名 | IP/DNS 位址 | SSL | 
| ASP.NET | 無 (自訂) | 檔案授權(quán) | ? | 
| Web 服務(wù) | Windows | 檔案授權(quán) | SSL 及訊息 | 
| 遠(yuǎn)端處理 | Windows | 檔案授權(quán) | SSL 及訊息 | 
| Enterprise Services | Windows | Enterprise Services  | 遠(yuǎn)端程序 | 
| SQL Server 2000 | Windows  | 伺服器登入 | SSL | 
| Windows 2000 | Kerberos | Windows ACL | IPSec | 
驗(yàn)證
Windows 2000 上的 .NET Framework 提供下列驗(yàn)證選項(xiàng):
| ? | ASP.NET 驗(yàn)證模式 | 
| ? | Enterprise Services 驗(yàn)證 | 
| ? | SQL Server 驗(yàn)證 | 
ASP.NET 驗(yàn)證模式
ASP.NET 驗(yàn)證模式包含 Windows、「表單」、Passport 和「無」。
| ? | Windows 驗(yàn)證。在這種驗(yàn)證模式中的 ASP.NET 依靠 IIS 來驗(yàn)證使用者,並建立 Windows 存取語彙基元來代表驗(yàn)證的身分識別。IIS 提供下列驗(yàn)證機(jī)制: 
 | ||||||||||
| ? | Passport 驗(yàn)證。在這種驗(yàn)證模式中的 ASP.NET 會使用 Microsoft Passport 的中央驗(yàn)證服務(wù)。ASP.NET 提供了由 Microsoft Passport「軟體開發(fā)套件 (SDK)」帶來的方便包裝函式,它必須安裝在網(wǎng)頁伺服器上。 | ||||||||||
| ? | 表單驗(yàn)證。這種方法以用戶端重新導(dǎo)向的方式,將未經(jīng)驗(yàn)證的使用者轉(zhuǎn)移到指定的 HTML 表單,讓使用者輸入自己的憑證 (通常是使用者名稱和密碼)。這些憑證經(jīng)過驗(yàn)證後會產(chǎn)生驗(yàn)證票證,再傳回用戶端。驗(yàn)證票證包含使用者的身分識別,並選擇性地包含使用者在工作階段期間所扮演的各種角色的清單。 注意:「表單」驗(yàn)證以純文字格式將使用者名稱和密碼傳送到網(wǎng)頁伺服器。因此在使用「表單」驗(yàn)證時(shí),應(yīng)該搭配由 SSL 確保安全的通道。為了繼續(xù)保護(hù)後續(xù)要求所傳輸?shù)尿?yàn)證 Cookie,您應(yīng)考慮在應(yīng)用程式的所有網(wǎng)頁 (不僅是登入網(wǎng)頁) 上使用 SSL。 | ||||||||||
| ? | 無?!笩o」表示不想驗(yàn)證使用者或正在使用自訂的驗(yàn)證通訊協(xié)定。 | 
其他資訊
若需 ASP.NET 驗(yàn)證的相關(guān)資訊,請參閱第 8 單元<ASP.NET 安全性>。
Enterprise Services 驗(yàn)證
Enterprise Services 驗(yàn)證是使用「遠(yuǎn)端程序呼叫 (RPC)」傳輸基礎(chǔ)結(jié)構(gòu)執(zhí)行的,然後 RPC 再使用作業(yè)系統(tǒng)的「安全性支援提供者介面 (SSPI)」。Enterprise Services 應(yīng)用程式的用戶端可以用 Kerberos 或 NTLM 來驗(yàn)證。
服務(wù)元件可以裝載於「程式庫」應(yīng)用程式或「伺服器」應(yīng)用程式中?!赋淌綆臁箲?yīng)用程式裝載於用戶端處理序中,因此它會使用用戶端的身分識別。「伺服器」應(yīng)用程式則是以自己的身分識別,在個(gè)別的伺服器處理序中執(zhí)行。若需身分識別的相關(guān)資訊,請參閱本單元稍後的<身分識別和主體>。
您可以在下列等級驗(yàn)證對服務(wù)元件的傳入呼叫:
| ? | 預(yù)設(shè):使用安全性封裝的預(yù)設(shè)驗(yàn)證等級。 | 
| ? | 無:不驗(yàn)證。 | 
| ? | 連接:唯有連接時(shí)才驗(yàn)證。 | 
| ? | 呼叫:每個(gè)遠(yuǎn)端程序呼叫開始時(shí)驗(yàn)證。 | 
| ? | 封包:驗(yàn)證是否收到所有呼叫資料。 | 
| ? | 封包完整性:驗(yàn)證傳輸時(shí)是否有資料被修改。 | 
| ? | 封包私密性:驗(yàn)證和加密封包,其中包括資料和傳送者的身分識別與簽章。 | 
其他資訊
若需 Enterprise Services 驗(yàn)證的相關(guān)資訊,請參閱第 9 單元<Enterprise Services 安全性>。
SQL Server 驗(yàn)證
SQL Server 能使用 Windows 驗(yàn)證 (NTLM 或 Kerberos),或使用內(nèi)建的驗(yàn)證配置 (稱為 SQL 驗(yàn)證) 來驗(yàn)證使用者。下列是可供使用的選項(xiàng):
| ? | SQL Server 和 Windows。用戶端可以使用 SQL Server 驗(yàn)證或 Windows 驗(yàn)證,連接到 Microsoft SQL Server 的執(zhí)行個(gè)體。這有時(shí)稱作混合模式驗(yàn)證。 | 
| ? | 僅 Windows。使用者必須使用 Windows 驗(yàn)證,連接到 Microsoft SQL Server 的執(zhí)行個(gè)體。 | 
其他資訊
第 12 章<資料存取安全性>會討論每種方法的相對優(yōu)點(diǎn)。
授權(quán)
Windows 2000 上的 .NET Framework 提供下列授權(quán)選項(xiàng):
| ? | ASP.NET 授權(quán)選項(xiàng) | 
| ? | Enterprise Services 授權(quán) | 
| ? | SQL Server 授權(quán) | 
ASP.NET 授權(quán)選項(xiàng)
ASP.NET 授權(quán)選項(xiàng)可用於 ASP.NET Web 應(yīng)用程式、Web 服務(wù)和遠(yuǎn)端元件。ASP.NET 提供下列授權(quán)選項(xiàng):
| ? | URL 授權(quán)。這是在電腦和應(yīng)用程式設(shè)定檔中設(shè)定的授權(quán)機(jī)制?!窾RL 授權(quán)」讓您能限制存取應(yīng)用程式 Uniform Resource Identifier (URI) 名稱空間中特定的檔案和資料夾。例如,您可以針對指定的使用者選擇拒絕或允許存取特定的檔案或資料夾 (使用 URL 指定)。您也可以根據(jù)使用者的角色成員和用來發(fā)出要求的 HTTP 動作類型 (GET 和 POST 等) 來限制存取。 | 
| ? | 檔案授權(quán)。檔案授權(quán)只能在使用一種 IIS 提供的 Windows 驗(yàn)證機(jī)制來驗(yàn)證呼叫者,且 ASP.NET 設(shè)定為使用 Windows 驗(yàn)證時(shí)套用。 | 
| ? | 主體使用權(quán)限需求。主體使用權(quán)限需求可作為 (宣告式或程式設(shè)計(jì)式) 另一種精密的存取控制機(jī)制。這種授權(quán)方式讓您能根據(jù)個(gè)別使用者的身份識別和群組成員資格,來控制存取類別、方法或個(gè)別程式碼區(qū)塊。 | 
| ? | .NET 角色。.NET 角色用來將應(yīng)用程式中具有相同使用權(quán)限的使用者分到一組。其在概念上類似於先前的角色實(shí)作,例如 Windows 群組和 COM+ 角色。但 .NET 角色不需要已驗(yàn)證的 Windows 身分識別,且可以與「表單」驗(yàn)證等票證式驗(yàn)證配置搭配使用,這點(diǎn)與前面的方法不同。 | 
其他資訊
若需 ASP.NET 授權(quán)的相關(guān)資訊,請參閱第 8 單元<ASP.NET 安全性>。
Enterprise Services 授權(quán)
存取保存在 Enterprise Services 應(yīng)用程式服務(wù)元件中的功能是由 Enterprise Services 角色成員控制的。它不同於 .NET 角色,而且可包含 Windows 群組或使用者帳戶。角色成員在 COM+ 資料目錄中定義並使用「元件服務(wù)」工具進(jìn)行管理。
其他資訊
若需 Enterprise Services 授權(quán)的相關(guān)資訊,請參閱第 9 單元<Enterprise Services 安全性>。
SQL Server 授權(quán)
SQL Server 允許使用能套用到個(gè)別資料庫物件的精密權(quán)限。使用權(quán)限可能基於角色成員 (SQL Server 提供固定資料庫角色、使用者定義的角色和應(yīng)用程式角色),也可以授與個(gè)別的 Windows 使用者或群組帳戶。
其他資訊
若需 SQL Server 授權(quán)的相關(guān)資訊,請參閱第 12 單元<資料存取安全性>。
Gatekeeper 和閘道
接下來,本手冊使用術(shù)語 Gatekeeper 來表示負(fù)責(zé)管制「閘道」的技術(shù)。閘道代表應(yīng)用程式中的存取控制點(diǎn) (用以保護(hù)資源)。例如,資源可能是一種作業(yè) (以作用在物件上的方法來表示)、資料庫或檔案系統(tǒng)資源。
前面列出的每種核心技術(shù),都提供存取授權(quán)的 Gatekeeper。要求必須先通過一系列閘道,才能存取所要求的資源或作業(yè)。下面介紹要求必須通過的閘道:
| ? | IIS 會在您驗(yàn)證使用者 (亦即停用「匿名」驗(yàn)證) 時(shí)提供閘道。IIS Web 使用權(quán)限可作為一種存取控制機(jī)制,來限制 Web 使用者存取特定檔案和資料夾的能力。Web 使用權(quán)限可套用到所有 Web 使用者 (而非個(gè)別使用者或群組),這點(diǎn)不同於 NTFS 檔案使用權(quán)限。NTFS 檔案使用權(quán)限還可進(jìn)一步限制網(wǎng)頁和影像檔等 Web 資源。這些限制可以套用到個(gè)別使用者或群組。 | 
| ? | ASP.NET 提供各種可設(shè)定的程式設(shè)計(jì)閘道。其中包括「URL 授權(quán)」、「檔案授權(quán)」、「主體使用權(quán)限」需求和「.NET 角色」。 | 
| ? | Enterprise Services Gatekeeper 使用 Enterprise Services 角色,來授權(quán)存取商業(yè)功能。 | 
| ? | SQL Server 2000 包含一系列閘道,其中包括伺服器登入、資料庫登入和資料庫物件使用權(quán)限。 | 
| ? | Windows 2000 提供的閘道使用附加到安全資源的 ACL。 | 
底線是 Gatekeeper 根據(jù)呼叫閘道,並試圖存取特定資源的使用者或服務(wù)的身分識別來授權(quán)。多重閘道的價(jià)值在於用多條防護(hù)線來提供深層的安全。表 2.2 摘要出 Gatekeeper 集合,並指出每個(gè) Gatekeeper 所負(fù)責(zé)的閘道。
表 2.2:Gatekeeper 的責(zé)任和其提供的閘道
| Gatekeeper | 閘道 | 
| Windows 作業(yè)系統(tǒng) | 登入權(quán)限 (肯定和否定,例如「拒絕本機(jī)登入」) | 
| IIS | 驗(yàn)證 (匿名、基本、摘要、整合式及憑證) | 
| ASP.NET | URL 授權(quán) | 
| Enterprise Services | Windows (NTLM / Kerberos) 驗(yàn)證 | 
| Web 服務(wù) | 使用 IIS 和 ASP.NET 提供的閘道 | 
| 遠(yuǎn)端處理 | 使用主機(jī)提供的閘道。如果在 ASP.NET 中裝載, | 
| ADO.NET | 連接字串。憑證可能非常明確,或者您可使用 | 
| SQL Server | 伺服器登入 | 
藉由在應(yīng)用程式的各層間使用各種閘道,您可以篩選出允許存取後端資源的使用者。當(dāng)要求經(jīng)由應(yīng)用程式進(jìn)行到後端資源時(shí),一連串愈來愈細(xì)的閘道會縮小存取的範(fàn)圍。
圖 2.4 顯示使用 IIS 的網(wǎng)際網(wǎng)路架構(gòu)應(yīng)用程式範(fàn)例。
圖 2.4
使用 Gatekeeper 篩選使用者
圖 2.4 說明下列幾點(diǎn):
| ? | 您可以停用 IIS 中的「匿名」驗(yàn)證。因此只能存取 IIS 能夠驗(yàn)證的帳戶。這可能將潛在的使用者人數(shù)減少到 10,000。 | 
| ? | 接著,您可在 ASP.NET 中使用「URL 授權(quán)」,這可能將使用者人數(shù)減少到 1,000。 | 
| ? | 檔案授權(quán)可能進(jìn)一步將存取人數(shù)減少到 100 個(gè)使用者。 | 
| ? | 最後,Web 應(yīng)用程式碼可能會根據(jù)特定的角色成員,只允許 10 位使用者存取您設(shè)限的資源。 | 
.NET Framework 安全性簡介
.NET Framework 安全性位於 Windows 安全性的頂層;它不會以任何方式被取代,但會提供其他安全性功能。您 .NET 應(yīng)用程式執(zhí)行的所有資源存取是否成功,最終由作業(yè)系統(tǒng)安全性決定。
例如,如果 ASP.NET Web 應(yīng)用程式嘗試開啟一個(gè)檔案,則存取嘗試取決於檔案相關(guān)的 Windows ACL。資源存取使用的身分識別是 ASP.NET 應(yīng)用程式的處理序身分識別。如果應(yīng)用程式目前正在模擬,則是模擬的身分識別。
程式碼存取安全性
.NET Framework 提供另一種稱為「程式碼存取安全性 (CAS)」的安全性機(jī)制。慣用安全性 (如 Windows 提供的) 是主體導(dǎo)向的,且授權(quán)決策取決於驗(yàn)證主體的身分識別,例如,執(zhí)行程式碼的使用者,或登入 Web 應(yīng)用程式的使用者。
CAS 藉依據(jù)程式碼的識別身分 (而不是執(zhí)行程式碼的使用者) 來支援授權(quán)決策的方式 ,擴(kuò)展了安全性的能力。這對透過 Internet Explorer 從網(wǎng)際網(wǎng)路下載的控制項(xiàng)及應(yīng)用程式等行動程式碼尤為重要。這是因?yàn)楫?dāng)您也會以系統(tǒng)管理員身分登入電腦,所以是否也希望這類程式碼同樣具有系統(tǒng)管理員權(quán)限?但一考慮到電腦的整合性及安全性,其答案很可能是否定的。
證據(jù)及安全性原則
程式碼的驗(yàn)證及其身分識別都由稱為證據(jù)的程式碼屬性決定。證據(jù)可以包括組件的公開金鑰 (它是其強(qiáng)式名稱的一部份)、下載 URL、安裝的應(yīng)用程式目錄等。一旦建立了程式碼身分識別,收集的證據(jù)就會透過安全性原則傳送,該原則最終管理程式碼的功能及其存取安全資源的權(quán)限。
預(yù)設(shè)原則確保本機(jī)電腦上安裝的所有程式碼都完全可以信任,並可讓其不受限制的存取安全資源。因此,一切資源存取都僅取決於作業(yè)系統(tǒng)的安全性。本機(jī)電腦上安裝的程式碼是完全受信任的,因?yàn)橄到y(tǒng)管理員需要明確的決策來首先安裝軟體。
CAS 及 ASP.NET Web 應(yīng)用程式
ASP.NET Web 應(yīng)用程式安裝在本機(jī)網(wǎng)頁伺服器上,因此預(yù)設(shè)原則在伺服器上完全信任 Web 應(yīng)用程式。對於伺服器端 Web 應(yīng)用程式開發(fā)人員來說,這意味著 CAS 的用途有限。實(shí)際上,在 .NET Framework 1 版上建置的 ASP.NET Web 應(yīng)用程式必須作為完全受信任的應(yīng)用程式執(zhí)行。
注意:.NET Framework 1.1 版新增了對部份信任之 Web 應(yīng)用程式的支援,這有效地啟用了伺服器端 Web 應(yīng)用程式的 CAS。它的主要優(yōu)點(diǎn)是:使應(yīng)用程式彼此隔離,以及從重要系統(tǒng)資源分離應(yīng)用程式變得更容易;著重於不同組織開發(fā)之多個(gè) Web 應(yīng)用程式的「網(wǎng)際網(wǎng)路服務(wù)提供者 (ISP)」及「應(yīng)用程式服務(wù)提供者 (ASP)」。
主體及身分識別
CAS 是以程式碼為中心的,而 .NET Framework 安全性的其他部份是以主體為中心的。.NET Framework 安全性以主體為中心的部份是 ASP.NET 應(yīng)用程式安全性的核心。
Windows 安全性以使用者為中心的概念,是基於登入工作階段所提供的安全性內(nèi)容,而 .NET 安全性則是基於主體及身分識別物件。
在傳統(tǒng)的 Windows 程式設(shè)計(jì)時(shí),如果您想知道目前執(zhí)行程式碼的安全性內(nèi)容,要參考處理序擁有者或目前執(zhí)行緒的身分識別。在設(shè)計(jì) .NET 程式時(shí),如果您想查詢目前使用者的安全性內(nèi)容,請擷取與目前執(zhí)行緒相關(guān),且透過 Thread.CurrentPrincipal 存取的目前主體物件。
.NET Framework 使用主體物件,主體物件包含執(zhí)行 .NET 程式碼時(shí)用來代表使用者的身分識別物件,並共同提供 .NET 角色式授權(quán)的骨幹。若為 ASP.NET Web 應(yīng)用程式,驗(yàn)證的使用者由附加到目前執(zhí)行緒及 Web 要求的主體及身分識別物件代表。
IPrincipal 及 IIdentity 介面
身分識別和主體物件必須分別實(shí)作 IIdentity 和 IPrincipal 介面。這些介面是在 System.Security.Principal 名稱空間中定義的。一般介面允許 .NET Framework 以各式各樣的方式來處理身分識別和主體物件,而不論其基礎(chǔ)實(shí)作的詳細(xì)情況為何。
IPrincipal 介面允許您用 IsInRole 方法測試角色成員,並可存取相關(guān)的 IIdentity 物件。
public interface IPrincipal {bool IsInRole( string role );IIdentity Identity {get;} }IIdentity 介面提供其他的驗(yàn)證細(xì)節(jié),例如名稱和驗(yàn)證類型。
public interface IIdentity {string authenticationType {get;}bool IsAuthenticated {get;}string Name {get;} }.NET Framework 提供了許多 IPrincipal 和 IIdentity 的具體實(shí)作,如圖 2.5 所示,並在下面幾節(jié)中說明。
圖 2.5
IPrincipal 和 IIdentity 實(shí)作類別
WindowsPrincipal 和 WindowsIdentity
.NET 版的 Windows 安全性內(nèi)容可分成兩類:
| ? | WindowsPrincipal。這個(gè)類別儲存與目前 Windows 使用者相關(guān)的角色。WindowsPrincipal 實(shí)作將 Windows 群組視為角色。IPrncipal.IsInRole 方法根據(jù)使用者的 Windows 群組成員資格,傳回 True 或 False。 | 
| ? | WindowsIdentity。這個(gè)類別保留目前使用者安全性內(nèi)容的身分識別部份,並可使用靜態(tài) WindowsIdentity.GetCurrent() 方法取得。它會傳回 WindowsIdentity 物件,其中的 Token 屬性則會將代表 Windows 控制碼的 IntPtr 傳回與目前執(zhí)行緒有關(guān)聯(lián)的存取語彙基元。然後可以將這個(gè)語彙基元傳遞到 GetTokenInformation、SetTokenInformation、CheckTokenMembership 等原始 Win32? 應(yīng)用程式發(fā)展介面 (API) 函式,以擷取語彙基元的安全性資訊。 注意:靜態(tài) WindowsIdentity.GetCurrent() 方法會傳回目前執(zhí)行緒的身分識別,可能模擬也可能不模擬。這點(diǎn)類似於 Win32 GetUserName API。 | 
GenericPrincipal 和相關(guān)身分識別物件
這些實(shí)作十分簡單,可供不使用 Windows 驗(yàn)證和不需複雜的主體表示法的應(yīng)用程式使用。您很容易就能在程式碼中建立這些實(shí)作,因此應(yīng)用程式處理 GenericPrincipal 時(shí),必須有一定程度的信任。
如果您在 GenericPrincipal 上使用 IsInRole 方法決定授權(quán),則必須信任負(fù)責(zé)傳送 GenericPrincipal 的應(yīng)用程式。如果使用 WindowsPrincipal 物件,就必須信任作業(yè)系統(tǒng)能提供驗(yàn)證身分識別的 WindowsPrincipal 物件和有效的群組/角色名稱。
下列身分識別物件類型可能與 GenericPrincipal 類別有關(guān)聯(lián):
| ? | FormsIdentity。這個(gè)類別代表以「表單」驗(yàn)證的身分識別。其中的 FormsAuthenticationTicket 包含使用者驗(yàn)證工作階段的相關(guān)資訊。 | 
| ? | PassportIdentity。這個(gè)類別代表以 Passport 驗(yàn)證的身分識別,並包含 Passport 設(shè)定檔資訊。 | 
| ? | GenericIdentity。這個(gè)類別代表未結(jié)合任何特殊作業(yè)系統(tǒng)技術(shù),且通常搭配自訂驗(yàn)證和授權(quán)機(jī)制使用的邏輯使用者。 | 
ASP.NET 和 HttpContext.User
決定授權(quán)之前,通常會在 .NET 程式碼中檢查 Thread.CurrentPrincipal。但是 ASP.NET 使用 HttpContext.User 提供驗(yàn)證使用者的安全性內(nèi)容。
這個(gè)屬性接受並傳回 IPrincipal 介面。這個(gè)屬性包含目前要求的驗(yàn)證使用者。ASP.NET 在決定授權(quán)時(shí)會擷取 HttpContext.User。
當(dāng)您使用 Windows 驗(yàn)證時(shí),Windows 驗(yàn)證模組會自動建構(gòu) WindowsPrincipal 物件,並將其儲存在 HttpContext.User 中。如果您使用「表單」或 Passport 等其他驗(yàn)證機(jī)制,就必須建構(gòu) GenericPrincipal 物件,並將它儲存在 HttpContext.User 中。
ASP.NET 身分識別
執(zhí)行 ASP.NET Web 應(yīng)用程式時(shí),單一要求期間內(nèi)可能會出現(xiàn)多重身分識別。這些識別包括:
| ? | HttpContext.User,傳回包含目前 Web 要求之安全性資訊的 IPrincipal 物件。這是已驗(yàn)證的 Web 用戶端。 | 
| ? | WindowsIdentity.GetCurrent(),傳回執(zhí)行中 Win32 執(zhí)行緒之安全性內(nèi)容的身分識別。根據(jù)預(yù)設(shè),這個(gè)身分識別是 ASPNET,即用來執(zhí)行 ASP.NET Web 應(yīng)用程式的預(yù)設(shè)帳戶。但如果 Web 應(yīng)用程式已經(jīng)設(shè)定為使用模擬,則其身分識別代表驗(yàn)證的使用者 (如果使用 IIS「匿名」驗(yàn)證,則為 IUSR_MACHINE)。 | 
| ? | Thread.CurrentPrincipal,傳回在 Win32 執(zhí)行緒頂端之執(zhí)行中 .NET 執(zhí)行緒的主體。 | 
其他資訊
| ? | 若需 Web 應(yīng)用程式設(shè)定 (模擬和不模擬) 的 ASP.NET 身分識別的詳細(xì)分析,請參閱本手冊<參考>中的<ASP.NET 身分識別矩陣>。 | 
| ? | 若需建立自己的 IPrincipal 實(shí)作的相關(guān)資訊,請參閱第 8 單元<ASP.NET 安全性>和本手冊<參考>中的<How To:實(shí)作 IPrincipal>。 | 
遠(yuǎn)端處理和 Web 服務(wù)
現(xiàn)行版本的 .NET Framework、遠(yuǎn)端處理和 Web 服務(wù)沒有自己的安全性模型。它們都繼承 IIS 和 ASP.NET 的安全性功能。
雖然遠(yuǎn)端處理架構(gòu)沒有內(nèi)建的安全性,但是其在設(shè)計(jì)之初即已注意到安全性。再由開發(fā)人員和/或系統(tǒng)管理者在遠(yuǎn)端處理應(yīng)用程式中加入某些等級的安全性。是否會跨越遠(yuǎn)端處理的界限傳遞主體物件,需視用戶端和遠(yuǎn)端物件的位置而定,例如:
| ? | 相同處理序中的遠(yuǎn)端處理。相同或不同應(yīng)用程式網(wǎng)域中的物件之間使用遠(yuǎn)端處理時(shí),遠(yuǎn)端基礎(chǔ)結(jié)構(gòu)會將與呼叫者內(nèi)容有關(guān)聯(lián)的 IPrincipal 物件參考,複製到接收者內(nèi)容。 | 
| ? | 處理序間的遠(yuǎn)端處理。此時(shí)的處理序之間,不傳輸 IPrincipal 物件。用來建構(gòu)原始 IPrincipal 的憑證,必須傳輸?shù)娇赡茉趧e臺電腦上的遠(yuǎn)端處理序。這能讓遠(yuǎn)端電腦根據(jù)提供的憑證,建構(gòu)適當(dāng)?shù)?IPrincipal 物件。 | 
摘要
本單元介紹了各種 .NET 相關(guān)技術(shù)所提供的所有驗(yàn)證及授權(quán)選項(xiàng)。同時(shí)還介紹了 .NET Framework 安全性,以及作為 ASP.NET 授權(quán)核心的主體及身分識別物件。
藉由在 .NET Web 應(yīng)用程式中使用多重 Gatekeeper,您可以實(shí)作深度防禦的安全性策略??偫▉碚f:
| ? | ASP.NET 應(yīng)用程式可以使用 Windows 和 IIS 提供的現(xiàn)有安全性功能。 | 
| ? | SSL 和 IPSec 的結(jié)合可以提供 .NET Web 應(yīng)用程式各層間 (例如,從瀏覽器到資料庫) 的安全通訊。 | 
| ? | 在使用「基本」驗(yàn)證或「表單」驗(yàn)證時(shí),您可用 SSL 保護(hù)在網(wǎng)路上傳遞的純文字憑證。 | 
| ? | .NET Framework 1 版建置的 ASP.NET Web 應(yīng)用程式,必須作為完全信任的應(yīng)用程式來執(zhí)行,這表示對於伺服器端 Web 應(yīng)用程式開發(fā)人員來說,「程式碼存取安全性」用途有限。.NET Framework 1.1 版會啟用部份信任的 Web 應(yīng)用程式,在此情況下,CAS 將變得更重要。 | 
| ? | .NET 以 WindowsPrincipal 和 WindowsIdentity 類別,來代表經(jīng) Windows 驗(yàn)證識別的使用者。 | 
| ? | GenericPrincipal 和 GenericIdentity 或 FormsIdentity 類別可用來代表以「表單」驗(yàn)證等非 Windows 驗(yàn)證配置識別的使用者。 | 
| ? | 藉由建立實(shí)作 IPrincipal 和 IIdentity 的類別,您可以建立自己的主體和身分識別實(shí)作。 | 
| ? | 在 ASP.NET Web 應(yīng)用程式中,代表驗(yàn)證使用者的 IPrincipal 物件,用 HttpContext.User 屬性與目前的 HTTP Web 要求產(chǎn)生關(guān)聯(lián)。 | 
| ? | 閘道是應(yīng)用程式中的存取控制點(diǎn),可供授權(quán)的使用者存取資源或服務(wù)。Gatekeeper 負(fù)責(zé)控制存取閘道。 | 
| ? | 您可以使用多重 Gatekeeper,提供深度防禦策略。 | 
| ? | Web 服務(wù)及 .NET 遠(yuǎn)端處理依賴於 ASP.NET 及 IIS 提供的基礎(chǔ)安全性服務(wù)。 | 
下一單元 - 第 3 單元<驗(yàn)證及授權(quán)>提供的其他資訊,能協(xié)助您選擇最適合特殊應(yīng)用程式案例的驗(yàn)證及授權(quán)策略。
轉(zhuǎn)載于:https://www.cnblogs.com/coolcat/archive/2005/10/14/254750.html
總結(jié)
以上是生活随笔為你收集整理的ASP.NET 應用程式的安全性模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 看了一天小说
- 下一篇: C#来创建和读取XML文档 [转]
