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