三種類型ADO.NET訪問權限詳解
權限往往可以限制我們的一些操作,在一個應用程序中你可能只有可讀的權限,這里我們就ADO.NET訪問權限來談談。.NET Framework 提供基于角色的安全性和代碼訪問安全性 (CAS),這兩種安全性都可以通過公共語言運行庫 (CLR) 提供的公共基礎結構實現(xiàn)。 對于非托管代碼,大多數(shù)應用程序都可以使用用戶或主體權限執(zhí)行。因此,當擁有提升權限的用戶運行惡意軟件或包含錯誤的軟件時,計算機系統(tǒng)可能會受到損壞并危及私有數(shù)據(jù)。
相對而言,.NET Framework 中執(zhí)行的托管代碼包括單獨應用于代碼的代碼訪問安全性。 是否允許運行代碼取決于代碼的來源或代碼標識的其他方面,而不僅僅是主體標識。 這樣可以減小濫用托管代碼的可能性。
代碼ADO.NET訪問權限
在執(zhí)行代碼時,代碼會提供通過 CLR 安全系統(tǒng)計算的證據(jù)。 通常,此證據(jù)由代碼的來源(包括 URL、站點和區(qū)域)以及確保程序集標識的數(shù)字簽名組成。CLR 僅允許代碼執(zhí)行代碼具有執(zhí)行權限的那些操作。 代碼可以請求權限,而這些請求需要基于管理員設置的安全策略。
#T#在 CLR 中指定的代碼不能為自身授予權限。 例如,代碼可以請求并獲得比安全策略允許的權限少的權限,但決不會獲得比安全策略允許的權限多的權限。在授予權限時,應該從無權限開始,然后為要執(zhí)行的特定任務添加最少的權限。一開始就使用所有權限,然后拒絕各個權限會導致應用程序不安全,應用程序可能會授予不必要的權限,從而使應用程序無意中包含安全漏洞。有關更多信息,請參見配置安全策略和安全策略管理。
代碼ADO.NET訪問權限有三種類型:
◆Code access permissions從 CodeAccessPermission 類派生。 需要具有權限才能訪問受保護的資源(如文件和環(huán)境變量)和執(zhí)行受保護的操作(如訪問托管代碼)。
◆Identity permissions表示標識程序集的特征。 對程序集授予權限需要基于證據(jù),而證據(jù)可以包括如數(shù)字簽名或代碼來源等項。 標識權限也從 CodeAccessPermission 基類派生。
◆Role-based security permissions基于主體是否具有指定標識或是否是指定角色的成員。 PrincipalPermission 類允許對活動主體進行聲明性和強制性權限檢查。
為了確定代碼是否獲得了訪問某一資源或執(zhí)行某一操作的授權,運行庫的安全系統(tǒng)將遍歷調(diào)用堆棧,將每個調(diào)用方已獲得的權限與要求的權限進行比較。 如果調(diào)用堆棧中的任何調(diào)用方?jīng)]有要求的權限,則會引發(fā) SecurityException 并拒絕訪問。
ADO.NET訪問權限之請求權限
請求權限的目的是通知運行庫您的應用程序要求哪些權限才能運行,并確保應用程序只接收到實際需要的權限。 例如,如果您的應用程序需要將數(shù)據(jù)寫入本地磁盤,則需要 FileIOPermission。 如果尚未授予該權限,則在應用程序嘗試寫入磁盤時將失敗。 不過,如果應用程序請求 FileIOPermission 并且尚未授予該權限,則應用程序一開始即會生成異常,因此將不會加載。
在應用程序只需從磁盤讀取數(shù)據(jù)的情況下,您可以請求永遠不為應用程序授予任何寫入權限。 在出現(xiàn) Bug 或受到惡意攻擊時,您的代碼將不會損壞它所操作的數(shù)據(jù)。
基于角色的安全性和 CAS
同時實現(xiàn)基于角色的安全性和代碼訪問安全性 (CAS) 可增強應用程序的整體安全性。 基于角色的安全性可以基于 Windows 帳戶或自定義標識,使有關安全主體的信息可用于當前線程。此外,通常還要求應用程序基于用戶提供的憑據(jù)提供對數(shù)據(jù)或資源的訪問。 通常情況下,這種應用程序會檢查用戶的角色,并根據(jù)這些角色提供對資源的訪問?;诮巧陌踩允菇M件能夠在運行時標識當前用戶及其關聯(lián)的角色。 然后使用 CAS 策略映射此信息以確定運行時授予的一組權限。 對于指定的應用程序域,主機可以更改基于角色的默認安全策略并設置表示用戶的默認安全主體和與該用戶關聯(lián)的角色。
CLR 使用權限來實現(xiàn)其用于對托管代碼實施限制的機制。 基于角色的安全權限提供一種機制,用于發(fā)現(xiàn)用戶(或代表該用戶的代理)是否具有特定標識或者是否是指定角色的成員。根據(jù)要生成的應用程序類型,還應考慮在數(shù)據(jù)庫中實現(xiàn)基于角色的權限。 有關 SQL Server 中基于角色的安全性的更多信息,請參見 SQL Server 安全性 (ADO.NET)。