設計使用權限

使用權限表示可以存取受保護資源或執行受保護作業的能力。當實作您自己的使用權限類別時,您必須先決定幾個高層設計決策。第一個步驟是決定您的自訂使用權限要保護的資源。

下一步是考慮是否有重疊設定使用權限。雖然您必須避免讓兩個使用權限保護同一個資源,但是在某些情況下可能無法有效地避免。例如,存取 Unmanaged 程式碼的使用權限也可以包含其他的使用權限,因為被授與存取 Unmanaged 程式碼使用權限的程式碼,透過 Unmanaged API 也可以執行大部分的作業。然而,當未授與存取 Unmanaged 程式碼的使用權限時,您仍然需要授與使用權限才可以存取其他的特定資源。因此,有必要將存取 Unmanaged 程式碼的使用權限和其他的使用權限隔離開。

您要如何知道在使用權限涵蓋範圍內是否有重疊的情形?關於這個問題並沒有絕對的答案,但可以由一個方向來判斷,即在這些使用權限中是否有一個很容易存取的使用權限,而在授與權限的作業上也比其他的使用權限來得容易。如果是這種情形,決定授與存取權限的工作就比較容易,同時也可減輕管理員的工作。

決定使用權限要保護的資源,並且解決了使用權限重疊的問題之後,您必須要決定存取控制要細密到何種程度。這個問題的答案會影響您設計代表使用權限狀態的變數,以及決定管理員是否可以配置對受保護資源的存取權限。同時對效能、使用上的難易度和其他方面也會有影響。

為解決這些設計上的問題,您可以考慮利用 .NET Framework 所提供 FileIOPermission 類別中的一些設計準則。每一項設計準則都會影響代表使用權限狀態的變數。

  • 單一位元表示「使用所有檔案」或「不使用檔案」,根據它的值而定

  • 兩個位元表示「讀取所有檔案」和「寫入所有檔案」或皆不是,根據它們的值而定

  • 26 個位元表示「使用指定磁碟機上的所有檔案」

  • 字串陣列列出可以存取的所有檔案

很明顯地,您必須考慮作一些選擇。例如,單一位元使用權限是很簡單、快速和容易瞭解的,但它對管理員而言卻只有全部或沒有這兩種選擇。其他的選擇會指定一個更複雜的使用權限狀態,但也會降低一定程度的系統效能。您必須權衡這些選擇項目,並考慮不應建立一個以上的使用權限來保護同一個資源。一般而言,設計使用權限類別時應該視需要決定使用權限狀態的複雜度,而不會對系統效能造成很大的影響。

雖然您也可以採用其他的設計,但是大部分的使用權限都應該遵照以下的標準設計模式或組合:

  • 布林 (Boolean) 使用權限。含有一或多個位元最簡單的使用權限物件,其中每一個位元都分別對應至「要執行 X 的使用權限」。表示您擁有或不擁有某一使用權限。這類使用權限的範例是 SecurityPermission 類別,其中包含的各個 Boolean 變數表示執行不同項目的權限,如呼叫進入 Unmanaged 程式碼的使用權限,每一個變數都有允許或不允許兩種狀態。

  • 使用權限等級。這是更詳細的使用權限形式,其中的變數是以數字表示每一種存取權限,從零 (表示沒有任何存取權) 至某一最高的數字 (表示存取完全不受限制),兩個數字間則為不同程度的權限等級。例如,您可以使用 UIPermission 類別表示各個等級 (從沒有 UI 使用權限到不受限制,同時兩者間還有一些不同等級的使用權限) 的視窗使用權限。

  • 物件清單使用權限。這類使用權限對允許和不允許的權限提供了很詳細的劃分規格。FileIOPermission 類別是這類使用權限的好例子,因為它的狀態由允許特定存取種類的檔案清單來表示。含有清單的使用權限最適合用來保護包含很多具名物件的資源。

一般而言,將自訂使用權限類別中的外部相依性減至最低是比較適切的作法,因為使用權限相依的每一個組件,當安全性系統要求您的使用權限類別時將必須載入。另一項必須將相依性減至最低的原因是,由自訂使用權限類別 (Mscorlib 除外) 使用的每一個組件必須加入至完全信任清單 (如需詳細資訊,請參閱更新安全性原則)。請盡量將自訂使用權限及任何關聯的屬性類別置於單獨的組件中,以避免載入非必要的組件。

Note注意事項

自訂使用權限應標記為 Sealed (Visual Basic 中的 NotInheritable),或於其上放置繼承 (Inheritance) 要求。否則,惡意呼叫端便可從您的使用權限衍生,而可能導致安全性不足。

請參閱

概念

建立您自己的程式碼存取使用權限

其他資源

程式碼存取安全性