ASP.NET應(yīng)用程序的安全模型
2024-07-10 12:57:06
供稿:網(wǎng)友
本文來源于網(wǎng)頁設(shè)計(jì)愛好者web開發(fā)社區(qū)http://www.html.org.cn收集整理,歡迎訪問。microsoft corporation
在本節(jié)中
一個(gè)功能強(qiáng)大的 asp.net 應(yīng)用程序依賴于許多元素及技術(shù)的成功的相互作用。每一個(gè)解決方案的組成部分都會提供安全性功能,這些功能被設(shè)計(jì)用來滿足自身需要。然而,只是從單一的一個(gè)組成部分的角度來看待安全性是不夠的。為了為整體的解決方案提供安全性,必須也要考慮各個(gè)組成部分是如何相互作用的。
本節(jié)介紹了 .net web 應(yīng)用程序體系結(jié)構(gòu)和安全性,并且提供了一個(gè)可供參考的框架,而在此系列中其它的章節(jié)會向此框架中補(bǔ)充其它內(nèi)容。本節(jié)綜述了存在于一個(gè)典型的 .net web 應(yīng)用程序各個(gè)層面的安全性特征和服務(wù)。也介紹了 .net framework 安全性, 并且解釋了在此框架中的哪些元素對 asp.net web應(yīng)用程序開發(fā)人員最為重要。
目標(biāo)
本章用來:
• 深刻理解 .net web 應(yīng)用程序體系結(jié)構(gòu)和邏輯上以及物理上的應(yīng)用程序?qū)痈拍睢?
• 了解每個(gè)實(shí)現(xiàn)技術(shù)提供的哪些安全性特征可以用來構(gòu)建 .net web 應(yīng)用程序,以及它們?nèi)绾我黄鸸ぷ鳌?
• 理解 .net framework 安全性功能,并且理解哪些元素對 web 應(yīng)用程序安全性最為重要。
• 比較和對照 web 應(yīng)用程序中可以使用的授權(quán)和驗(yàn)證機(jī)制。
• 了解如何在 .net web 應(yīng)用程序中使用主體和標(biāo)識對象。
• 確定可在應(yīng)用程序中用于實(shí)現(xiàn)信任邊界的網(wǎng)關(guān)守衛(wèi)和關(guān)口。
適用于:
本章應(yīng)用于下面的產(chǎn)品和技術(shù):
• microsoft_ windows_ xp 或者 windows 2000 server 及其以后的的操作系統(tǒng)
• internet information services (iis)
• .net framework 1.0 版本及其以后的版本
如何使用本節(jié)
為了從本章得到更多的收獲:
• 您必須具有 asp.net web 應(yīng)用程序的開發(fā)經(jīng)驗(yàn)。這將有助于您理解在本單元中討論的各種安全性元素在何處與您的應(yīng)用程序相結(jié)合。
• 閱讀“構(gòu)建安全的 asp.net 應(yīng)用程序簡介”,此文強(qiáng)調(diào)了授權(quán)、驗(yàn)證以及安全通信在創(chuàng)建安全的、分布式的web應(yīng)用程序中的重要性。同時(shí)指出了在開發(fā)安全的web應(yīng)用程序時(shí)采用的主要原則和實(shí)踐。
本頁內(nèi)容
.net web 應(yīng)用程序
實(shí)現(xiàn)技術(shù)
安全體系結(jié)構(gòu)
介紹 .net framework 安全性
小結(jié)
.net web 應(yīng)用程序
這一部分對 .net web 應(yīng)用程序進(jìn)行了簡要的介紹,并且分別從邏輯上和物理上說明其特征。還介紹了用于構(gòu)建 .net web 應(yīng)用程序的各種實(shí)現(xiàn)技術(shù)。
邏輯層
邏輯應(yīng)用程序體系結(jié)構(gòu)將任何系統(tǒng)都視為一組相互協(xié)作的服務(wù),這些服務(wù)分為以下幾層:
• 用戶服務(wù)
• 業(yè)務(wù)服務(wù)
• 數(shù)據(jù)服務(wù)
此邏輯體系結(jié)構(gòu)視圖的意義的價(jià)值在于將普遍存在于任何系統(tǒng)中的各種服務(wù)區(qū)分開來、確保了適當(dāng)?shù)姆蛛x以及促成各層之間的接口定義。這種分離可以使您在實(shí)現(xiàn)每個(gè)邏輯層時(shí)更為謹(jǐn)慎地進(jìn)行體系結(jié)構(gòu)和設(shè)計(jì)選擇,從而構(gòu)建出更易于維護(hù)的應(yīng)用程序。
現(xiàn)將各邏輯輯層描述如下:
• 用戶服務(wù)負(fù)責(zé)客戶端與系統(tǒng)之間的交互,并且提供一個(gè)與核心業(yè)務(wù)邏輯相連的公共網(wǎng)橋,這些業(yè)務(wù)邏輯由業(yè)務(wù)服務(wù)層內(nèi)的組件封裝。一般說來,用戶服務(wù)與交互式用戶關(guān)聯(lián)的情況最多。不過,它們也對其他系統(tǒng)發(fā)出的編程請求進(jìn)行初始處理,這種情況下不涉及任何可見的用戶界面。身份驗(yàn)證和授權(quán)的確切性質(zhì)因客戶端類型而異,它們通常在用戶服務(wù)層內(nèi)執(zhí)行。
• 業(yè)務(wù)層提供系統(tǒng)的核心功能并封裝業(yè)務(wù)邏輯。它們獨(dú)立于傳輸信道和后端系統(tǒng)或數(shù)據(jù)源。這就為提升系統(tǒng)以支持新的、不同的信道及后端系統(tǒng)提供了必要的穩(wěn)定性和靈活性。通常,為特定業(yè)務(wù)請求提供服務(wù)涉及到業(yè)務(wù)服務(wù)層內(nèi)的許多協(xié)作組件。
• 數(shù)據(jù)服務(wù)通過一般接口提供對數(shù)據(jù)(系統(tǒng)邊界內(nèi)承載的)及其他(后端)系統(tǒng)的訪問;通過業(yè)務(wù)服務(wù)層內(nèi)的組件可以方便地使用這些接口。數(shù)據(jù)服務(wù)對多種后端系統(tǒng)和數(shù)據(jù)源進(jìn)行了抽象,并且封裝了特定的訪問規(guī)則和數(shù)據(jù)格式。
系統(tǒng)內(nèi)各服務(wù)類型的邏輯分類既與實(shí)現(xiàn)這些服務(wù)的組件的可能的物理分布相關(guān),又相對獨(dú)立于它們的物理分布。
可以在任何聚合級別上標(biāo)識邏輯層,具體來說,可以對整個(gè)系統(tǒng)(在系統(tǒng)環(huán)境上下文和外部交互中)標(biāo)識邏輯層,也可以對系統(tǒng)中所含的任何子系統(tǒng)標(biāo)識邏輯層。記住這一點(diǎn)也很重要。例如,承載 web 服務(wù)的每個(gè)遠(yuǎn)程節(jié)點(diǎn)由用戶服務(wù)(處理傳入的請求和消息)、業(yè)務(wù)服務(wù)和數(shù)據(jù)服務(wù)組成。
物理部署模型
前面所述的三個(gè)邏輯服務(wù)層并不意味著存在特定數(shù)量的物理層。所有這三種邏輯服務(wù)在物理上可能位于同一臺計(jì)算機(jī)上,也可能分布于多臺計(jì)算機(jī)上。
web 服務(wù)器用作應(yīng)用程序服務(wù)器
.net web應(yīng)用程序的常用部署模式是將業(yè)務(wù)和數(shù)據(jù)訪問組件放在 web 服務(wù)器上。這樣就最大限度地減少了網(wǎng)絡(luò)躍點(diǎn),有助于提高性能。圖 1 中顯示了這種模型。.
圖 1. web 服務(wù)器用作應(yīng)用程序服務(wù)器
遠(yuǎn)程應(yīng)用程序?qū)?br>遠(yuǎn)程應(yīng)用程序?qū)邮浅S玫牟渴鹉J剑绕涫且韵?internet 方案中的常用部署模式:web 層在周邊網(wǎng)絡(luò)(也就是大家所知道的dmz 和屏蔽的子網(wǎng))中是獨(dú)立的部分,它依靠數(shù)據(jù)包篩選防火墻與最終用戶和遠(yuǎn)程應(yīng)用程序?qū)臃指糸_圖 2 中顯示了遠(yuǎn)程應(yīng)用程序?qū)印?br>
圖 2. 遠(yuǎn)程應(yīng)用程序?qū)雍喗?br>
實(shí)現(xiàn)技術(shù)
.net web 應(yīng)用程序通常使用以下技術(shù)來實(shí)現(xiàn)一個(gè)或多個(gè)邏輯服務(wù):
• asp.net
asp.net 通常用于實(shí)現(xiàn)用戶服務(wù)。asp.net 提供一種可插接式體系結(jié)構(gòu),這種體系結(jié)構(gòu)可用于構(gòu)建 web 頁。有關(guān) asp.net 安全性,的詳細(xì)信息,請參閱:“asp.net 安全性”。
• 企業(yè)服務(wù)
enterprise services 為應(yīng)用程序提供基礎(chǔ)結(jié)構(gòu)級別的服務(wù)。這包括分布式事務(wù)和資源管理服務(wù),如 .net 組件的對象池。有關(guān)enterprise services 的詳細(xì)信息,請參閱“企業(yè)服務(wù)安全性”。
• web 服務(wù)
web 服務(wù)使用基于 soap 的消息交換來防火墻移動(dòng)數(shù)據(jù)和在異構(gòu)系統(tǒng)之間移動(dòng)數(shù)據(jù),以此來實(shí)現(xiàn)數(shù)據(jù)交換和應(yīng)用程序邏輯的遠(yuǎn)程調(diào)用。有關(guān) web 服務(wù)的詳細(xì)信息,請參閱“web 服務(wù)安全性”。
• .net remoting
.net remoting 提供了一種用于跨越進(jìn)程和計(jì)算機(jī)邊界訪問分布式對象的框架。有關(guān).net remoting的詳細(xì)信息,請參閱“net remoting 安全性”。
• ado.net 和 microsoft_ sql server™ 2000
ado.net 提供數(shù)據(jù)訪問服務(wù)。 ado.net從一開始就是專門為分布式 web 應(yīng)用程序設(shè)計(jì)的,很適合用于與 web 應(yīng)用程序有著內(nèi)在聯(lián)系的分離方案。sql server 提供使用操作系統(tǒng)身份驗(yàn)證機(jī)制(kerberos 或 ntlm)的集成式安全性。授權(quán)由可應(yīng)用于單個(gè)數(shù)據(jù)庫對象的登錄和細(xì)化權(quán)限提供。有關(guān)數(shù)據(jù)訪問安全性的詳細(xì)討論,請參閱“數(shù)據(jù)訪問安全性”。
• internet 協(xié)議安全性 (ipsec)
ipsec提供點(diǎn)對點(diǎn)的傳輸級別加密和身份驗(yàn)證服務(wù)。有關(guān) ipsec 的詳細(xì)信息,請參閱“安全通信”。
• 安全套接字層 (ssl)
ssl提供點(diǎn)對點(diǎn)的安全通信信道。通過該信道傳輸?shù)臄?shù)據(jù)都是加密的。有關(guān) ssl 的詳細(xì)信息,請參閱“安全通信”。
安全體系結(jié)構(gòu)
圖 3顯示了遠(yuǎn)程應(yīng)用程序?qū)幽P秃颓懊娼榻B的各種技術(shù)提供的那些安全服務(wù)。身份驗(yàn)證和授權(quán)在分布于各層中許多點(diǎn)分別進(jìn)行。這些服務(wù)主要由 internet 信息服務(wù) (iis)、asp.net、enterprise services 和 sql server 提供。同時(shí),安全通信信道在各層上應(yīng)用,并從客戶端瀏覽器或設(shè)備一直延伸到數(shù)據(jù)庫。信道的安全性由安全套接字層 (ssl) 或 ipsec 聯(lián)合提供保障。
圖 3. 安全體系結(jié)構(gòu)
各層之間的安全性
表 1摘要說明前面討論的技術(shù)所提供的身份驗(yàn)證、授權(quán)和安全通信功能。
表 1:安全功能
技術(shù) 身份驗(yàn)證 授權(quán) 安全通信
iis
匿名
基本
摘要式
windows 集成 (kerberos/ntlm)
證書
ip/dns 地址限制
web 權(quán)限
ntfs 權(quán)限;所請求文件的 windows
訪問控制列表 (acl)
ssl
asp.net
無(自定義)
windows
窗體
passport
文件授權(quán)
url 授權(quán)
主體權(quán)限
.net角色
-
web services
windows
無(自定義)
消息級別身份驗(yàn)證
文件授權(quán)
url 授權(quán)
主體權(quán)限
.net角色
ssl 和消息級別加密
remoting
windows
文件授權(quán)
url 授權(quán)
主體權(quán)限
.net角色
ssl 和消息級別加密
enterprise services
windows
enterprise services (com+)角色
ntfs權(quán)限
遠(yuǎn)程過程調(diào)用 (rpc) 加密
sql server 2000
windows (kerberos/ntlm)
sql 身份驗(yàn)證
服務(wù)器登錄
數(shù)據(jù)庫登錄
固定數(shù)據(jù)庫角色
用戶定義的角色
應(yīng)用程序角色
對象權(quán)限
ssl
windows 2000
kerberos
ntlm
windows acls
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和無身份驗(yàn)證。
• windows 身份驗(yàn)證。在這種身份驗(yàn)證模式下,asp.net 依靠 iis 對用戶進(jìn)行身份驗(yàn)證并創(chuàng)建 windows 訪問令牌來表示經(jīng)過身份驗(yàn)證的標(biāo)識。iiis 提供下列身份驗(yàn)證機(jī)制:
• 基本身份驗(yàn)證。基本身份驗(yàn)證要求用戶以用戶名和密碼的形式提供證書以證明其標(biāo)識。它是基于 rfc 2617提出的 internet 標(biāo)準(zhǔn)。http://www.faqs.org/rfcs/rfc2617.html. netscape navigator 和 microsoft internet explorer 都支持基本身份驗(yàn)證。用戶證書以不加密的 base64 編碼格式從瀏覽器傳送到 web 服務(wù)器。由于 web 服務(wù)器得到的用戶證書是不加密的格式,因此 web 服務(wù)器可以使用用戶證書發(fā)出遠(yuǎn)程調(diào)用(例如,訪問遠(yuǎn)程計(jì)算機(jī)和資源)。
注 基本身份驗(yàn)證只應(yīng)與安全信道(通常是使用 ssl 建立的)一起使用。否則,用戶名和密碼很容易被網(wǎng)絡(luò)監(jiān)視軟件竊取。如果使用基本身份驗(yàn)證,應(yīng)在所有頁(而不僅僅是登錄頁)上使用 ssl,因?yàn)樵诎l(fā)出所有后續(xù)請求時(shí)都傳遞證書。有關(guān)聯(lián)合使用基本身份驗(yàn)證和 ssl 的詳細(xì)信息,詳見“asp.net 安全性”。
• 摘要式身份驗(yàn)證。與 iis 5.0 一起推出的摘要式身份驗(yàn)證與基本身份驗(yàn)證類似,但它從瀏覽器向 web 服務(wù)器傳送用戶證書時(shí)不采用不加密的格式,而采用哈希格式。 因此,它更為安全,不過它要求使用 internet explorer 5.0 或更高版本的客戶端以及特定的服務(wù)器配置。
• 集成的 windows 身份驗(yàn)證。集成的 windows 身份驗(yàn)證(kerberos 或 ntlm,具體取決于客戶端和服務(wù)器配置)使用與用戶 internet explorer web 瀏覽器的加密交換來確認(rèn)用戶標(biāo)識。只有 internet explorer 支持這種驗(yàn)證(netscape navigator 不支持)。所以,這種驗(yàn)證一般只能在 intranet 方案中使用,因?yàn)槟軌蚩刂?intranet 中所用的客戶端軟件。如果禁用匿名訪問,或拒絕通過 windows 文件系統(tǒng)權(quán)限進(jìn)行匿名訪問,那么這種驗(yàn)證只能由 web 服務(wù)器使用。
• 證書身份驗(yàn)證。證書身份驗(yàn)證使用客戶端證書明確地識別用戶。客戶端證書由用戶的瀏覽器(或客戶端應(yīng)用程序)傳遞到 web 服務(wù)器。(如果是 web 服務(wù),則由 web 服務(wù)客戶端通過 httpwebrequest 對象的clientcertificates 屬性來傳遞證書。)web 服務(wù)器從證書中提取用戶標(biāo)識。該方法依賴用戶計(jì)算機(jī)上安裝的客戶端證書,所以它一般在 intranet 或 extranet 方案中使用,因?yàn)槟煜げ⒛芸刂?intranet 和 extranet 中的用戶群。iis 在收到客戶端證書后,可以將證書映射到 windows 帳戶。
• 匿名身份驗(yàn)證。如果不需要對客戶端進(jìn)行身份驗(yàn)證(或者您實(shí)現(xiàn)自定義的身份驗(yàn)證方案),則可以配置 iis 進(jìn)行匿名身份驗(yàn)證。在這種情況下,web 服務(wù)器創(chuàng)建 windows 訪問令牌來表示使用同一個(gè)匿名(或來賓)帳戶的所有匿名用戶。默認(rèn)匿名帳戶是 iusr_machinename,其中 machinename 是在安裝時(shí)為計(jì)算機(jī)指定的 netbios 名稱。
• passport 身份驗(yàn)證。在這種身份驗(yàn)證模式下,asp.net使用 microsoft passport 的集中式身份驗(yàn)證服務(wù)。asp.net提供方便的包裝對 microsoft passport 軟件開發(fā)工具包 (sdk) 提供的功能進(jìn)行包裝,該 sdk 必須安裝在 web 服務(wù)器上。
• 窗體身份驗(yàn)證。此方法使用客戶端重定向?qū)]有經(jīng)過身份驗(yàn)證的用戶轉(zhuǎn)發(fā)到指定的 html 窗體,用戶可以在該窗體中輸入證書(通常是用戶名和密碼)。然后,系統(tǒng)對這些證書進(jìn)行驗(yàn)證,生成身份驗(yàn)證票并將其返回客戶端。身份驗(yàn)證票上有用戶標(biāo)識,您還可以選擇在身份驗(yàn)證票上列出用戶在會話期間所屬的角色。
有時(shí),窗體身份驗(yàn)證僅用于 web 站點(diǎn)的個(gè)性化處理。在這種情況下,您幾乎不用編寫任何自定義代碼,因?yàn)?asp.net用簡單的配置自動(dòng)處理這一過程的大部分工作。在個(gè)性化處理方案中,cookie 只需要保留用戶名。
注:窗體身份驗(yàn)證以明文形式向 web 服務(wù)器發(fā)送用戶名和密碼。因此,應(yīng)該將窗體身份驗(yàn)證與 ssl 保護(hù)的信道結(jié)合使用。為了對后續(xù)請求中傳輸?shù)纳矸蒡?yàn)證 cookie 不間斷地提供保護(hù),您應(yīng)該考慮在應(yīng)用程序內(nèi)的所有頁上使用 ssl,而不僅僅是在登錄頁上使用 ssl。
• 無“無”表示不希望對用戶進(jìn)行身份驗(yàn)證,或者使用的是自定義的身份驗(yàn)證協(xié)議。
更多信息
有關(guān)asp.net身份驗(yàn)證的更多詳細(xì)信息,請參閱“asp.net 安全性”。
企業(yè)服務(wù)身份驗(yàn)證
企業(yè)服務(wù)身份驗(yàn)證的通過基礎(chǔ)的“遠(yuǎn)程過程調(diào)用”(rpc) 傳輸基礎(chǔ)結(jié)構(gòu)來執(zhí)行的,該基礎(chǔ)結(jié)構(gòu)使用操作系統(tǒng)的“安全服務(wù)提供程序接口”(sspi)。可以使用 kerberos 或 ntlm 身份驗(yàn)證對企業(yè)服務(wù)應(yīng)用程序客戶端進(jìn)行身份驗(yàn)證。
可以在庫應(yīng)用程序或服務(wù)器應(yīng)用程序中承載服務(wù)組件。庫應(yīng)用程序是在客戶端進(jìn)程內(nèi)承載的,因此,它們采用客戶端的標(biāo)識。服務(wù)器應(yīng)用程序在單獨(dú)的服務(wù)器進(jìn)程內(nèi)運(yùn)行,它們有自己的標(biāo)識。有關(guān)標(biāo)識的詳細(xì)信息,請參閱本章內(nèi)下文中的“標(biāo)識和主體”一節(jié)。
傳入的對服務(wù)組件的調(diào)用可以在以下級別進(jìn)行身份驗(yàn)證:
• 默認(rèn):使用安全包的默認(rèn)身份驗(yàn)證級別。
• 無:不執(zhí)行身份驗(yàn)證。
• 連接:僅在連接時(shí)進(jìn)行身份驗(yàn)證。
• 調(diào)用:每次開始遠(yuǎn)程過程調(diào)用時(shí)進(jìn)行身份驗(yàn)證。
• 數(shù)據(jù)包:鑒定并驗(yàn)證是否已收到所有調(diào)用數(shù)據(jù)。
• 數(shù)據(jù)包完整性:驗(yàn)證數(shù)據(jù)在傳輸過程中是否被修改過。
• 數(shù)據(jù)包保密性:驗(yàn)證并加密數(shù)據(jù)包,包括數(shù)據(jù)和發(fā)送者的標(biāo)識及簽名。
更多信息
有關(guān) enterprise services 身份驗(yàn)證的詳細(xì)信息,請參閱“企業(yè)服務(wù)安全性”。
sql server 身份驗(yàn)證
sql server 既可以使用 windows 身份驗(yàn)證(ntlm 或 kerberos)對用戶進(jìn)行身份驗(yàn)證,也可以使用其內(nèi)置的身份驗(yàn)證方案(稱為 sql 身份驗(yàn)證)對用戶進(jìn)行身份驗(yàn)證。共有以下兩個(gè)可用選項(xiàng):
• sql server 和 windows.客戶端可以使用 sql server 身份驗(yàn)證或 windows 身份驗(yàn)證連接到 microsoft sql server 的實(shí)例。有時(shí),這也稱為混合模式的身份驗(yàn)證。
• 僅使用 windows。用戶必須使用 windows 身份驗(yàn)證連接到 microsoft sql server 的實(shí)例。
更多信息
關(guān)于每種方法的優(yōu)點(diǎn),請參閱“數(shù)據(jù)訪問安全性”。
授權(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).這是通過計(jì)算機(jī)配置文件和應(yīng)用程序配置文件中的設(shè)置來配置的授權(quán)機(jī)制。 url 授權(quán)使您可以限制對應(yīng)用程序的“統(tǒng)一資源標(biāo)識符”(uri) 名稱空間中的特定文件和文件夾的訪問。例如,您可以選擇拒絕或允許指定的用戶對特定文件或文件夾(通過 url 尋址)的訪問。您還可以根據(jù)用戶的角色成員身份和用于發(fā)出請求(get、post 等等)的 http 謂詞類型來限制訪問。
url 授權(quán)需要經(jīng)過身份驗(yàn)證的標(biāo)識。它可以通過 windows 或基于身份驗(yàn)證票的身份驗(yàn)證方案來獲得。
• 文件授權(quán).只有在使用 iis 提供的一種 windows 身份驗(yàn)證機(jī)制對調(diào)用方進(jìn)行身份驗(yàn)證并且asp.net已配置為使用 windows 身份驗(yàn)證時(shí),文件授權(quán)才適用。
您可以使用它限制對 web 服務(wù)器上的指定文件的訪問。訪問權(quán)限由與文件相關(guān)的 windows acl 確定。
• 主體權(quán)限需求.主體權(quán)限需求可以作為一種(以聲明方式或編程方式)更加細(xì)化的訪問控制機(jī)制來使用。這種權(quán)限需求使您可以根據(jù)單個(gè)用戶的標(biāo)識和組成員身份控制對類、方法或單個(gè)代碼塊的訪問。
• .net 角色..net角色用于將應(yīng)用程序內(nèi)具有相同權(quán)限的用戶集合在一起。它們在概念上與以前基于角色的實(shí)現(xiàn)手段(例如,windows 組和 com+ 角色)類似。不過,與這些方法不同,.net 角色不需要經(jīng)過身份驗(yàn)證的 windows 標(biāo)識,可在基于身份驗(yàn)證票的身份驗(yàn)證方案(如窗體身份驗(yàn)證)中使用。
.net 角色可用于控制對資源和操作的訪問,并且,這類角色既可以用聲明方式配置,也可以用編程方式配置。
更多信息
有關(guān)asp.net授權(quán)的詳細(xì)信息,請參閱“asp.net 安全性”。
enterprise services 授權(quán)
對企業(yè)服務(wù)應(yīng)用程序內(nèi)服務(wù)組件中所含功能的訪問受企業(yè)服務(wù)角色成員身份制約。與.net角色不同,它們可以包含 windows 組或用戶帳戶。角色成員身份在 com+ 目錄內(nèi)定義并通過使用“組件服務(wù)”工具管理。
更多信息
有關(guān) enterprise services 授權(quán)的詳細(xì)信息,請參閱“企業(yè)服務(wù)安全性”。
sql server 授權(quán)
sql server 允許設(shè)置細(xì)化的權(quán)限,這些權(quán)限可應(yīng)用于單個(gè)數(shù)據(jù)庫對象。可以讓權(quán)限基于角色成員身份(sql server 提供固定的數(shù)據(jù)庫角色、用戶定義的角色和應(yīng)用程序角色),也可以將權(quán)限授予單個(gè)的 windows 用戶或組帳戶。
更多信息
有關(guān) sql server 授權(quán)的詳細(xì)信息,請參閱“數(shù)據(jù)訪問安全性”。
網(wǎng)關(guān)守衛(wèi)和關(guān)口
在本文檔的其余部分,術(shù)語網(wǎng)關(guān)守衛(wèi) 用來指負(fù)責(zé)關(guān)口 的技術(shù)。關(guān)口表示應(yīng)用程序內(nèi)的訪問控制點(diǎn)(保護(hù)資源)。例如,資源可以是某個(gè)操作(由對象的方法表示)或數(shù)據(jù)庫或文件系統(tǒng)資源。
前面所列的每種核心技術(shù)都為訪問授權(quán)提供了網(wǎng)關(guān)守衛(wèi)。請求必須先通過一系列的關(guān)口,然后才被允許訪問所請求的資源或操作。下面說明請求必須通過的各個(gè)關(guān)口:
• iis 在您對用戶進(jìn)行身份驗(yàn)證(即您禁用匿名身份驗(yàn)證)時(shí)提供關(guān)口。 iis web 權(quán)限可用作訪問控制機(jī)制,該機(jī)制限制 web 用戶對特定文件和文件夾的訪問能力。與 ntfs 文件權(quán)限不同,web 權(quán)限應(yīng)用于所有 web 用戶,而不是單個(gè)的用戶或組。 ntfs 文件權(quán)限對 web 資源(如 web 頁、圖像文件,等等)提供進(jìn)一步的限制。這些限制適用于單個(gè)的用戶或組。
iis 檢查 web 權(quán)限,接著檢查 ntfs 文件權(quán)限。用戶必須獲得兩種機(jī)制的授權(quán)后才能訪問文件或文件夾。如果 web 權(quán)限檢查失敗,iis 將返回http 403 — 訪問拒絕響應(yīng),如果 ntfs 權(quán)限檢查失敗,iis 將返回http 401 — 拒絕訪問。
• asp.net 提供了各種可配置的編程關(guān)口。其中包括 url 授權(quán)、文件授權(quán)、主體權(quán)限需求和 .net 角色。
• enterprise services 網(wǎng)關(guān)守衛(wèi)使用 enterprise services 角色來授予對業(yè)務(wù)功能的訪問權(quán)限。
• sql server 2000 包括一系列關(guān)口,包括服務(wù)器登錄、數(shù)據(jù)庫登錄和數(shù)據(jù)庫對象權(quán)限。
• windows 2000 使用與安全資源相關(guān)的 acl 提供關(guān)口。
底線是:網(wǎng)關(guān)守衛(wèi)根據(jù)調(diào)用到關(guān)口并嘗試訪問特定資源的用戶或服務(wù)的標(biāo)識來授權(quán)。多個(gè)關(guān)口的好處是通過多條防御線提供縱深防御安全機(jī)制。表 2.2 摘要說明各種網(wǎng)關(guān)守衛(wèi)及其負(fù)責(zé)的關(guān)口。
表 2. 網(wǎng)關(guān)守衛(wèi)的責(zé)任及其提供的關(guān)口
網(wǎng)關(guān)守衛(wèi) 關(guān)口
windows 操作系統(tǒng)
登錄權(quán)限(肯定和否定,例如“拒絕本地登錄”)
其他權(quán)限(例如“充當(dāng)操作系統(tǒng)的一部分”)
對保護(hù)的資源(如注冊表和文件系統(tǒng))進(jìn)行訪問檢查。訪問檢查使用與安全資源相關(guān)的acl,這些acl指定允許誰訪問資源和不允許誰訪問資源,并指定允許執(zhí)行的操作類型。
tcp/ip 篩選
ip安全性
iis
身份驗(yàn)證(匿名、基本、摘要式、集成、證書)
ip 地址和域名限制(它們可用來加強(qiáng)安全防御,但不應(yīng)依靠它們,因?yàn)槭褂闷垓_性的 ip 地址是比較容易的事情)。
web 權(quán)限
ntfs 權(quán)限
asp.net
url授權(quán)
文件授權(quán)
主體權(quán)限需求
.net角色
企業(yè)服務(wù)
windows (ntlm / kerberos) 身份驗(yàn)證
enterprise services (com+)角色
模擬級別
web 服務(wù)
使用 iis 和asp.net提供的關(guān)口
遠(yuǎn)程處理
使用主機(jī)提供的關(guān)口。如果是在 asp.net中承載的,它使用 iis 和 asp.net 提供的關(guān)口。如果是在 windows 服務(wù)中承載的,則必須開發(fā)自定義的解決方案 。
ado.net
連接字符串可以使用顯式證書,也可以使用 windows 身份驗(yàn)證(例如,連接到 sql server 時(shí))
sql server
服務(wù)器登錄
數(shù)據(jù)庫登錄
數(shù)據(jù)庫對象權(quán)限
通過在應(yīng)用程序各層上使用各種關(guān)口,您可以篩選出應(yīng)允許哪些用戶訪問您的后端資源。請求在通過應(yīng)用程序到達(dá)后端資源的過程中,一系列相連的關(guān)口的控制越來越細(xì)化,使得訪問范圍逐步縮小。
請考慮使用 iis 的基于 internet 的應(yīng)用程序示例,如圖 4 所示。
圖 4 用網(wǎng)關(guān)守衛(wèi)篩選用戶
圖 4 說明以下幾點(diǎn):
• 您可以在 iis 中禁用匿名身份驗(yàn)證。這樣,將只允許經(jīng)過 iis 身份驗(yàn)證的帳戶進(jìn)行訪問。這可將潛在用戶數(shù)減到 10,000。
• 接著,您可以在 asp.net中使用 url 授權(quán),這可將用戶數(shù)減到 1,000。
• 文件授權(quán)可能會將訪問范圍進(jìn)一步縮小,將用戶數(shù)減少到 100。
• 最后,根據(jù)特定的角色成員身份,web 應(yīng)用程序代碼可能只允許 10 個(gè)用戶訪問受限制的資源。
介紹 .net framework 安全性
.net framework 安全性在 windows 安全性之上;它沒有取代windows安全性,而是提供附加的安全特性。.net 應(yīng)用程序?qū)λ匈Y源訪問的成功或者失敗最終由操作系統(tǒng)的安全性決定。
例如,如果一個(gè) asp.net web 應(yīng)用程序要打開一個(gè)文件,能否打開文件取決于和此文件相關(guān)的windows acl。用于資源訪問的標(biāo)識要么是 asp.net 應(yīng)用程序進(jìn)程標(biāo)識,要么是使用個(gè)性化處理的應(yīng)用程序的個(gè)性化標(biāo)識。
代碼訪問安全性
.net framework提供一個(gè)被稱為代碼訪問安全性 (cas) 的附加的安全性機(jī)制。傳統(tǒng)的安全性(例如 windows 提供的安全性)是以主體為中心的,并且授權(quán)基于一個(gè)驗(yàn)證的主體,例如用戶運(yùn)行代碼,或者用戶登錄一個(gè) web 應(yīng)用程序。
cas 通過支持基于代碼標(biāo)識(而不是運(yùn)行代碼的用戶)的授權(quán)為安全性添加了一項(xiàng)內(nèi)容。這對于使用 internet explorer 從 internet 上下載的移動(dòng)代碼(例如控件和應(yīng)用程序)尤為重要。這是因?yàn)槟赡芤怨芾韱T的身份登錄您的計(jì)算機(jī),但是您真的想讓這種代碼具有管理員權(quán)限嗎?如果您考慮到計(jì)算機(jī)的安全性,您可能不會允許的。
證據(jù)和安全策略
代碼被驗(yàn)證并且其標(biāo)識使用代碼的屬性來決定,這種代碼被稱作為證據(jù)。證據(jù)可以包含一個(gè)匯編的公共鑰匙(是其強(qiáng)名稱的一部分)、下載 url、安裝應(yīng)用程序目錄和其它內(nèi)容。一旦建立了代碼標(biāo)志,收集的證據(jù)通過安全性策略傳遞,安全性策略最終管理代碼的功能以及給予何種許可訪問安全資源。
缺省策略確保安裝到本地機(jī)器上的所有代碼都是完全可信的,并且可以不受限制地訪問安全資源。因此所有資源訪問只受操作系統(tǒng)安全性管理。由于在安裝軟件時(shí)首先要求管理員作出謹(jǐn)慎的決定,所以安裝到本地機(jī)器上的代碼是完全可信的。
cas 和 asp.net web 應(yīng)用程序
asp.net應(yīng)用程序安裝到本地 web 服務(wù)器上,因此在服務(wù)器上缺省策略給予 web 應(yīng)用程序完全的信任。這意味著 cas 對服務(wù)器端 web 應(yīng)用程序開發(fā)人員來說使用范圍有限。實(shí)際上,建立于 .net framework 版本 1之上的 asp.net web 應(yīng)用程序必須作為完全信任的應(yīng)用程序運(yùn)行。
注.net framework 的 1.1 版本添加了對部分信任 web 應(yīng)用程序的支持,這樣就可以使 cas 有效的使用于服務(wù)器端 web 應(yīng)用程序。引入 cas 主要的好處是易于將應(yīng)用程序之間分離開,以及將應(yīng)用程序和關(guān)鍵的系統(tǒng)資源分離開;這對于由不同公司開發(fā)的可以承載多個(gè) web 應(yīng)用程序的 internet service providers (isps) 和 application service provides (asps) 是一個(gè)重要的考慮因素。
主體和標(biāo)識
盡管 cas 以代碼為中心,但是 .net framework 安全性的其它方面以主體為中心。 .net framework 安全性以主體為中心對 asp.net 應(yīng)用程序安全性起著支配作用。
windows 安全性的用戶中心概念基于登錄會話提供的安全上下文,而 .net 安全性基于 iprincipal 和 iidentity 對象。
在 windows 編程中,如果要了解運(yùn)行的代碼所依賴的安全上下文,應(yīng)查詢進(jìn)程所有者的標(biāo)識或當(dāng)前所執(zhí)行線程的標(biāo)識。在 .net 編程中,如果要查詢當(dāng)前用戶的安全上下文,應(yīng)從 thread.currentprincipal 檢索當(dāng)前的 iprincipal 對象。
運(yùn)行 .net 代碼時(shí)。net framework 使用標(biāo)識對象和主體對象來表示用戶,這兩個(gè)對象共同構(gòu)成基于 .net 角色的授權(quán)的主干部分。對 asp.net web 應(yīng)用程序來講,通過附加到當(dāng)前線程和 web 請求的主體和標(biāo)志對象來表征驗(yàn)證的用戶。
iprincipal 和 iidentity 接口
標(biāo)識和主體對象必須分別實(shí)現(xiàn)iidentity 和 iprincipal 接口。這些接口在 system.security.principal 名稱空間內(nèi)定義。公共接口使 .net framework 能以多態(tài)方式處理標(biāo)識和主體對象,而不管基礎(chǔ)實(shí)現(xiàn)的詳細(xì)情況如何。
iprincipal 接口使您可以通過 isinrole 方法測試角色的成員身份,同時(shí)也提供了對關(guān)聯(lián)的 iidentity 對象的訪問。
public interface iprincipal
{
bool isinrole( string role );
iidentity identity {get;}
}
iidentity 接口提供有關(guān)身份驗(yàn)證的更多詳細(xì)信息,如名稱和驗(yàn)證類型。
public interface iidentity
{
string authenticationtype {get;}
bool isauthenticated {get;}
string name {get;}
}
.net framework 提供了 iprincipal 和iidentity 的多個(gè)具體實(shí)現(xiàn),如圖 5 所示,后面幾節(jié)對這些實(shí)現(xiàn)分別進(jìn)行詳細(xì)說明。
圖 5. iprincipal 和 iidentity 實(shí)現(xiàn)類
windowsprincipal 和 windowsidentity
windows 安全上下文的 .net 版本分為兩個(gè)類:
• windowsprincipal.該類存儲與當(dāng)前的 windows 用戶相關(guān)的角色。windowsprincipal實(shí)現(xiàn)將 windows 組視為角色。iprncipal.isinrole方法根據(jù)用戶的 windows 組成員身份返回 true 或 false。
• windowsidentity該類存儲當(dāng)前用戶安全上下文的標(biāo)識部分,它可以從靜態(tài)的 windowsidentity.getcurrent() 方法獲得。它返回具有 token 屬性的 windowsidentity 對象,該屬性將一個(gè)表示 windows 句柄的 intptr 返回給與當(dāng)前執(zhí)行線程關(guān)聯(lián)的訪問令牌。該令牌接著可被傳遞到本機(jī) win32® 應(yīng)用程序編程接口 (api) 函數(shù),如 gettokeninformation、settokeninformation 和 checktokenmembership 等等,用于檢索與令牌有關(guān)的安全信息。
注:靜態(tài) windowsidentity.getcurrent() 方法返回當(dāng)前所執(zhí)行線程的標(biāo)識,它可能是(也可能不是)模擬的。這與 win32 getusername api類似。
genericprincipal 和 associated identity 對象
這些實(shí)現(xiàn)非常簡單,供不使用 windows 身份驗(yàn)證的應(yīng)用程序在應(yīng)用程序不需要主體的復(fù)雜表示時(shí)使用。您可以在代碼中非常容易地創(chuàng)建這些實(shí)現(xiàn),因此,在應(yīng)用程序處理 genericprincipal 時(shí),必須存在某種程度的信任。
如果依靠genericprincipal 上的 isinrole 方法作出授權(quán)決定,必須信任向您發(fā)送genericprincipal的應(yīng)用程序。這與使用 windowsprincipal 對象形成對比:使用 windowsprincipal 對象時(shí),必須委托操作系統(tǒng)提供有效的 windowsprincipal 對象,和一個(gè)授權(quán)表示符以及有效的組/角色名。
以下類型的標(biāo)識對象可以與 genericprincipal 類相關(guān)聯(lián):
• formsidentity該類表示已經(jīng)過窗體身份驗(yàn)證的標(biāo)識。它包含的 formsauthenticationticket 中存儲了與用戶的身份驗(yàn)證會話有關(guān)的信息。
• passportidentity該類表示已經(jīng)過 passport 身份驗(yàn)證的標(biāo)識,它包含 passport 配置文件信息。
• genericidentity該類表示一個(gè)不與任何特定操作系統(tǒng)技術(shù)相關(guān)的邏輯用戶,通常用在自定義的身份驗(yàn)證和授權(quán)機(jī)制中。
asp.net 和httpcontext.user
通常,作出任何授權(quán)決定之前,先要在 .net 代碼中檢查 thread.currentprincipal。不過,asp.net 使用httpcontext.user提供經(jīng)過身份驗(yàn)證的用戶的安全上下文。
該屬性接受并返回 iprincipal 接口。,該屬性包含一個(gè)與當(dāng)前的請求相關(guān)的經(jīng)過身份驗(yàn)證的用戶。asp.net 在作出授權(quán)決定時(shí)將檢索 httpcontext.user 。
使用 windows 身份驗(yàn)證時(shí),windows 身份驗(yàn)證模塊自動(dòng)構(gòu)造 windowsprincipal 對象并將它存儲在 httpcontext.user。如果使用其他身份驗(yàn)證機(jī)制(如窗體或 passport),必須構(gòu)造 genericprincipal 對象并將它存儲在 httpcontext.user 中。
asp.net 標(biāo)識
在 asp.net 應(yīng)用程序執(zhí)行過程中的任何給定時(shí)間內(nèi),單個(gè)請求中可能存在多個(gè)標(biāo)識。它們包括:
• httpcontext.user返回iprincipal對象,該對象包含當(dāng)前 web 請求的安全信息。這是經(jīng)過身份驗(yàn)證的 web 客戶端。
• windowsidentity.getcurrent()返回當(dāng)前所執(zhí)行的 win32 線程的安全上下文標(biāo)識。默認(rèn)情況下,該標(biāo)識為 aspnet;這是用于運(yùn)行 asp.net web 應(yīng)用程序的默認(rèn)帳戶。.但是,如果已配置 web 應(yīng)用程序進(jìn)行模擬,該標(biāo)識則表示經(jīng)過身份驗(yàn)證的用戶(如果 iis 匿名身份驗(yàn)證有效,該標(biāo)識為 iusr_machine)。
• thread.currentprincipal返回當(dāng)前所執(zhí)行的 .net 線程(它位于 win32 線程之上)的主體。
更多信息
• 有關(guān) web 應(yīng)用程序配置組合(包括使用模擬和不使用模擬)的asp.net標(biāo)識的詳細(xì)分析,請參閱“asp.net identity matrix”。
• 有關(guān)創(chuàng)建您自己的iprincipal實(shí)現(xiàn)的詳細(xì)信息,請參閱“asp.net 安全性”和“how to implement iprincipal”。
remoting 與 web 服務(wù)
在.net framework, 的最新版本中,remoting 與 web 服務(wù)沒有自己的安全模型。它們都繼承 iis 和 asp.net 的安全功能。
雖然遠(yuǎn)程處理體系結(jié)構(gòu)中沒有內(nèi)置的安全功能,但在設(shè)計(jì)時(shí)考慮到了安全性。開發(fā)人員和/或管理員可以自行決定在遠(yuǎn)程處理應(yīng)用程序中集成一定程度的安全性。是否在遠(yuǎn)程處理邊界之間傳遞主體對象取決于客戶端和遠(yuǎn)程對象的位置,例如:
• 同一進(jìn)程內(nèi)的遠(yuǎn)程處理。在同一應(yīng)用程序域或不同的應(yīng)用程序域內(nèi)的對象之間使用遠(yuǎn)程處理時(shí),遠(yuǎn)程處理基礎(chǔ)結(jié)構(gòu)將與調(diào)用方上下文相關(guān)的 iprincipal 對象的引用復(fù)制到接收方的上下文中。
• 進(jìn)程之間的遠(yuǎn)程處理。在這種情況下,不在進(jìn)程之間傳送 iprincipal 對象。用于構(gòu)造原始 iprincipal 的證書必須傳送到遠(yuǎn)程進(jìn)程,該進(jìn)程可能位于另一臺計(jì)算機(jī)上。這就使得遠(yuǎn)程計(jì)算機(jī)能夠根據(jù)提供的證書來構(gòu)造相應(yīng)的 iprincipal 對象。
小結(jié)
本章介紹了與 .net 相關(guān)的各種技術(shù)提供的所有身份驗(yàn)證和授權(quán)選項(xiàng)。也介紹了 .net framework 安全性,以及主體和標(biāo)識對象,這些是 asp.net 驗(yàn)證的核心內(nèi)容。.
通過在整個(gè) .net 應(yīng)用程序中使用多個(gè)網(wǎng)關(guān)守衛(wèi),您將能夠?qū)崿F(xiàn)縱深防御安全策略。概括起來,有以下幾點(diǎn):
• asp.net 應(yīng)用程序可以使用 windows 和 iis 提供的現(xiàn)有安全功能。
• ssl 和 ipsec 可用來在 .net 應(yīng)用程序的各層上(例如,從瀏覽器到數(shù)據(jù)庫)聯(lián)合提供安全通信。
• 使用基本或窗體身份驗(yàn)證時(shí),可使用 ssl 保護(hù)通過網(wǎng)絡(luò)傳遞的明文證書。
• 建立在 .net framework 版本1之上的 asp.net 應(yīng)用程序必須作為完全可信的應(yīng)用程序運(yùn)行,這意味著代碼訪問安全性對服務(wù)器端web應(yīng)用程序開發(fā)人員來說使用范圍有限。.net framework 1.1 版本將提供部分信任的 web 應(yīng)用程序,在此 cas 變得更為重要。
• .net 使用windowsprincipal 和 windowsidentity 類的組合來表示已經(jīng)過 windows 身份驗(yàn)證的用戶。
• genericprincipal 和 genericidentity 或 formsidentity 類用于表示已由非 windows 身份驗(yàn)證方案(如窗體身份驗(yàn)證)驗(yàn)證過的用戶。
• 您可以通過創(chuàng)建實(shí)現(xiàn) iprincipal 和 iidentity 的類來創(chuàng)建自己的主體和標(biāo)識實(shí)現(xiàn)。
• 在asp.net應(yīng)用程序內(nèi),表示經(jīng)過身份驗(yàn)證的用戶的 iprincipal 對象使用 httpcontext.user 屬性與當(dāng)前的 http web 請求關(guān)聯(lián)。
• 關(guān)口是應(yīng)用程序內(nèi)的訪問控制點(diǎn),獲得授權(quán)的用戶可以通過這些訪問控制點(diǎn)訪問資源或服務(wù)。網(wǎng)關(guān)守衛(wèi)負(fù)責(zé)控制對關(guān)口的訪問。
• 使用多個(gè)網(wǎng)關(guān)守衛(wèi)可以提供縱深防御安全策略。
• web 服務(wù)和依靠 asp.net 及 iis 提供底層安全性服務(wù)的.net remoting。