<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    鷹翔宇空

    學(xué)習(xí)和生活

    BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
      110 Posts :: 141 Stories :: 315 Comments :: 1 Trackbacks
    原文引自:
    http://www.microsoft.com/china/msdn/library/architecture/architecture/architecturetopic/SCArchDeGuide/Chapter1Introduction.mspx

    第 5 章 — 安全性考慮事項(xiàng)

    發(fā)布日期: 8/20/2004 | 更新日期: 8/20/2004

    智能客戶端體系結(jié)構(gòu)與設(shè)計指南

    David Hill, Brenton Webster, Edward A. Jezierski, Srinath Vasireddy and Mohammad Al-Sabt, Microsoft Corporation; Blaine Wastell, Ascentium Corporation; Jonathan Rasmusson and Paul Gale, ThoughtWorks; and Paul Slater, Wadeware LLC

    相關(guān)鏈接

    Microsoft? patterns & practices http://www.microsoft.com/resources/practices/default.mspx

    .NET 的應(yīng)用程序體系結(jié)構(gòu):設(shè)計應(yīng)用程序和服務(wù)http://msdn.microsoft.com/library/en-us/dnbda/html/distapp.asp

    摘要:本章介紹智能客戶端的安全性問題。智能客戶端將邏輯和數(shù)據(jù)分布到客戶端計算機(jī);因此需要考慮的安全性和與瘦客戶端應(yīng)用程序相關(guān)的安全性是不同的,后者的數(shù)據(jù)和邏輯更多地被限制到服務(wù)器。本章討論智能客戶端應(yīng)用程序中的數(shù)據(jù)安全性、身份驗(yàn)證、授權(quán)以及代碼訪問角色的安全性。

    *
    本頁內(nèi)容
    身份驗(yàn)證 身份驗(yàn)證
    授權(quán) 授權(quán)
    輸入驗(yàn)證 輸入驗(yàn)證
    處理敏感數(shù)據(jù) 處理敏感數(shù)據(jù)
    代碼訪問安全 代碼訪問安全
    小結(jié) 小結(jié)

    智能客戶端是分布式應(yīng)用程序,通常跨越多種不同的產(chǎn)品和技術(shù)。管理這些應(yīng)用程序中的安全性是一件極具挑戰(zhàn)性的事情。在服務(wù)器端,需要采用一種方法來保護(hù)網(wǎng)絡(luò)、服務(wù)器本身及其應(yīng)用程序。在客戶端,應(yīng)集中于利用平臺(其中包括操作系統(tǒng)和 Microsoft? .NET Framework)的安全特性、客戶端代碼可以執(zhí)行的特權(quán)操作(代碼訪問安全)以及與服務(wù)器平臺(域)和服務(wù)器應(yīng)用程序的交互。

    有效的安全性取決于深層防御方法。在保護(hù)智能客戶端時,考慮安全性的各個方面非常重要,其中包括以下幾個方面:

    ?

    身份驗(yàn)證。這唯一地標(biāo)識了客戶端應(yīng)用程序的用戶,從而只有經(jīng)過認(rèn)可的用戶才能訪問應(yīng)用程序的全部或部分。

    ?

    授權(quán)。這確定唯一標(biāo)識的用戶可以執(zhí)行的操作。這些操作可以是任務(wù),也可以是對授予經(jīng)過身份驗(yàn)證的用戶訪問權(quán)限的資源進(jìn)行的操作。

    ?

    數(shù)據(jù)驗(yàn)證。這確保只有適當(dāng)?shù)暮陀行У臄?shù)據(jù)才能被應(yīng)用程序接受。如果允許任何用戶輸入而不首先驗(yàn)證數(shù)據(jù),則攻擊者就可以通過插入惡意的輸入來危及應(yīng)用程序的安全。

    ?

    保護(hù)敏感數(shù)據(jù)。這意味著確保應(yīng)用程序存儲和傳輸?shù)拿舾袛?shù)據(jù)(例如密碼或機(jī)密的商業(yè)數(shù)據(jù))是安全的。對敏感數(shù)據(jù)進(jìn)行加密可以確保數(shù)據(jù)不可能以明文形式獲得;取決于算法的選擇,這還可以確保信息不會被篡改,從而維護(hù)其完整性。

    ?

    審核和日志記錄。這包括保存對事件和用戶操作的記錄。應(yīng)該考慮將關(guān)鍵的用戶操作或活動記錄在服務(wù)器上,或者安全地記錄在客戶端上,因?yàn)榭蛻舳擞嬎銠C(jī)上的日志可能被篡改或清除。

    ?

    異常管理。這確保應(yīng)用程序適當(dāng)?shù)靥幚懋惓:褪。⑶曳祷赜脩粲押玫姆敲舾行畔ⅰ.惓T敿?xì)信息可以記錄到事件日志或應(yīng)用程序日志中。

    ?

    更改和配置管理。這確保跟蹤 IT 環(huán)境的配置以及對其進(jìn)行的任何更改。通過這樣做,可以查看是否出現(xiàn)任何未經(jīng)授權(quán)的更改,并且確定任何經(jīng)授權(quán)的更改所涉及的安全性含義。

    本章詳細(xì)描述了在設(shè)計智能客戶端應(yīng)用程序時將會面臨的一些關(guān)鍵安全性問題,具體來說,重點(diǎn)介紹了身份驗(yàn)證、授權(quán)、數(shù)據(jù)驗(yàn)證和保護(hù)敏感數(shù)據(jù)。同時,本章還介紹了代碼訪問安全,它是 .NET Framework 中的一項(xiàng)關(guān)鍵技術(shù),用于管理代碼級而非用戶級安全性。

    在檢驗(yàn)智能客戶端安全性時還需要考慮的另一個重要方面是如何部署智能客戶端。有關(guān)影響部署的安全性問題的詳細(xì)信息,請參閱第 7 章:智能客戶端的部署與更新

    在應(yīng)用程序中使用的任何代碼都應(yīng)該使用 FxCop 進(jìn)行分析。通過這個工具,可以檢查托管代碼程序集是否符合 .NET Framework 設(shè)計指導(dǎo)原則,其中包括符合基本級別的安全性。可以從 GotDotNet 站點(diǎn) http://www.gotdotnet.com/team/fxcop/ 下載 FxCop。

    身份驗(yàn)證

    身份驗(yàn)證是通過檢驗(yàn)他的或她的憑據(jù)來唯一標(biāo)識用戶的過程。當(dāng)用戶試圖運(yùn)行或安裝應(yīng)用程序時,或者當(dāng)應(yīng)用程序建立到遠(yuǎn)程服務(wù)的連接或訪問本地保存的數(shù)據(jù)時,都可能需要用戶身份驗(yàn)證。

    這一節(jié)分析智能客戶端常見的一些身份驗(yàn)證方案,介紹對網(wǎng)絡(luò)調(diào)用進(jìn)行身份驗(yàn)證的幾種不同方式,并討論如何收集用戶憑據(jù)和在脫機(jī)時檢驗(yàn)這些憑據(jù)。

    智能客戶端身份驗(yàn)證方案

    取決于智能客戶端應(yīng)用程序的樣式和功能,在用戶與應(yīng)用程序交互的過程中,可能需要在一個或多個階段對用戶進(jìn)行身份驗(yàn)證。對用戶進(jìn)行身份驗(yàn)證可供選擇的階段有四個:

    ?

    在應(yīng)用程序安裝時

    ?

    在應(yīng)用程序運(yùn)行時

    ?

    在用戶訪問本地保存的敏感數(shù)據(jù)時

    ?

    在用戶通過網(wǎng)絡(luò)訪問外部服務(wù)時

    經(jīng)過身份驗(yàn)證的安裝

    如果應(yīng)用程序是集中部署的(例如,使用無接觸部署),則可能需要保護(hù) Web 服務(wù)器上的應(yīng)用程序,以便只有經(jīng)過授權(quán)的用戶才能安裝它們。這些用戶必須首先經(jīng)過 Web 服務(wù)器的身份驗(yàn)證,Web 服務(wù)器查看他們是否被授權(quán)訪問該應(yīng)用程序和將其下載到他們的客戶端計算機(jī)上。

    保護(hù)對無接觸部署的智能客戶端應(yīng)用程序的訪問與保護(hù)任何其他位于 Web 服務(wù)器的構(gòu)件(例如 Web 頁面)相似。Microsoft Internet Information Services (IIS) 提供了許多身份驗(yàn)證機(jī)制,例如集成 Windows、摘要或基本身份驗(yàn)證。

    如果使用無接觸部署并且應(yīng)用程序使用配置文件來存儲它的配置設(shè)置,則不適合使用摘要和基本身份驗(yàn)證,因?yàn)?.NET Framework 不能使用這些機(jī)制自動下載配置文件。

    在選擇適當(dāng)?shù)纳矸蒡?yàn)證機(jī)制并且 IIS 可以根據(jù)他的或她的憑據(jù)標(biāo)識用戶之后,就可以通過設(shè)置應(yīng)用程序和程序集文件上的文件權(quán)限來保護(hù)應(yīng)用程序及其依賴程序集。為了簡化對大量用戶的管理,可以考慮提供對 Microsoft Windows 組(例如 SmartClientAppUsers)的訪問,并將各個用戶放在這個組中。

    所有需要進(jìn)行身份驗(yàn)證的用戶都必須具有服務(wù)器上的 Windows 標(biāo)識,這樣 IIS 就可以保護(hù)對應(yīng)用程序及其程序集的訪問,但是他們未必需要使用這一標(biāo)識登錄到他們的客戶端計算機(jī)上。如果用戶的登錄帳戶不為服務(wù)器端所知,則當(dāng)他或她單擊指向應(yīng)用程序的可執(zhí)行文件的鏈接時,系統(tǒng)就會提示用戶輸入用戶名和密碼。

    如果使用集成 Windows 身份驗(yàn)證,則系統(tǒng)就會自動使用已登錄用戶的憑據(jù)來嘗試獲取對應(yīng)用程序的訪問權(quán)限。當(dāng)用戶通過為客戶端和服務(wù)器所共有的標(biāo)識登錄時,就可以進(jìn)行無縫且安全的訪問。

    經(jīng)過身份驗(yàn)證的應(yīng)用程序訪問

    對安裝應(yīng)用程序的用戶進(jìn)行身份驗(yàn)證可以確保,只有經(jīng)過身份驗(yàn)證和授權(quán)的用戶才能從中心位置運(yùn)行應(yīng)用程序。然而,因?yàn)閼?yīng)用程序及其依賴構(gòu)件可能緩存在客戶端計算機(jī)上,所以不能在應(yīng)用程序每次運(yùn)行時都依賴于這一機(jī)制來對用戶進(jìn)行身份驗(yàn)證。在這種情況下,或者當(dāng)用戶有意在本地部署應(yīng)用程序時,就需要仔細(xì)考慮如何通過應(yīng)用程序?qū)τ脩暨M(jìn)行身份驗(yàn)證。可能需要在用戶每次運(yùn)行應(yīng)用程序時就對他們進(jìn)行身份驗(yàn)證,特別是如果應(yīng)用程序提供敏感功能,或者需要能夠撤消用戶在任何時候運(yùn)行應(yīng)用程序的授權(quán)。

    在用戶使用為客戶端和服務(wù)器所共有的標(biāo)識登錄到客戶端計算機(jī)的情況下,可以依賴用戶能夠登錄客戶端計算機(jī)的事實(shí),并以此作為對運(yùn)行應(yīng)用程序的充分身份驗(yàn)證。通過這種方法,可以使用 Microsoft Windows 操作系統(tǒng)來提供用戶身份驗(yàn)證,從而使得不必需要用代碼實(shí)現(xiàn)用戶身份驗(yàn)證。另外,因?yàn)?Windows 可以在脫機(jī)時緩存用戶憑據(jù),所以您不需要自己緩存它們。

    對于您對用戶訪問沒有任何控制的客戶端計算機(jī)(例如您的組織的 intranet 外的客戶端計算機(jī)),您可能需要采用一種自定義身份驗(yàn)證機(jī)制來收集用戶憑據(jù),并且根據(jù)遠(yuǎn)程安全性授權(quán)對他們進(jìn)行身份驗(yàn)證。如果應(yīng)用程序能夠脫機(jī)操作,您就需要在客戶端緩存有效的憑據(jù),這樣,當(dāng)他或她啟動應(yīng)用程序時,您就可以根據(jù)它們重新對用戶進(jìn)行身份驗(yàn)證。您應(yīng)該定期強(qiáng)制執(zhí)行聯(lián)機(jī)重新身份驗(yàn)證,這樣就可以防止對這樣的應(yīng)用程序的無限制使用。

    經(jīng)過身份驗(yàn)證的本地數(shù)據(jù)訪問

    智能客戶端應(yīng)用程序常常緩存從遠(yuǎn)程服務(wù)獲得的數(shù)據(jù)(例如,為了提高響應(yīng)速度或者為了支持脫機(jī)功能)。如果數(shù)據(jù)是敏感的,則可能需要在授予用戶訪問數(shù)據(jù)的權(quán)限之前對其進(jìn)行身份驗(yàn)證。在這種情況下,可以選擇允許未經(jīng)身份驗(yàn)證的用戶運(yùn)行應(yīng)用程序,但是需要在授予用戶訪問敏感數(shù)據(jù)的權(quán)限之前對其進(jìn)行充分的身份驗(yàn)證和授權(quán)。

    注確保只有授權(quán)用戶訪問的數(shù)據(jù)才能在本地緩存非常重要。如果數(shù)據(jù)是敏感的,則還需要確保采取足夠的措施來保證數(shù)據(jù)的安全。詳細(xì)信息請參閱本章后面的“處理敏感數(shù)據(jù)”。本地保存的數(shù)據(jù)應(yīng)該保存在安全的位置并進(jìn)行加密。不管如何對用戶進(jìn)行身份驗(yàn)證,通常都需要以某種方式使用他們的憑據(jù)來訪問和解密數(shù)據(jù)。

    您可能能夠使用用于登錄到客戶端計算機(jī)的默認(rèn)憑據(jù),也可能需要獲得自定義憑據(jù)來根據(jù)遠(yuǎn)程安全性授權(quán)對用戶進(jìn)行身份驗(yàn)證。對于在 intranet 環(huán)境中運(yùn)行的應(yīng)用程序,前一種方式最為合適,而對于在 Internet 或外部網(wǎng)環(huán)境中運(yùn)行的應(yīng)用程序,由于用戶通常不在與他們訪問的遠(yuǎn)程服務(wù)相同的域中,所以后一種方式比較合適。使用集成 Windows 身份驗(yàn)證的一個好處是,操作系統(tǒng)可以對用戶進(jìn)行身份驗(yàn)證,保護(hù)應(yīng)用程序和本地數(shù)據(jù),并且可以在用戶脫機(jī)時緩存用戶憑據(jù)。

    有關(guān)在本地緩存敏感數(shù)據(jù)的詳細(xì)信息,請參閱本章后面的“處理敏感數(shù)據(jù)”。

    經(jīng)過身份驗(yàn)證的網(wǎng)絡(luò)訪問

    您可能會選擇支持對應(yīng)用程序的匿名訪問并允許任何用戶下載和運(yùn)行它。然而,在應(yīng)用程序運(yùn)行在客戶端之后,它通常需要通過網(wǎng)絡(luò)訪問遠(yuǎn)程服務(wù)(例如 Web 服務(wù))以獲得數(shù)據(jù)和服務(wù)。

    通常需要保護(hù)對網(wǎng)絡(luò)數(shù)據(jù)和服務(wù)的訪問,以防止未經(jīng)授權(quán)的訪問。保護(hù)遠(yuǎn)程服務(wù)訪問的方式可能有許多種,但通常需要將用戶憑據(jù)傳送到遠(yuǎn)程服務(wù),以便它可以執(zhí)行用戶身份驗(yàn)證。

    當(dāng)用戶通過網(wǎng)絡(luò)訪問遠(yuǎn)程服務(wù)時對他們進(jìn)行身份驗(yàn)證是一項(xiàng)非常重要的內(nèi)容。本章后面的“網(wǎng)絡(luò)訪問身份驗(yàn)證類型”比較完整地描述了確保對網(wǎng)絡(luò)服務(wù)調(diào)用進(jìn)行身份驗(yàn)證的一些選擇。

    選擇正確的身份驗(yàn)證模型

    前一節(jié)描述了您可能選擇用來對用戶進(jìn)行身份驗(yàn)證的四個階段。您可能選擇在一個或多個階段對用戶進(jìn)行身份驗(yàn)證,這取決于您的應(yīng)用程序及其功能的性質(zhì)。選擇正確的階段是非常重要的,它既可以幫助確保應(yīng)用程序和數(shù)據(jù)的安全,又可以將對應(yīng)用程序的使用的任何影響降低到最低限度。

    如果您的應(yīng)用程序是集中部署的(例如,如果使用無接觸部署進(jìn)行部署,或者部署到文件共享),則您可能選擇將訪問僅限于經(jīng)過授權(quán)的用戶。如果您想讓您的應(yīng)用程序?qū)θ魏蜗胍褂盟娜硕伎捎茫瑒t不需要在安裝應(yīng)用程序時對用戶進(jìn)行身份驗(yàn)證。

    客戶端計算機(jī)通常在物理上并不安全,甚至可能能夠進(jìn)行公開訪問。如果是這種情況,并且應(yīng)用程序提供敏感功能,則往往需要在應(yīng)用程序運(yùn)行時對用戶進(jìn)行身份驗(yàn)證。如果應(yīng)用程序提供的是匿名用戶可用的常規(guī)功能,則不需要在這一階段對用戶進(jìn)行身份驗(yàn)證。然而,您可能會選擇給匿名用戶提供應(yīng)用程序的部分功能,但是需要在允許他們訪問更多受限功能之前對其進(jìn)行身份驗(yàn)證。

    保護(hù)對本地保存的敏感數(shù)據(jù)的訪問非常重要。如果應(yīng)用程序部署在物理上不安全或者可以公開訪問的設(shè)備上,則應(yīng)該對敏感數(shù)據(jù)進(jìn)行保護(hù),并且只有經(jīng)過身份驗(yàn)證和授權(quán)的用戶才能訪問它們。應(yīng)用程序可以給匿名用戶提供常規(guī)功能,但是在用戶試圖訪問敏感數(shù)據(jù)時需要對他們進(jìn)行身份驗(yàn)證。

    在應(yīng)用程序脫機(jī)運(yùn)行時,使用集成 Windows 身份驗(yàn)證也有好處。在這種情況下,Windows 緩存用戶憑據(jù),以便當(dāng)用戶登錄到脫機(jī)客戶端計算機(jī)時對他(她)進(jìn)行身份驗(yàn)證。如果您需要在應(yīng)用程序運(yùn)行或訪問本地保存的敏感數(shù)據(jù)時對用戶進(jìn)行身份驗(yàn)證,則這一行為使得您的客戶端不需要對用戶進(jìn)行身份驗(yàn)證。

    網(wǎng)絡(luò)訪問身份驗(yàn)證類型

    有許多不同的技術(shù)可以用來在用戶訪問遠(yuǎn)程服務(wù)時對其進(jìn)行身份驗(yàn)證,其中包括:

    ?

    集成 Windows 身份驗(yàn)證。

    ?

    HTTP 基本身份驗(yàn)證。

    ?

    HTTP 摘要身份驗(yàn)證。

    ?

    基于證書的身份驗(yàn)證。

    ?

    基于 Web Services Enhancements (WSE) 的身份驗(yàn)證。

    ?

    自定義身份驗(yàn)證。

    集成 Windows 身份驗(yàn)證

    對于集成 Windows 身份驗(yàn)證,用戶是通過使用有效的 Windows 帳戶登錄到他的或她的計算機(jī)來進(jìn)行身份驗(yàn)證的。憑據(jù)可以是本地帳戶(對于計算機(jī)來說,帳戶是本地的)或域帳戶(Windows 域的有效成員)。在用戶的整個會話期間,應(yīng)用程序都可以透明地使用登錄時所建立的標(biāo)識來訪問資源。這意味著應(yīng)用程序可以用一種安全的方式提供對網(wǎng)絡(luò)資源(例如 Web 服務(wù))的無縫訪問,而不必提示用戶輸入其他憑據(jù)或重復(fù)輸入憑據(jù)。

    只有當(dāng)網(wǎng)絡(luò)資源也使用集成 Windows 身份驗(yàn)證時,對網(wǎng)絡(luò)資源的訪問才是無縫的。

    集成 Windows 身份驗(yàn)證使用以下兩種身份驗(yàn)證協(xié)議中的一種:Kerberos 或 NTLM。這兩種技術(shù)都不通過網(wǎng)絡(luò)傳送用戶名和密碼組合來對用戶進(jìn)行身份驗(yàn)證或驗(yàn)證。因此,您的應(yīng)用程序或基礎(chǔ)結(jié)構(gòu)在傳輸?shù)倪^程中不必提供附加的安全性來管理憑據(jù)。

    依賴于 Windows 安全性的客戶端應(yīng)用程序使用名為 WindowsIdentityIIdentity 接口的實(shí)現(xiàn)。

    .NET Framework 也提供緊密相關(guān)的 IPrincipal 接口。有關(guān) IIdentity 和 IPrincipal 接口的更多詳細(xì)信息,請參閱本章后面的“授權(quán)”。

    使用集成 Windows 身份驗(yàn)證的 Web 服務(wù)

    對于為集成 Windows 身份驗(yàn)證配置的 Web 服務(wù),客戶端應(yīng)用程序可以在調(diào)用 Web 服務(wù)之前提供當(dāng)前登錄的用戶的憑據(jù)來進(jìn)行身份驗(yàn)證。當(dāng)從 Microsoft Visual Studio .NET 開發(fā)系統(tǒng)將引用添加到應(yīng)用程序中的 Web 服務(wù)時,系統(tǒng)會自動生成一個代理類并將其添加到項(xiàng)目中,以便通過編程方式訪問 Web 服務(wù)。下面的代碼演示了如何設(shè)置當(dāng)前登錄的用戶的用戶憑據(jù)。

    MyService service = new MyService();  // A proxy for a web service. 
    service.Credentials = CredentialCache.DefaultCredentials; 
    service.SomeServiceMethod();          // Call the web service. 
    

    在本例中,DefaultCredentials 使用應(yīng)用程序正在其中運(yùn)行的安全性上下文,它通常是運(yùn)行應(yīng)用程序的用戶的 Windows 憑據(jù)(用戶名、密碼和域)。

    HTTP 基本身份驗(yàn)證

    HTTP 基本身份驗(yàn)證是由 IIS 提供的。在進(jìn)行基本身份驗(yàn)證時,IIS 會提示用戶輸入一個有效的 Windows 帳戶和密碼。這一組合是作為經(jīng)過編碼的明文從客戶端傳送到服務(wù)器,并用于在 Web 服務(wù)器上對用戶進(jìn)行身份驗(yàn)證。

    為了保護(hù)基本身份驗(yàn)證,您需要保護(hù)客戶端和服務(wù)器之間的通信信道(例如,通過啟用服務(wù)器上的安全套接字層 [SSL]),以確保用戶名/密碼組合被加密并且在傳輸時不會被篡改或截獲。同時,您還需要保護(hù)位于服務(wù)器上的密碼。然而,SSL 只能保護(hù)兩個已定義的終結(jié)點(diǎn)之間的通信。如果您需要保護(hù)兩個以上的終結(jié)點(diǎn)之間的通信,則需要使用基于消息的安全性。

    使用基本身份驗(yàn)證的 Web 服務(wù)

    對于與為基本身份驗(yàn)證配置的 Web 服務(wù)交互的客戶端應(yīng)用程序,客戶端可以使用登錄對話框來接受有效的用戶憑據(jù),并用它來進(jìn)行身份驗(yàn)證。下面的代碼演示了如何為需要基本身份驗(yàn)證的 Web 服務(wù)代理設(shè)置用戶憑據(jù)。

    CredentialCache cache = new CredentialCache(); 
    cache.Add( new Uri( service.Url ),     // Web service URL. 
       "Basic",                    // Basic Authentication. 
       new NetworkCredential( userName, password, domain ) ); 
    service.Credentials = cache; 
    

    在本例中,userName、password 和 domain 是作為登錄對話框的一部分被接受的。

    HTTP 摘要身份驗(yàn)證

    HTTP 摘要身份驗(yàn)證提供與 HTTP 基本身份驗(yàn)證相同的功能,但是采用不同的方式來傳輸身份驗(yàn)證憑據(jù)。身份驗(yàn)證憑據(jù)是在一種稱為哈希 的單向處理中進(jìn)行轉(zhuǎn)換的。這種處理的結(jié)果稱為哈希 或 消息摘要,使用當(dāng)前的技術(shù)不可能對其進(jìn)行解密。

    摘要身份驗(yàn)證按照以下過程進(jìn)行:

    1.

    服務(wù)器給瀏覽器發(fā)送將在身份驗(yàn)證過程中使用的特定信息。

    2.

    瀏覽器將此信息以及一些其他信息添加到它的用戶名和密碼中,然后對其進(jìn)行哈希運(yùn)算。附加信息有助于防止有人復(fù)制哈希值并再次使用它。

    3.

    得到的哈希連同附加信息以明文的方式通過網(wǎng)絡(luò)發(fā)送到服務(wù)器。

    4.

    服務(wù)器將附加信息添加到它所擁有的客戶端密碼的明文副本中,并對所有的信息進(jìn)行哈希。

    5.

    服務(wù)器將它接收到的哈希值與它剛產(chǎn)生的哈希值進(jìn)行比較。

    6.

    只有當(dāng)兩個值相同時才授予訪問權(quán)限。

    附加信息是在哈希之前添加到密碼中的,這樣就沒有人可以捕獲密碼哈希并利用它來冒充真實(shí)客戶端。幫助標(biāo)識客戶端、客戶端計算機(jī)和客戶端所屬的領(lǐng)域或域的值也被添加到密碼中。同時添加的還有時間戳,以防止客戶端在密碼被撤消后還使用密碼。

    因?yàn)檎矸蒡?yàn)證以哈希形式通過網(wǎng)絡(luò)發(fā)送密碼,所以它明顯優(yōu)于基本身份驗(yàn)證,特別是在使用基本身份驗(yàn)證而沒有對通信信道進(jìn)行加密時。因此,如果可能,您應(yīng)該使用摘要身份驗(yàn)證來代替基本身份驗(yàn)證。

    如同基本身份驗(yàn)證的情況一樣,只有在向其發(fā)出請求的域服務(wù)器有請求用戶的密碼的明文副本時,摘要身份驗(yàn)證才完成。因?yàn)橛蚩刂破饔忻艽a的明文副本,所以您必須確保該服務(wù)器是安全的,不會受到物理和網(wǎng)絡(luò)攻擊。

    基于證書的身份驗(yàn)證

    通過使用證書,客戶端和服務(wù)器應(yīng)用程序可以使用計算機(jī)上安裝的數(shù)字密鑰相互進(jìn)行身份驗(yàn)證,或建立安全連接。客戶端應(yīng)用程序可以使用客戶端證書來向服務(wù)器標(biāo)識自己,同樣,服務(wù)器也可以使用服務(wù)器證書來向客戶端標(biāo)識自己。一個雙方都信任的第三方(稱為證書頒發(fā)機(jī)構(gòu))可以確認(rèn)這些證書的標(biāo)識。客戶端證書可以映射到 Microsoft Active Directory? 目錄服務(wù)中的 Microsoft Windows 帳戶。

    您可以建立一個站點(diǎn),使沒有證書的用戶以來賓身份登錄,而有證書的用戶以他的或她的證書所映射的用戶的身份登錄。然后,您可以基于該證書自定義站點(diǎn)。

    如果您需要對單個用戶進(jìn)行身份驗(yàn)證,您可以使用一種稱為“一對一映射”的技術(shù),這種技術(shù)會將證書映射到單個帳戶。如果您需要對來自特定組或組織的所有用戶進(jìn)行身份驗(yàn)證,您可以使用多對一映射,例如,它可以將包含共同的公司名稱的所有證書映射到單個帳戶。

    在基于證書的身份驗(yàn)證中,客戶端應(yīng)用程序使用的是可以由 Web 服務(wù)進(jìn)行身份驗(yàn)證的證書。在這種情況中,客戶端應(yīng)用程序使用 X.509 證書來對 SOAP 消息進(jìn)行數(shù)字簽名,以確保消息來自受信任的來源,并且在到達(dá)指定的 Web 服務(wù)之前沒有在傳輸?shù)倪^程中被篡改。

    基于證書的身份驗(yàn)證的一個主要考慮事項(xiàng)是如何處理證書將不再有效的情況。例如,如果一個雇員使用證書來進(jìn)行身份驗(yàn)證,之后該雇員被解雇了,則此證書應(yīng)該不再允許該用戶訪問資源。因此,證書安全性基礎(chǔ)結(jié)構(gòu)包括對證書撤消列表的管理非常重要。這些列表放在服務(wù)器上,每當(dāng)客戶端連接到網(wǎng)絡(luò)資源時都將進(jìn)行檢查。

    當(dāng)智能客戶端脫機(jī)工作時,不能對基于服務(wù)器的撤消列表進(jìn)行檢查,因此一個不能訪問服務(wù)器上的資源的用戶有可能對客戶端上的資源進(jìn)行本地訪問。為了幫助解決這個問題,您可以選擇相對短的客戶端證書租約時間。短的租約時間會強(qiáng)制客戶端定期連接到證書服務(wù)器,并且在續(xù)訂租約和允許連接到服務(wù)器端應(yīng)用程序之前確認(rèn)證書尚未撤消。

    有關(guān)詳細(xì)信息,請參閱 http://www.microsoft.com/resources/documentation/windowsserv/2003/standard/proddocs/en-us/sec_auth_certabout.asp 上的“About Certificates”。

    基于 WSE 的身份驗(yàn)證

    使用 Web Services Enhancements 版本 2.0,可以通過編程方式簽署 Web 服務(wù)的 SOAP 消息。WSE 2.0 是一個實(shí)現(xiàn),它支持各種新興的 Web 服務(wù)標(biāo)準(zhǔn),例如 WS-Security、WS-SecureConversation、WS-Trust、WS-Policy、WS-Addressing、WS-Referral、WS-Attachments 和 Direct Internet Message Encapsulation (DIME)。WSE 提供一種編程模型來實(shí)現(xiàn)它所支持的各種規(guī)范。

    使用 WSE 的客戶端應(yīng)用程序可以使用 X509CertificateStore 類中的某種 Find 方法(例如 FindCertificateByHashFindCertificateByKeyIdentifier)通過編程方式從存儲區(qū)中選擇一個證書,使用該證書創(chuàng)建數(shù)字簽名,將其添加到 WS-Security SOAP 頭并調(diào)用 Web 服務(wù)。另外,客戶端應(yīng)用程序還可以選擇打開當(dāng)前登錄用戶的證書存儲區(qū),如下面的代碼示例所示。

    X509CertificateStore store; 
    store = X509CertificateStore.CurrentUserStore( X509CertificateStore.MyStore ); 
    bool open = store.OpenRead(); 
    

    有關(guān)詳細(xì)信息,請參閱 http://msdn.microsoft.com/webservices/building/wse/default.aspx 上的“Web Services Enhancements”。

    有關(guān)使用客戶端證書的詳細(xì)信息,請參閱 WSE 2.0 文檔中的“Signing a SOAP Message Using an X.509 Certificate”。

    自定義身份驗(yàn)證

    在某些情況下,Windows 提供的標(biāo)準(zhǔn)身份驗(yàn)證選擇并不適用于您的應(yīng)用程序,您將可能需要設(shè)計您自己的身份驗(yàn)證形式。幸運(yùn)的是,.NET Framework 提供了一些選擇來幫助您設(shè)計自定義身份驗(yàn)證解決方案。

    .NET Framework 支持 IIdentity 的一個實(shí)現(xiàn),稱為 GenericIdentity。您可以使用 GenericIdentity,也可以創(chuàng)建您自己的自定義標(biāo)識類。設(shè)計自定義身份驗(yàn)證解決方案可能比較困難,因?yàn)槟仨氉约翰扇〈胧﹣泶_保方法是安全的。您可能還需要為您的標(biāo)識維護(hù)單獨(dú)的存儲區(qū)。

    收集和驗(yàn)證用戶憑據(jù)

    不管您使用的是什么形式的身份驗(yàn)證,您都需要收集用戶憑據(jù),然后可以對其進(jìn)行驗(yàn)證。對于已經(jīng)使用集成 Windows 身份驗(yàn)證登錄的用戶,您可能只需收集現(xiàn)有的憑據(jù),而對于自定義身份驗(yàn)證解決方案,您可能需要通過您自己的登錄對話框來安全地收集憑據(jù)。

    不要將用戶憑據(jù)存儲在代碼中超過必要的時間。特別是,不要用全局變量存儲憑據(jù),它們是通過可公開訪問的方法或?qū)傩蕴峁┰L問的,另外,也不要將憑據(jù)保存在磁盤上。

    收集當(dāng)前登錄的用戶的憑據(jù)

    如果您使用的是集成 Windows 身份驗(yàn)證,則您的用戶是在他們的 Windows 會話開始時登錄的。然后,您的應(yīng)用程序可以使用這一信息來確保他們具有適當(dāng)?shù)膽{據(jù)用于運(yùn)行。

    下面的代碼演示了基本功能。

    using System.Security.Principal; 
    // Get principal of the currently logged in user. 
    WindowsPrincipal wp = new WindowsPrincipal( WindowsIdentity.GetCurrent() ); 
    // Display the current user name. 
    label1.Text = "User:" + wp.Identity.Name; 
    // Determine if user is part of a windows group. 
    if( wp.IsInRole( "YourDomain\\YourWindowsGroup" ) ) 
    { 
        // Is a member. 
    } 
    else 
    { 
        // Is not a member. 
    } 
    

    使用登錄對話框收集用戶憑據(jù)

    如果您設(shè)計您自己的登錄對話框接受來自用戶的憑據(jù),則需要采取大量的措施來確保您滿足您的組織的安全性要求(例如強(qiáng)制執(zhí)行強(qiáng)密碼策略和在定期的時間間隔內(nèi)讓密碼過期)。在設(shè)計登錄對話框時,請考慮使用下列指導(dǎo)原則:

    ?

    不要盲目信任用戶輸入。如果您盲目信任用戶輸入,惡意用戶就可能危及您的應(yīng)用程序的安全。例如,如果不對動態(tài)構(gòu)造 SQL 代碼進(jìn)行驗(yàn)證,使用輸入的應(yīng)用程序就容易受到 SQL 插入攻擊。

    ?

    檢查輸入數(shù)據(jù)的類型、格式或范圍。考慮使用正則表達(dá)式來進(jìn)行這些檢查。使用正則表達(dá)式可以檢查類型(例如,字符串或整型)、格式(例如,強(qiáng)制密碼策略要求使用諸如數(shù)字、特殊符號及大小寫字母字符混合等)和范圍(例如,用戶名稱最少包含 6 個字符,最多包含 25 個字符)。

    下面的代碼示例強(qiáng)制要求密碼長度為 8 至 10 個字符,并且是大小寫字母和數(shù)字字符的組合。

    // Validate the user supplied password. 
    if( !Regex.Match( textBox1.Text, 
            @"^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$", 
            RegexOptions.None ).Success ) 
    { 
        // Invalid email address. 
    } 
    
    ?

    在設(shè)計帶有密碼字段文本框的對話框時,請確保 PasswordChar 屬性設(shè)置為當(dāng)文本輸入控件時顯示的字符,如下面的示例所示。

    // The password character is set to asterisk. 
    textBox1.PasswordChar = ?*'; 
    

    身份驗(yàn)證指導(dǎo)原則

    在為應(yīng)用程序設(shè)計身份驗(yàn)證時,應(yīng)該考慮使用下列指導(dǎo)原則:

    ?

    確定在用戶與應(yīng)用程序交互時什么階段需要進(jìn)行身份驗(yàn)證。

    ?

    考慮在用戶登錄到客戶端時使用集成 Windows 身份驗(yàn)證對他們進(jìn)行身份驗(yàn)證,之后用戶就可以訪問應(yīng)用程序、應(yīng)用程序的數(shù)據(jù)和任何遠(yuǎn)程服務(wù)。

    ?

    如果應(yīng)用程序是集中部署的并且需要將訪問僅限于經(jīng)過授權(quán)的用戶,就應(yīng)該在應(yīng)用程序運(yùn)行時使用 IIS 提供的身份驗(yàn)證機(jī)制之一對用戶進(jìn)行身份驗(yàn)證。

    ?

    如果應(yīng)用程序提供敏感功能或者提供對本地保存的敏感數(shù)據(jù)的訪問,則應(yīng)該確保在允許用戶訪問之前對他們進(jìn)行適當(dāng)?shù)纳矸蒡?yàn)證。

    ?

    如果應(yīng)用程序需要自定義身份驗(yàn)證,則應(yīng)該確保應(yīng)用程序強(qiáng)制執(zhí)行強(qiáng)用戶名和密碼策略。作為慣例,應(yīng)該需要最少 8 個字符和大小寫字母字符、數(shù)字和特殊字符的混合。

    ?

    如果遠(yuǎn)程服務(wù)提供敏感功能或者提供對敏感數(shù)據(jù)的訪問,則需要對用戶進(jìn)行身份驗(yàn)證,以便他們通過網(wǎng)絡(luò)訪問遠(yuǎn)程服務(wù)。

    ?

    確保用戶憑據(jù)在沒有保護(hù)措施的情況下不通過網(wǎng)絡(luò)進(jìn)行傳輸。有些身份驗(yàn)證形式根本不通過網(wǎng)絡(luò)傳送用戶憑據(jù),但是如果必須傳送,就應(yīng)該確保它們經(jīng)過加密,或者通過安全連接進(jìn)行傳送。

    有關(guān)詳細(xì)信息,請參閱 Improving Web Application Security: Threats and Countermeasures 的“Chapter 4 — Design Guidelines for Secure Web Applications”中的“身份驗(yàn)證”,地址在 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/THCMCh04.asp

    返回頁首返回頁首

    授權(quán)

    在對用戶進(jìn)行身份驗(yàn)證之后,可以通過授權(quán)來確定他們有權(quán)訪問系統(tǒng)內(nèi)的什么內(nèi)容。授權(quán)是確認(rèn)經(jīng)過身份驗(yàn)證的用戶具有執(zhí)行某種操作的權(quán)限的過程。授權(quán)管理經(jīng)過身份驗(yàn)證的用戶可以訪問的資源(例如,文件和數(shù)據(jù)庫)和可以執(zhí)行的操作(例如,更改密碼或刪除文件)。沒有經(jīng)過身份驗(yàn)證的用戶(即匿名用戶)不能進(jìn)行特別授權(quán),而是需要分配一組默認(rèn)權(quán)限。

    許多因素嚴(yán)格地確定了您可以如何在您的環(huán)境中執(zhí)行授權(quán)。您需要確定是基于應(yīng)用程序的功能還是基于系統(tǒng)資源來管理授權(quán)。您需要確定是執(zhí)行方法內(nèi)的細(xì)粒度授權(quán)還是執(zhí)行方法級的檢查。此外,您還需要確定在何處存儲授權(quán)所需的用戶信息(例如,在 Active Directory 或 Microsoft SQL Server 數(shù)據(jù)庫中)。如果您將允許您的智能客戶端能夠脫機(jī)工作,則需要有對脫機(jī)客戶端進(jìn)行授權(quán)的策略。

    .NET Framework 提供 IPrincipal 接口,它可以與 IIdentity 接口一起,用于定義管理運(yùn)行代碼的安全上下文的屬性和方法。同時提供的還有該接口的兩個實(shí)現(xiàn):WindowsPrincipalGenericPrincipal。使用集成 Windows 身份驗(yàn)證的客戶端應(yīng)用程序使用的是 WindowsPrincipal,而使用自定義身份驗(yàn)證的客戶端應(yīng)用程序使用的是 GenericPrincipal

    授權(quán)的類型

    Windows 操作系統(tǒng)中常用的授權(quán)方法有兩種:基于資源的授權(quán)和基于角色的授權(quán)。基于資源的授權(quán)依賴于訪問控制列表 (ACL),而基于角色的授權(quán)則基于用戶角色執(zhí)行授權(quán)。

    基于資源的授權(quán)

    對于基于資源的授權(quán),可以將任意訪問控制列表 (DACL) 附加到保險對象。然后,系統(tǒng)作出訪問決定,方法是比較令牌中的組成員身份與 ACL 的內(nèi)容,以確定該用戶是否具有所請求的訪問權(quán)限。對于許多類型的應(yīng)用程序,ACL 模型是非常理想的。然而,它并非適合于所有的情況。例如,您可能需要基于業(yè)務(wù)邏輯或者基于在需要時創(chuàng)建的非持久性對象來作出訪問決定。

    基于角色的授權(quán)

    基于角色的授權(quán)允許您將用戶和組與他們完成其工作所需的權(quán)限相關(guān)聯(lián)。當(dāng)將一個用戶或組添加到一個角色中時,該用戶或組就會自動地繼承各種安全權(quán)限。這些權(quán)限可以是執(zhí)行操作的權(quán)限,也可以是訪問各種資源的權(quán)限。圖 5.1 說明了基于角色的授權(quán)中角色與權(quán)限之間的關(guān)系。


    5.1 基于角色的授權(quán)

    在 Microsoft Windows 2000 Server Service Pack 4 (SP4) 和 Windows Server 2003 操作系統(tǒng)中,基于角色的授權(quán)通常是通過授權(quán)管理器管理的。授權(quán)管理器是一組基于 COM 的運(yùn)行時接口、以及用于配置的 Microsoft 管理控制臺 (MMC) 管理單元。開發(fā)人員可以使用授權(quán)管理器確保應(yīng)用程序能夠管理和驗(yàn)證客戶端對執(zhí)行應(yīng)用程序操作的請求,而應(yīng)用程序管理員則可以用它來管理用戶角色和權(quán)限。通過使用授權(quán)管理器,可以將低級操作聚集成稱為“Tasks”的組,并管理這一級別的授權(quán)。同時它還使得您能夠在授權(quán)前后運(yùn)行自定義授權(quán)邏輯。

    授權(quán)管理器的一個顯著優(yōu)點(diǎn)是,它可以從需要授權(quán)的應(yīng)用程序中進(jìn)一步抽象授權(quán)存儲,這意味著開發(fā)人員可以一直與授權(quán)管理器通信,而不管存儲是在 Active Directory 中還是基于文件的。

    給應(yīng)用程序添加授權(quán)功能

    .NET Framework 提供了許多選擇來給應(yīng)用程序添加授權(quán)功能。這些選擇包括:

    ?

    使用 PrincipalPermissionAttribute 執(zhí)行聲明性 Demand

    ?

    使用 PrincipalPermission 對象執(zhí)行命令性 Demand

    ?

    使用 IsInRole 方法執(zhí)行角色檢查。

    ?

    執(zhí)行用于自定義身份驗(yàn)證的角色檢查。

    使用 PrincipalPermissionAttribute 執(zhí)行聲明性 Demand

    可以將 Demand 放在類級或成員級的單個方法、屬性或事件上。如果將聲明性 Demand 同時放在類級和成員級上,則成員級的聲明性 Demand 會重寫(或替換)類級的 Demand。

    下面的代碼示例顯示了 PrincipalPermission 對象的聲明性 Demand。

    // Declarative example. 
    [PrincipalPermissionAttribute( SecurityAction.Demand, Role="Teller" )] 
    void SomeTellerOnlyMethod() 
    { 
    } 
    

    使用 PrincipalPermission 對象執(zhí)行命令性 Demand

    可以執(zhí)行命令性 Demand,方法是通過編程方式調(diào)用 PrincipalPermission 對象的 Demand 方法,如下面的代碼示例所示。

    // Programmatic example. 
    public SomeMethod() 
    { 
        PrincipalPermission permCheck = new PrincipalPermission( null, "Teller" ); 
        permCheck.Demand(); 
        // Only Tellers can execute the following code. 
        // Non members of the Teller role result in a security exception. 
        . . . 
    } 
    

    通過編程方式調(diào)用該方法的一個優(yōu)點(diǎn)是,可以確定主體是否在多個角色中。.NET Framework 不允許以聲明的方式這樣做。下面的代碼示例顯示了如何執(zhí)行這一檢查。

    // Using PrincipalPermission. 
    PrincipalPermission permCheckTellers = new PrincipalPermission( null,  
    "Teller" ); 
    permCheckTellers.Demand(); 
    PrincipalPermission permCheckMgr = new PrincipalPermission( null,  
    "Manager" ); 
    permCheckMgr.Demand(); 
    

    使用 IsInRole 方法執(zhí)行角色檢查

    可以選擇直接訪問主體對象的值并執(zhí)行檢查,而不使用 PrincipalPermission 對象。在這種情況下,可以讀取當(dāng)前線程的主體的值,也可以使用 IsInRole 方法來執(zhí)行授權(quán),如下面的代碼示例所示。

    // Using IsInRole. 
    if ( Thread.CurrentPrincipal.IsInRole( "Teller" ) && 
         Thread.CurrentPrincipal.IsInRole( "Manager" ) ) 
    { 
        // Perform privileged operation. 
    } 
    

    執(zhí)行用于自定義身份驗(yàn)證的角色檢查

    如果應(yīng)用程序不是基于 Windows 的,則可以通過編程方式將一組從自定義身份驗(yàn)證數(shù)據(jù)存儲區(qū)(例如 SQL Server 數(shù)據(jù)庫)中獲得的角色填充 GenericPrincipal 對象,如下面的代碼示例所示。

    GenericIdentity userIdentity = new GenericIdentity( "Bob" ); 
    // Typically role names would be retrieved from a custom data store. 
    string[] roles = new String[]{ "Manager", "Teller" }; 
    GenericPrincipal userPrincipal = new GenericPrincipal( userIdentity, roles ); 
    if ( userPrincipal.IsInRole( "Teller" ) ) 
    { 
        // Perform privileged operation. 
    } 
    

    授權(quán)指導(dǎo)原則

    授權(quán)對控制用戶訪問應(yīng)用程序功能和資源的權(quán)限非常關(guān)鍵。不適當(dāng)?shù)幕蛉醯氖跈?quán)會導(dǎo)致信息泄露和數(shù)據(jù)篡改。請考慮使用下列指導(dǎo)原則:

    ?

    盡可能地使用多個網(wǎng)關(guān)守衛(wèi)以在用戶訪問資源或執(zhí)行操作時強(qiáng)制執(zhí)行授權(quán)檢查。使用客戶端檢查和服務(wù)器上的檢查相結(jié)合的方法來提供深層防御,以防止設(shè)法繞開其中一個網(wǎng)關(guān)守衛(wèi)的惡意用戶的攻擊。服務(wù)器上常見的網(wǎng)關(guān)守衛(wèi)包括 IIS Web 權(quán)限、NTFS 文件系統(tǒng)權(quán)限、Web 服務(wù)文件授權(quán)(只適用于 Windows 身份驗(yàn)證)和主體權(quán)限 Demand。

    ?

    使用用戶的安全上下文授權(quán)訪問系統(tǒng)資源。可以使用基于角色的授權(quán)來基于用戶標(biāo)識和角色成員身份授權(quán)訪問。集成 Windows 身份驗(yàn)證與安全資源(例如文件或注冊表)上的 Windows ACL 共同確定是否允許調(diào)用者訪問資源。對于程序集,可以基于諸如程序集的強(qiáng)名稱或位置等證據(jù)來授權(quán)調(diào)用代碼。

    ?

    確保使用足夠的粒度來定義角色,以便充分分離特權(quán)。避免只為滿足某些用戶的要求而授予提高的特權(quán);相反,考慮添加新的角色來滿足這些要求。

    ?

    盡可能地使用聲明性 Demand 而非命令性 Demand。聲明性 Demand 提供或拒絕對方法的全部功能的訪問。另外,它們還可以更好地與安全工具一起使用,并且有助于進(jìn)行安全審核,因?yàn)檫@些工具能夠通過檢驗(yàn)應(yīng)用程序來訪問這些 Demand。

    ?

    如果您需要確定主體是否在多個角色中,則可以考慮使用 IsInRole 方法進(jìn)行命令性檢查。.NET Framework 版本 1.1 不允許以聲明的方式執(zhí)行 AND 檢查;然而,可以通過編程的方式在方法內(nèi)執(zhí)行它們,如下面的代碼示例所示。

    // Checking for multiple roles. 
    if ( Thread.CurrentPrincipal.IsInRole( "Teller" ) && 
         Thread.CurrentPrincipal.IsInRole( "Manager" ) ) 
    { 
        // Perform privileged operation. 
    } 
    
    ?

    使用代碼訪問安全來授權(quán)調(diào)用對特權(quán)資源或操作的代碼訪問(基于諸如程序集的強(qiáng)名稱或位置這樣的證據(jù))。有關(guān)詳細(xì)信息,請參閱本章后面的“代碼訪問安全”。

    客戶端脫機(jī)時授權(quán)使用功能

    當(dāng)用戶連接到網(wǎng)絡(luò)時,可以直接根據(jù)網(wǎng)絡(luò)授權(quán)存儲對他們進(jìn)行授權(quán);但是當(dāng)他們沒有連接到網(wǎng)絡(luò)時,仍然可能需要對他們進(jìn)行授權(quán)。

    任何形式的授權(quán)都不會比所使用的身份驗(yàn)證機(jī)制更強(qiáng)。如果您允許匿名身份驗(yàn)證,您就應(yīng)該特別注意允許用戶訪問什么功能,并且通常不應(yīng)該授權(quán)用戶訪問系統(tǒng)資源。

    如果您授權(quán)用戶使用應(yīng)用程序,則可以讓 Windows 擔(dān)當(dāng)唯一的網(wǎng)關(guān)守衛(wèi)來確定哪些資源可用于已登錄用戶的配置文件。在這種情況下,通常只允許用戶訪問本地系統(tǒng)資源。

    您可以選擇為不同的角色創(chuàng)建同一個應(yīng)用程序的不同版本。當(dāng)用戶連接到網(wǎng)絡(luò)時,他或她只被允許安裝與其角色相符的應(yīng)用程序版本。然后,當(dāng)用戶脫機(jī)運(yùn)行應(yīng)用程序時,無需為應(yīng)用程序建立連接即可自動提供正確的功能。

    授權(quán)和配置文件應(yīng)用程序塊

    Microsoft 提供了一個應(yīng)用程序塊,它能夠提供基礎(chǔ)結(jié)構(gòu)來簡化在應(yīng)用程序中加入授權(quán)功能的過程。

    授權(quán)和配置文件應(yīng)用程序塊為基于角色的授權(quán)和對配置文件信息的訪問提供基礎(chǔ)結(jié)構(gòu)。該應(yīng)用程序塊允許您執(zhí)行下列操作:

    ?

    對應(yīng)用程序或系統(tǒng)的用戶進(jìn)行授權(quán)。

    ?

    使用多個授權(quán)存儲提供程序。

    ?

    插入操作驗(yàn)證的業(yè)務(wù)規(guī)則。

    ?

    將多個標(biāo)識映射到單個用戶,從而將標(biāo)識的概念擴(kuò)展到包括身份驗(yàn)證方式。

    ?

    訪問可以存儲在多個配置文件存儲區(qū)中的配置文件信息。

    有關(guān)詳細(xì)信息,請參閱 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/authpro.asp 上的 Authorization and Profile Application Block

    返回頁首返回頁首

    輸入驗(yàn)證

    輸入驗(yàn)證不嚴(yán)格的應(yīng)用程序可能會受到攻擊者惡意輸入的威脅。驗(yàn)證用戶輸入是保護(hù)應(yīng)用程序的最前沿防線中的一道防線。請考慮使用下面針對智能客戶端應(yīng)用程序的輸入驗(yàn)證指導(dǎo)原則:

    ?

    確保智能客戶端應(yīng)用程序在處理輸入或?qū)⑤斎雮魉偷较掠钨Y源和程序集之前驗(yàn)證了所有的輸入。

    ?

    如果您要將輸入數(shù)據(jù)傳送給非托管 API,請對用戶輸入數(shù)據(jù)進(jìn)行徹底的驗(yàn)證。這樣做有助于防止緩沖區(qū)溢出。您還應(yīng)該限制用戶輸入傳送到非托管 API 的數(shù)據(jù)。

    ?

    始終驗(yàn)證從所有外部來源(例如 Web 站點(diǎn)和 Web 服務(wù))獲得的數(shù)據(jù)。

    ?

    切勿依賴對傳送到 Web 服務(wù)器或者 Web 應(yīng)用程序的數(shù)據(jù)進(jìn)行的客戶端驗(yàn)證。首先在客戶端驗(yàn)證數(shù)據(jù),然后再次在服務(wù)器上驗(yàn)證數(shù)據(jù),以便防止繞過客戶端驗(yàn)證的惡意輸入。

    ?

    切勿允許用戶直接輸入 SQL 查詢。始終提供針對安全問題進(jìn)行了徹底的檢查的預(yù)先打包的或參數(shù)化查詢。允許用戶直接輸入 SQL 查詢可能帶來 SQL 插入攻擊。

    ?

    用已知的正確值或模式(而不是用錯誤的輸入)來約束并驗(yàn)證用戶輸入。檢查一個有限已知值的列表比檢查一個無限未知惡意輸入類型的列表簡單得多。在對輸入值采取行動之前,既可以拒絕有害的輸入,也可以對輸入進(jìn)行凈化(即除去潛在的不安全字符)。

    ?

    通過驗(yàn)證輸入的類型、長度、格式和范圍來約束它。一種這樣做的方法就是使用正則表達(dá)式(可以從 System.Text.RegularExpressions 命名空間中獲得)來驗(yàn)證用戶輸入。

    ?

    拒絕未知的有害數(shù)據(jù),然后凈化輸入。如果應(yīng)用程序需要接受某些自由格式的用戶輸入(例如,文本框中的注釋),可以對輸入進(jìn)行凈化,如下面的示例所示:

    private string SanitizeInput( string input ) 
    { 
        // Example list of characters to remove from input. 
        Regex badCharReplace = new Regex( @"([<>""?%;()&])" ); 
        string goodChars = badCharReplace.Replace( input, "" ); 
        return goodChars; 
    } 
    
    ?

    考慮集中驗(yàn)證例程,以減少開發(fā)工作量并有助于未來的維護(hù)。

    有關(guān)詳細(xì)信息,請參閱 Improving Web Application Security: Threats and Countermeasures 的“Chapter 4 — Design Guidelines for Secure Web Applications”中的“輸入驗(yàn)證”,地址在 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/THCMCh04.asp

    返回頁首返回頁首

    處理敏感數(shù)據(jù)

    如果您經(jīng)常設(shè)計 Web 應(yīng)用程序,您就會理解保護(hù)存儲的數(shù)據(jù)和傳輸?shù)臄?shù)據(jù)的重要性。存儲在 Web 服務(wù)器上的數(shù)據(jù)通常被寫入物理上安全的位置,這樣的位置已經(jīng)很好地被保護(hù)起來以防止受到攻擊。在智能客戶端應(yīng)用程序中,您同樣需要仔細(xì)考慮駐留在客戶端上的數(shù)據(jù)。如果這些數(shù)據(jù)是敏感的,適當(dāng)?shù)貙ζ溥M(jìn)行處理以確保安全就非常重要。為了保護(hù)傳輸?shù)臄?shù)據(jù),您可以使用 SSL 保護(hù)傳輸層,并且使用 WS-Security 或 Message Queuing 加密工具保護(hù)消息內(nèi)容。

    只有授權(quán)用戶訪問的數(shù)據(jù)才應(yīng)該可用于客戶端應(yīng)用程序。如果一臺計算機(jī)上的多個人都可以使用客戶端應(yīng)用程序,則與每個單獨(dú)的用戶相關(guān)的數(shù)據(jù)都應(yīng)該被認(rèn)為是敏感數(shù)據(jù),并且應(yīng)該采取一些措施來確保只有經(jīng)過授權(quán)的用戶可以訪問它。

    敏感數(shù)據(jù)包括攻擊者可能發(fā)現(xiàn)對訪問或修改有用的任何數(shù)據(jù),因?yàn)檫@些信息是機(jī)密的或者對攻擊有幫助。敏感數(shù)據(jù)可以是服務(wù)器提供給客戶端的數(shù)據(jù),但也可以包括應(yīng)用程序配置文件、本地數(shù)據(jù)庫或注冊表信息。

    在通常情況下,應(yīng)該盡力確保敏感數(shù)據(jù)不本地緩存。然而,在智能客戶端應(yīng)用程序的情況下,可能需要緩存這些數(shù)據(jù)(例如,為允許偶爾連接的操作,將數(shù)據(jù)保存在本地存儲區(qū)以供日后使用)。

    在某些情況下,敏感數(shù)據(jù)可能由于內(nèi)存中的分頁而發(fā)送到磁盤上。因此,在確定需要對什么樣的數(shù)據(jù)進(jìn)行加密時,也應(yīng)該考慮存在于內(nèi)存中的數(shù)據(jù)。

    確定將哪些數(shù)據(jù)存儲在客戶端上

    根據(jù)定義,用戶(因而是潛在的攻擊者)可以在物理上接觸客戶端。如果給予足夠的時間,攻擊者常常能夠獲得足夠的管理權(quán)限來訪問幾乎任何數(shù)據(jù),因此您應(yīng)該仔細(xì)考慮應(yīng)該將什么樣的數(shù)據(jù)存放在客戶端。作為一般的規(guī)則,您應(yīng)該對服務(wù)器進(jìn)行授權(quán)決策,這樣,就只有您從服務(wù)器傳送到客戶端的數(shù)據(jù)是允許用戶訪問的數(shù)據(jù)。除了提高性能之外,對服務(wù)器進(jìn)行授權(quán)決策也可以確保這種數(shù)據(jù)不會被客戶端上的潛在攻擊者訪問得到。

    您應(yīng)該從不將敏感數(shù)據(jù)存儲在基于文本的文件中,并且應(yīng)該始終對這些數(shù)據(jù)進(jìn)行加密,這樣就只有經(jīng)過授權(quán)的用戶才可以輕松地進(jìn)行訪問。您應(yīng)該避免使用基于文本的配置文件來存儲敏感的安全信息,例如密碼或數(shù)據(jù)庫連接字符串。如果這些信息必須在本地存儲,您就應(yīng)該對信息進(jìn)行加密,并將其存儲在文件或注冊表項(xiàng)中,然后使用 DACL 來限制對該對象的訪問。此外,還必須保護(hù)針對登錄用戶個人的任何永久性數(shù)據(jù)的隱私和安全,特別是當(dāng)計算機(jī)在用戶之間共享時。

    在許多情況下,如果應(yīng)用程序需要脫機(jī)運(yùn)行,則較多的數(shù)據(jù)就會存儲在客戶端上。然而,您應(yīng)該確定脫機(jī)時是否需要所有的數(shù)據(jù),或者是否您想要限制用戶在脫機(jī)時執(zhí)行某些操作,這樣您就不必將敏感數(shù)據(jù)緩存在本地。

    在某些情況下,如果數(shù)據(jù)是機(jī)密的,并且可以按需要由用戶輸入,則可以選擇根本不將數(shù)據(jù)本地存儲在客戶端上,而是在需要時從用戶獲得。

    如果應(yīng)用程序需要在本地存儲敏感數(shù)據(jù),通常應(yīng)該避免使用可移動存儲器(例如軟盤、zip 磁盤、或 USB 存儲設(shè)備)或外部便攜式存儲器來存儲敏感數(shù)據(jù)。然而,當(dāng)可以確保可移動媒體為該用戶所有(例如,通過使用證書或智能卡)時,就可以將特定于用戶的數(shù)據(jù)存儲在可移動媒體中。因此,可以將特定于用戶的數(shù)據(jù)存放在隨用戶一起移動的安全位置,這樣,漫游用戶就可以在不將數(shù)據(jù)保留在本地計算機(jī)上的情況下訪問應(yīng)用程序及其數(shù)據(jù)。

    當(dāng)考慮將哪些敏感數(shù)據(jù)存儲在客戶端上時,您應(yīng)該確保存儲關(guān)于雇員或顧客的信息沒有違反隱私法規(guī)。這些法律因國家/地區(qū)而異,因此您應(yīng)該熟悉使用您的應(yīng)用程序的國家/地區(qū)的隱私法規(guī)。

    保護(hù)敏感數(shù)據(jù)的技術(shù)

    對于需要存儲在客戶端上的數(shù)據(jù),有許多可以采取的附加措施來防止未經(jīng)授權(quán)的訪問。這些措施包括下列內(nèi)容:

    ?

    確保只有經(jīng)過授權(quán)的用戶才可以訪問數(shù)據(jù)。

    ?

    考慮使用 EFS 加密文件。

    ?

    考慮使用 DPAPI 避免密鑰管理問題。

    ?

    考慮存儲哈希值而不是明文。

    ?

    考慮部分受信任的應(yīng)用程序的隔離存儲。

    ?

    保護(hù)私鑰。

    確保只有經(jīng)過授權(quán)的用戶才可以訪問數(shù)據(jù)

    數(shù)據(jù)常常需要進(jìn)行保護(hù),以幫助確保只有經(jīng)過授權(quán)的用戶才可以訪問。取決于應(yīng)用程序的性質(zhì)和數(shù)據(jù)保持有效的時間,可以選擇使用基于資源的安全性或基于角色的安全性來保護(hù)數(shù)據(jù)。有關(guān)詳細(xì)信息,請參閱本章前面的“授權(quán)指導(dǎo)原則”。

    考慮使用 EFS 加密文件

    確保將文件安全地存放在智能客戶端上的一種方法是使用加密文件系統(tǒng) (Encrypting File System, EFS) 對敏感數(shù)據(jù)文件進(jìn)行加密。這個解決方案在可擴(kuò)展方面乏善可陳;然而,它對某些特定的文件非常有用,它也可以用于在客戶端上本地緩存數(shù)據(jù)的情況(例如,用于啟用偶爾連接的智能客戶端)。

    考慮使用 DPAPI 避免密鑰管理問題

    Windows 2000 和 Windows 操作系統(tǒng)的更高版本提供了用于加密和解密數(shù)據(jù)的 Win32? 數(shù)據(jù)保護(hù) API (DPAPI)。它是加密 API (Crypto API) 的一部分,并且是用 crypt32.dll 實(shí)現(xiàn)的。它包含兩個方法:CryptProtectData 和 CryptUnprotectData。

    DPAPI 特別有用,因?yàn)樗梢韵┞督o使用密碼的應(yīng)用程序的密鑰管理問題。雖然加密可以確保數(shù)據(jù)是安全的,但是您必須采取額外的步驟來確保密鑰的安全。為了派生加密密鑰,DPAPI 使用與調(diào)用 DPAPI 函數(shù)的代碼相關(guān)的用戶帳戶的密碼。因此,是由操作系統(tǒng)(而不是由應(yīng)用程序)管理密鑰。

    DPAPI 可以與機(jī)器存儲區(qū)或用戶存儲區(qū)一起工作。用戶存儲區(qū)是基于登錄用戶的配置文件自動加載的。客戶端應(yīng)用程序通常與用戶存儲區(qū)一起使用 DPAPI,除非需要存儲為所有可以登錄到計算機(jī)的用戶共有的機(jī)密。

    DPAPI 用來加密和解密敏感數(shù)據(jù)的密鑰是特定于計算機(jī)的。系統(tǒng)會為每臺計算機(jī)生成一個不同的密鑰,這可以防止一個服務(wù)器能夠訪問由另一個服務(wù)器加密的數(shù)據(jù)。

    非托管 DPAPI 需要程序集具有完全的信任。具有完全和部分受信任的程序集的應(yīng)用程序可以使用高特權(quán)來分離代碼,并且使其能夠從部分受信任的代碼中進(jìn)行調(diào)用。有關(guān)更多信息,請參閱 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/secmod/html/secmod115.asp 上的“How To Create a Custom Encryption Permission”。

    考慮存儲哈希值而不是明文

    有時,存儲數(shù)據(jù)是為了使之可以用于驗(yàn)證用戶輸入(例如,用戶名和密碼的組合)。在這樣的情況下,可以存儲數(shù)據(jù)的加密哈希,而不是以明文的形式存儲數(shù)據(jù)本身。然后,當(dāng)用戶進(jìn)行輸入時,還可以對該數(shù)據(jù)進(jìn)行哈希運(yùn)算,并且可以比較兩個哈希。存儲哈希減少了機(jī)密被發(fā)現(xiàn)的風(fēng)險,因?yàn)閺钠涔M茖?dǎo)原始數(shù)據(jù)或從其他數(shù)據(jù)生成相同的哈希在計算上是不可能的。

    考慮部分受信任的應(yīng)用程序的隔離存儲

    隔離存儲允許應(yīng)用程序?qū)?shù)據(jù)保存到唯一的數(shù)據(jù)艙,數(shù)據(jù)艙與代碼的標(biāo)識的某些方面相關(guān)聯(lián),例如它的 Web 站點(diǎn)、發(fā)布者或簽名。數(shù)據(jù)艙是一個抽象的概念,而不是一個具體的存儲位置;它由一個或多個隔離的存儲文件(稱為存儲)組成,存儲包含存儲數(shù)據(jù)的實(shí)際目錄位置。

    對于需要存儲特定于特定用戶和程序集的狀態(tài)數(shù)據(jù)的部分受信任的應(yīng)用程序,隔離存儲特別有用。部分受信任的應(yīng)用程序并不直接訪問文件系統(tǒng)來保持狀態(tài),除非通過更改安全策略顯式地授予它們這樣做的權(quán)限。

    存儲在隔離存儲中的數(shù)據(jù)是隔離的,并且受到保護(hù),不會被其他部分受信任的應(yīng)用程序訪問,但是無法保護(hù)它不會被完全受信任的代碼或有權(quán)訪問客戶端計算機(jī)的其他用戶訪問。為了在這些情況下保護(hù)數(shù)據(jù),您應(yīng)該通過使用 DACL 采用數(shù)據(jù)加密或者文件系統(tǒng)安全性。有關(guān)詳細(xì)信息,請參閱 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconIntroductionToIsolatedStorage.asp 上的 .NET Framework Developer's Guide 中的“Introduction to Isolated Storage”。

    保護(hù)私鑰

    未受保護(hù)的私鑰易于受到惡意用戶或惡意代碼進(jìn)行的各種各樣的攻擊。用于簽署程序集的私鑰不應(yīng)該放在不安全的位置,例如開發(fā)人員的計算機(jī)或開放共享的環(huán)境。攻擊者可以使用竊取的私鑰簽署帶有您的強(qiáng)名稱的惡意代碼。您確實(shí)應(yīng)該通過您的組織內(nèi)為此目的而指定的中央安全機(jī)構(gòu)來保護(hù)您的私鑰。您也可以將私鑰保存在物理上安全的隔離計算機(jī)上,并且在必要時使用便攜式媒體來傳遞密鑰。

    有關(guān)有效地存儲機(jī)密的詳細(xì)信息,請參閱 Michael Howard 和 David LeBlanc 撰寫的 Writing Secure Code, Second Edition

    返回頁首返回頁首

    代碼訪問安全

    代碼訪問安全是 .NET Framework 技術(shù),它將身份驗(yàn)證和授權(quán)原則應(yīng)用于代碼而不是用戶。代碼訪問安全是一種強(qiáng)大的機(jī)制,它確保只有用于運(yùn)行的代碼才可以被用戶運(yùn)行。

    所有的托管代碼都遵循代碼訪問安全機(jī)制。當(dāng)加載一個程序集時,會授予它一組代碼訪問權(quán)限,以確定它可以訪問什么資源和執(zhí)行什么類型的特權(quán)操作。為了授予這些權(quán)限,.NET Framework 安全系統(tǒng)使用證據(jù)來對代碼進(jìn)行身份驗(yàn)證(標(biāo)識)。

    程序集是代碼訪問安全的配置和信任單元。相同程序集中的所有代碼都接收相同的權(quán)限,因而是同等受信任的。

    代碼訪問安全包括下列要素:

    ?

    權(quán)限。權(quán)限代表代碼訪問安全資源或執(zhí)行特權(quán)操作的權(quán)力。Microsoft .NET Framework 提供代碼訪問權(quán)限 和代碼標(biāo)識權(quán)限。代碼訪問權(quán)限封裝訪問特特定資源或者執(zhí)行特定特權(quán)操作的能力。例如,在應(yīng)用程序可以執(zhí)行任何文件的 I/O 操作之前都需要 FileIOPermission。代碼標(biāo)識權(quán)限用來基于調(diào)用代碼的標(biāo)識的某個方面(例如,代碼的強(qiáng)名稱)限制對代碼的訪問。

    ?

    權(quán)限集。.NET Framework 定義了許多權(quán)限集,它們代表一組通常作為一個整體分配的權(quán)限。例如,.NET Framework 定義的 FullTrust 權(quán)限集將所有的權(quán)限分配給完全受信任的代碼;而 LocalIntranet 權(quán)限集則分配數(shù)量非常有限的權(quán)限。

    ?

    證據(jù)。.NET Framework 安全系統(tǒng)使用證據(jù)來標(biāo)識程序集。代碼訪問安全策略使用證據(jù)來幫助將恰當(dāng)?shù)臋?quán)限授予恰當(dāng)?shù)某绦蚣WC據(jù)可以是位置相關(guān)的(例如,URL、站點(diǎn)、應(yīng)用程序目錄或區(qū)域),也可以是作者相關(guān)的(例如,強(qiáng)名稱、發(fā)布者或哈希)。

    ?

    策略。代碼訪問安全策略是由管理員配置的,它確定授予程序集的權(quán)限。策略可以建立在企業(yè)、機(jī)器、用戶和應(yīng)用程序域級別上。每個策略都用一個 XML 配置文件定義。

    ?

    代碼組。每個策略文件都包含一些分層代碼組。代碼組用來給程序集分配權(quán)限。代碼組由成員身份條件(基于證據(jù))和權(quán)限集組成。.NET Framework 定義了許多默認(rèn)的代碼組,例如 Internet、本地 Intranet、受限制的和受信任的區(qū)域。

    有關(guān)代碼訪問安全的詳細(xì)信息,請參閱 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/THCMCh07.asp 上的 Improving Web Application Security: Threats and countermeasures:“Chapter 7 — Building Secure Assemblies”和 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/THCMCh08.asp 上的“Chapter 8 — Code Access Security in Practice”。

    代碼訪問安全權(quán)限解析

    代碼訪問安全使用圖 5.2 中概述的步驟來確定將哪些權(quán)限分配給程序集。


    5.2 確定將哪些權(quán)限分配給程序集

    下面的步驟更詳細(xì)地描述了這些過程:

    1.

    加載程序集,收集證據(jù)并將其提供給主機(jī)。

    2.

    根據(jù)用于宿主環(huán)境的安全策略來評估證據(jù)。

    3.

    這種評估的輸出是一組授予程序集的權(quán)限。這些權(quán)限定義了在此環(huán)境中程序集能夠做什么和不能做什么。

    4.

    當(dāng)程序集請求執(zhí)行特權(quán)操作時,系統(tǒng)就會將操作的請求與程序集的權(quán)限進(jìn)行比較。如果程序集具有這樣的權(quán)限,就允許代碼執(zhí)行該操作,否則,引發(fā)安全異常。

    代碼訪問安全設(shè)計

    分配給代碼的權(quán)限取決于與代碼相關(guān)的證據(jù)和客戶端計算機(jī)上的適當(dāng)安全策略。為了在保持應(yīng)用程序的功能的同時確保其安全,您需要仔細(xì)考慮應(yīng)用程序所需的權(quán)限、以及授予這些權(quán)限的方式。

    授予所有權(quán)限的應(yīng)用程序(這些應(yīng)用程序定義在 FullTrust 權(quán)限集中)稱為完全受信任的應(yīng)用程序。沒有授予所有權(quán)限的應(yīng)用程序稱為部分受信任的應(yīng)用程序。

    在理論上,將應(yīng)用程序設(shè)計為部分受信任通常更可取。然而,智能客戶端應(yīng)用程序常常需要執(zhí)行許多部分受信任的應(yīng)用程序在默認(rèn)情況下不能執(zhí)行的操作。這些操作包括:

    ?

    訪問運(yùn)行應(yīng)用程序的服務(wù)器以外的服務(wù)器,或者訪問使用不同協(xié)議的服務(wù)器。

    ?

    訪問本地文件系統(tǒng)。

    ?

    訪問本地 Microsoft Office 應(yīng)用程序并與其交互。

    ?

    訪問并與非托管代碼(例如 COM 對象)交互。

    如果需要智能客戶端執(zhí)行這些種類的操作,則應(yīng)該考慮使它成為一個完全受信任的應(yīng)用程序,或者授予它正確地進(jìn)行操作所需的其他特定權(quán)限。

    在默認(rèn)情況下,使用無接觸部署方式部署的應(yīng)用程序自動成為部分受信任的。如果智能客戶端需要執(zhí)行部分受信任的應(yīng)用程序不能執(zhí)行的額外操作,則需要部署新的安全策略或者使用其他方法來部署應(yīng)用程序。

    設(shè)計和構(gòu)建部分受信任的應(yīng)用程序可能比較復(fù)雜,但是仔細(xì)考慮并限制授予應(yīng)用程序的權(quán)限有助于確保應(yīng)用程序不能執(zhí)行不恰當(dāng)?shù)牟僮骰蛘咴L問明顯不需要的資源。

    所有的代碼在運(yùn)行之前都必須給其授予運(yùn)行的權(quán)限,但是訪問安全資源或者執(zhí)行其他安全敏感操作(例如調(diào)用非托管代碼或訪問本地文件系統(tǒng))的代碼必須由 .NET Framework 授予額外的權(quán)限才能運(yùn)行。這樣的代碼稱為特權(quán)代碼。相反,非特權(quán)代碼并不需要訪問敏感資源,而只是需要運(yùn)行的權(quán)限。當(dāng)設(shè)計和構(gòu)建應(yīng)用程序及其程序集時,應(yīng)該標(biāo)識特權(quán)和非特權(quán)代碼并將其存檔。這樣做有助于確定代碼需要的權(quán)限。

    還應(yīng)該仔細(xì)檢驗(yàn) .NET Framework 使用哪些證據(jù)來給代碼分配權(quán)限。只有在中心位置安全的情況下才應(yīng)該考慮基于應(yīng)用程序的位置(例如,文件共享或 Web 服務(wù)器)的證據(jù)。類似地,只有在密鑰安全的情況下才應(yīng)該使用具有基于一般密鑰 — 用于簽署所有的代碼(例如,由組織的 IT 部門)— 的證據(jù)的應(yīng)用程序。然而,依賴于強(qiáng)名稱證據(jù)而不是任何基于位置的證據(jù)(例如 Web 服務(wù)器地址)通常更安全一些。

    設(shè)計部分受信任的應(yīng)用程序

    當(dāng)設(shè)計部分受信任的應(yīng)用程序時,請遵循下列指導(dǎo)原則:

    ?

    了解應(yīng)用程序的部署方案。

    ?

    避免引起異常的權(quán)限請求。

    ?

    對部分受信任的調(diào)用程序使用 Demand/Assert 模式。

    ?

    考慮對程序集使用強(qiáng)名稱。

    ?

    避免給受限區(qū)域賦予完全的信任。

    了解應(yīng)用程序的部署方案

    在設(shè)計期間應(yīng)該清楚地了解應(yīng)用程序的部署方案,因?yàn)椴渴饝?yīng)用程序的位置對默認(rèn)授予應(yīng)用程序的權(quán)限有很大的影響。諸如顯示對話框(例如,使用 SaveFileDialog)或訪問系統(tǒng)資源的應(yīng)用程序功能都可能因?yàn)閼?yīng)用程序的部署位置而受到限制。

    特別地,授予應(yīng)用程序的權(quán)限取決于它所在的區(qū)域(例如,Internet 區(qū)域、本地 Intranet 區(qū)域或受信任的區(qū)域)。用戶可以對受信任的區(qū)域內(nèi)的應(yīng)用程序的成員身份有一定的控制,但是不應(yīng)該依賴用戶將應(yīng)用程序放在此區(qū)域來確保正確的功能。您應(yīng)該這樣設(shè)計您的應(yīng)用程序,使之在運(yùn)行時被授予的權(quán)限不夠時會正常地失敗。

    如果用戶嘗試執(zhí)行某種操作,而應(yīng)用程序卻沒有足夠的權(quán)限來執(zhí)行該操作,則這種嘗試可能會導(dǎo)致失敗的權(quán)限請求,這又會引發(fā)安全異常。應(yīng)用程序需要處理這些異常,否則它就會出現(xiàn)故障。您應(yīng)該確保可以很好地處理這樣的故障,并且應(yīng)該給用戶提供足夠的信息來解決問題,而同時不泄露與安全有關(guān)的不適當(dāng)?shù)幕蛎舾械男畔ⅰ?/P>

    系統(tǒng)可以按照使用 .NET Framework 2.0 版本的 ClickOnce 部署功能部署的應(yīng)用程序的部署清單授予它們特定的權(quán)限。在部署應(yīng)用程序時,授予的權(quán)限將固定,而且將應(yīng)用程序的位置放在受信任的區(qū)域中不會影響授予的權(quán)限。

    避免引起異常的權(quán)限請求

    確定每個應(yīng)用程序功能在不引起異常的情況下正確地運(yùn)行所需的權(quán)限。請考慮使用如下措施:

    ?

    設(shè)計一個替代解決方案來避免可能引起異常的權(quán)限請求。例如,對于基于 Intranet 的應(yīng)用程序,您可以使用 OpenFileDialog 來顯示一個對話框,指示用戶選擇文件,而不要讓應(yīng)用程序自動從硬盤打開并讀取文件。

    ?

    適當(dāng)?shù)靥幚懋惓5臋z查權(quán)限(特別是 SecurityException。在您的代碼中,您可以創(chuàng)建一個特定于您正試圖訪問的資源的權(quán)限類的實(shí)例,并且在訪問資源之前檢查必要的權(quán)限。例如,當(dāng)您必須使用 OpenFileDialogSaveFileDialog 顯示對話框時,可以使用 FileDialogPermission 類和 SecurityManager.IsGranted 靜態(tài)方法來檢查權(quán)限,如下所示。

    FileDialogPermission fileDialogPermission = new 
                 FileDialogPermission( FileDialogPermissionAccess.Save ); 
    if ( !SecurityManager.IsGranted( fileDialogPermission ) )  
    { 
        // Not allowed to save file. 
    } 
    

    IsGranted 并不保證操作將成功,因?yàn)樗鼪]有遍歷堆棧來確定是否所有的上游代碼都具有必需的權(quán)限。

    ?

    考慮原型設(shè)計并對各種部署區(qū)域測試您的應(yīng)用程序方案:

    ?

    如果您的應(yīng)用程序設(shè)計成能從文件共享運(yùn)行,您可以將該應(yīng)用程序的地址設(shè)置為網(wǎng)絡(luò)共享(例如,\\MachineName\c$\YourAppPath\YourApp.exe)并從您的硬盤運(yùn)行它來模擬這種方案。

    ?

    如果您的應(yīng)用程序設(shè)計成是從 Web Internet 區(qū)域運(yùn)行,您可以使用您的計算機(jī)的 IP 地址(例如,\\<MachineIPaddress\c$\YourAppPath\YourApp.exe)來模擬這種方案。

    對部分受信任的調(diào)用程序使用 Demand/Assert 模式

    Demand/Assert 模式用于完全受信任的程序集中,以允許部分受信任的調(diào)用程序在調(diào)用時訪問特權(quán)操作。當(dāng)部分受信任的調(diào)用程序需要以安全的方式執(zhí)行特權(quán)操作而又不具有必要的特權(quán)時,這種模式非常有用。通過使用 Assert,您可以擔(dān)保您的代碼的調(diào)用程序是值得信任的。

    只有當(dāng)您完全理解它的使用可能帶來的安全風(fēng)險時,才能使用 Demand/Assert 模式。斷言權(quán)限關(guān)閉了正常的 .NET Framework 權(quán)限檢查,這種權(quán)限檢查會檢查堆棧中所有的調(diào)用代碼。關(guān)閉這種機(jī)制可能會將嚴(yán)重的安全漏洞引入代碼中,因此只有在您完全理解該模式的含義并用盡所有其他可能的解決方案時,才能嘗試這種模式。

    在這種模式中,Demand 調(diào)用發(fā)生在 Assert 調(diào)用之前。Demand 查看調(diào)用程序是否具有該權(quán)限,然后,Assert 關(guān)閉特定權(quán)限的堆棧遍歷,這樣公共語言運(yùn)行庫就不會檢查調(diào)用程序是否具有適當(dāng)?shù)臋?quán)限。

    為了讓部分受信任的調(diào)用程序成功地調(diào)用完全受信任的程序集方法,可以請求適當(dāng)?shù)臋?quán)限來確保部分受信任的調(diào)用程序不會損害系統(tǒng),然后斷言特定的權(quán)限以執(zhí)行高特權(quán)操作。

    在進(jìn)行特權(quán)操作之前,應(yīng)該調(diào)用完全受信任的程序集中的 Assert,并隨后調(diào)用 RevertAssert以確保方法調(diào)用后面的代碼不會因疏忽而成功,因?yàn)?/B> Assert 仍然在發(fā)揮作用。您應(yīng)該將此代碼放在私有函數(shù)中,這樣,Assert 就會自動在方法返回之后從堆棧中刪除(使用 RevertAssert 調(diào)用)。使此方法私有非常重要,這樣攻擊者就無法使用外部代碼來調(diào)用該方法。

    考慮下面的示例。

    Private void PrivilegedOperation() 
    { 
        // Demand for permission. 
        new FileIOPermission( PermissionState.Unrestricted ).Demand(); 
        // Assert to allow caller with insufficient permissions. 
        new FileIOPermission( PermissionState.Unrestricted ).Assert(); 
        // Perform your privileged operation. 
    } 
    

    在默認(rèn)的情況下,完全受信任的程序集并不允許從部分受信任的應(yīng)用程序或程序集中進(jìn)行調(diào)用;這樣的調(diào)用會引起安全異常。為了避免這些異常,可以將 AllowPartiallyTrustedCallersAttribute (APTCA) 添加到 Visual Studio .NET 生成的 AssemblyInfo.cs 文件中,如下所示。

    [assembly: AllowPartiallyTrustedCallersAttribute()] 
    

    應(yīng)該對使用 APTCA 的代碼進(jìn)行評審,以確保它不會被任何部分受信任的惡意代碼所利用。有關(guān)詳細(xì)信息,請參閱 Improving Web Application Security: Threats and Countermeasures 的“Chapter 8 — Code Access Security in Practice”中的“APTCA”,地址在 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/THCMCh08.asp

    考慮使用強(qiáng)名稱的程序集

    使用強(qiáng)名稱可以提高程序集的安全性。您應(yīng)該考慮使用強(qiáng)名稱來簽署您的應(yīng)用程序中的所有程序集,并且修改安全策略以信任此強(qiáng)名稱。您可以使用 Sn.exe 工具簽署帶有強(qiáng)名稱密鑰對的程序集。要手動更改安全策略,可以使用 .NET Framework Configuration MMC 管理單元或 Caspol.exe,一個命令行工具(位于 %SystemRoot%\Microsoft.NET\Framework\< version>\CasPol.exe)。

    使用私鑰簽署程序集的過程應(yīng)該進(jìn)行如下考慮:

    ?

    將延遲簽署用于開發(fā)。編譯代碼的編譯過程可以使用延遲簽署,從而使用強(qiáng)名稱密鑰對的公共部分而不是私鑰。要使用延遲簽署,開發(fā)人員可以將下面的屬性添加到項(xiàng)目的 Assembly.cs 文件中。

    [assembly:AssemblyKeyFile("publickey.snk")] 
    [assembly:AssemblyDelaySign(true)] 
    
    ?

    保護(hù)生成的私鑰。下面的命令行展示了強(qiáng)名稱工具 (Sn.exe) 的使用,該工具是 .NET Framework SDK 附帶的,用于生成直接針對可移動存儲設(shè)備的密鑰對 (Keypair.snk)。(在本例中,使用的 F 驅(qū)動器是 USB 驅(qū)動器)

    sn -k f:\keypair.snk 
    sn -p f:\keypair.snk f:\publickey.snk 
    

    公鑰 (Publickey.snk) 用于開發(fā)人員進(jìn)行延遲簽署。該密鑰對存儲在具有高度受限的訪問權(quán)限的安全位置。

    ?

    禁用對測試的驗(yàn)證。要測試已經(jīng)延遲簽署的程序集,可以使用 Sn.exe 在測試計算機(jī)上注冊它。表 5.1 列出了常用的命令行變體。

    5.1 常用的命令行變體

    命令 描述

    sn -Vr assembly.dll

    禁用對特定程序集的驗(yàn)證。

    sn -Vr *,publickeytoken

    禁用對具有特定公鑰的所有程序集的驗(yàn)證。星號 (*) 通過對應(yīng)于為忽略驗(yàn)證提供的公鑰令牌的密鑰來注冊所有延遲簽署的程序集。

    ?

    通過供發(fā)布的私鑰進(jìn)行簽署。要完成簽署過程,可以使用下面的命令通過私鑰進(jìn)行簽署。

    sn -r assembly.dll f:\keypair.snk 
    

    在簽署程序集以供在組織中使用之前,指定的組成員應(yīng)該對其進(jìn)行測試和評審。

    有關(guān)延遲簽署和本節(jié)中解釋的過程的詳細(xì)信息,請參閱 Improving Web Application Security: Threats and Countermeasures 中的下列資源:

    ?

    http://msdn.microsoft.com/library/en-us/dnnetsec/html/THCMCh03.asp 上的“Chapter 3 — Threat Modeling”。

    ?

    http://msdn.microsoft.com/library/en-us/dnnetsec/html/THCMCh07.asp 上的“Chapter 7 — Building Secure Assemblies”中的“Delay Signing”。

    ?

    http://msdn.microsoft.com/library/en-us/dnnetsec/html/THCMCh05.asp 上的“Chapter 5 — Architecture and Design Review for Security”。

    ?

    http://msdn.microsoft.com/library/en-us/dnnetsec/html/THCMCh21.asp 上的“Chapter 21 — Code Review”。

    同時參閱下列資源:

    ?

    http://www.dotnetthis.com/Articles/SNandSmartCards.htm 上的“Strong Name Signing Using Smart Cards in Enterprise Software Production Environment”。

    避免給受限區(qū)域賦予完全的信任

    作為解決部分受信任的應(yīng)用程序的安全問題的一個快速替代解決方案,您可能非常想給受限區(qū)域(例如 Internet 或本地 Intranet 區(qū)域)賦予完全的信任。這樣做會允許任何應(yīng)用程序在沒有進(jìn)行代碼訪問安全檢查的情況下就運(yùn)行在本地系統(tǒng)上,如果應(yīng)用程序來自惡意的來源,這就成為一個問題。然而,如果在設(shè)計階段考慮部署方案,就不必開放安全性來允許應(yīng)用程序運(yùn)行。

    設(shè)計完全受信任的應(yīng)用程序

    因?yàn)椴糠质苄湃蔚膽?yīng)用程序可能對系統(tǒng)資源具有非常少的權(quán)限,所以為了正確地運(yùn)行,應(yīng)用程序可能需要比默認(rèn)分配給它的權(quán)限更多的權(quán)限。需要能夠執(zhí)行諸如啟動 Office 應(yīng)用程序或 Microsoft Internet Explorer、調(diào)用舊式 COM 組件、寫入文件系統(tǒng)這樣的任務(wù)的應(yīng)用程序必須具有顯式啟用這些操作的權(quán)限才能運(yùn)行。

    將應(yīng)用程序指定為完全受信任的應(yīng)用程序,這樣就可以給它分配所有可能的權(quán)限,這對我們是很有吸引力的。然而,更安全的做法是,在設(shè)計和部署應(yīng)用程序時,只要求應(yīng)用程序正確運(yùn)行所需的最小權(quán)限。如果您確實(shí)需要將應(yīng)用程序作為完全受信任的應(yīng)用程序來運(yùn)行,就必須考慮使用下列指導(dǎo)原則:

    ?

    確定程序集需要訪問的資源的類型,評估在程序集受到損害時可能發(fā)生的潛在威脅。

    ?

    確定目標(biāo)環(huán)境的信任級別,因?yàn)榇a訪問安全策略可能對程序集的功能進(jìn)行限制。

    ?

    使用只用于構(gòu)成程序集公共接口的一部分的類和成員的公共訪問修飾符來減少攻擊面。只要有可能,就使用 private 或 protected 訪問修飾符來限制對所有其他類和成員的訪問。

    ?

    使用 sealed 關(guān)鍵字來防止對沒有設(shè)計為基類的類的繼承,如下面的代碼所示。

    public sealed class NobodyDerivesFromMe 
    {...} 
    
    ?

    只要有可能,就使用聲明性類級別或方法級別屬性來限制對指定的 Windows 組的成員的訪問,如下面的代碼所示。

    [PrincipalPermission(SecurityAction.Demand,Role=@"DomainName\WindowsGroup")] 
    public sealed class Orders() 
    {...} 
    
    ?

    為延遲簽署、測試、安全評審和保護(hù)私鑰建立安全構(gòu)建過程。

    小結(jié)

    智能客戶端應(yīng)用程序在本質(zhì)上是分布式的,因此,為了有效地管理它們的安全性,需要考慮服務(wù)器上的安全、客戶端上的安全、以及兩者之間的網(wǎng)絡(luò)連接的安全。具體的智能客戶端考慮事項(xiàng)包括設(shè)計安全身份驗(yàn)證、授權(quán)、數(shù)據(jù)驗(yàn)證和保護(hù)敏感數(shù)據(jù)。您還應(yīng)該研究如何使用代碼訪問安全機(jī)制來管理代碼級而不是用戶級的安全性。

    轉(zhuǎn)到原英文頁面

    posted on 2006-02-10 14:54 TrampEagle 閱讀(685) 評論(0)  編輯  收藏 所屬分類: 技術(shù)文摘
    主站蜘蛛池模板: 亚洲高清毛片一区二区| 国产成人自产拍免费视频| 亚洲日韩在线视频| 亚洲毛片在线观看| 亚洲AV乱码一区二区三区林ゆな| 亚洲精品乱码久久久久久久久久久久| 亚洲欧洲中文日韩久久AV乱码| 亚洲国产成人精品久久久国产成人一区二区三区综 | 精品日韩99亚洲的在线发布| 亚洲欧洲日产国码二区首页 | 四虎永久在线免费观看| 四虎成人精品永久免费AV | 日本亚洲免费无线码 | 亚洲国产婷婷六月丁香| 日韩va亚洲va欧洲va国产| 亚洲A∨无码一区二区三区| 久久亚洲国产视频| 亚洲性无码av在线| 国产日本亚洲一区二区三区| 亚洲午夜精品一区二区麻豆| 久久人午夜亚洲精品无码区| 美女视频黄频a免费| 久久99久久成人免费播放| 免费黄网站在线看| 亚洲免费黄色网址| 国产成人无码区免费网站| 华人在线精品免费观看| 一级毛片免费观看不卡的| 在线看片v免费观看视频777| 四虎影视www四虎免费| 日本中文一区二区三区亚洲| 久久伊人亚洲AV无码网站| 全黄性性激高免费视频| 亚洲视频在线一区二区| 亚洲AV永久精品爱情岛论坛| 国产成人精品日本亚洲网址| 色费女人18女人毛片免费视频| 日本免费A级毛一片| 日韩精品福利片午夜免费观着| 免费A级毛片无码久久版| 亚洲精品国产精品乱码不99 |