設計使用權限
使用權限表示可以存取受保護資源或執行受保護作業的能力。 當實作您自己的使用權限類別時,您必須先決定幾個高層設計決策。 第一個步驟是決定您的自訂使用權限要保護的資源。
下一步是考慮是否有重疊設定使用權限。 雖然您必須避免讓兩個使用權限保護同一個資源,但是在某些情況下可能無法有效地避免。 例如,存取 Unmanaged 程式碼的使用權限也可以包含其他的使用權限,因為被授與存取 Unmanaged 程式碼使用權限的程式碼,透過 Unmanaged API 也可以執行大部分的作業。 然而,當未授與存取 Unmanaged 程式碼的使用權限時,您仍然需要授與使用權限才可以存取其他的特定資源。 因此,有必要將存取 Unmanaged 程式碼的使用權限和其他的使用權限隔離開。
您要如何知道在使用權限涵蓋範圍內是否有重疊的情形? 關於這個問題並沒有絕對的答案,但可以由一個方向來判斷,即在這些使用權限中是否有一個很容易存取的使用權限,而在授與權限的作業上也比其他的使用權限來得容易。 如果是這種情形,決定授與存取權限的工作就比較容易,同時也可減輕管理員的工作。
決定使用權限要保護的資源,並且解決了使用權限重疊的問題之後,您必須要決定存取控制要細密到何種程度。 這個問題的答案會影響您設計代表使用權限狀態的變數,以及決定管理員是否可以配置對受保護資源的存取權限。 同時對效能、使用上的難易度和其他方面也會有影響。
為解決這些設計上的問題,您可以考慮利用 .NET Framework 所提供 FileIOPermission 類別中的一些設計準則。 每一項設計準則都會影響代表使用權限狀態的變數。
單一位元表示「使用所有檔案」或「不使用檔案」,根據它的值而定
兩個位元表示「讀取所有檔案」和「寫入所有檔案」或皆不是,根據它們的值而定
26 個位元表示「使用指定磁碟機上的所有檔案」
字串陣列列出可以存取的所有檔案
很明顯地,您必須考慮作一些選擇。 例如,單一位元使用權限是很簡單、快速和容易了解的,但它對管理員而言卻只有全部或沒有這兩種選擇。 其他的選擇會指定一個更複雜的使用權限狀態,但也會降低一定程度的系統效能。 您必須權衡這些選擇項目,並考慮不應建立一個以上的使用權限來保護同一個資源。 一般而言,設計使用權限類別時應該視需要決定使用權限狀態的複雜度,而不會對系統效能造成很大的影響。
雖然您也可以採用其他的設計,但是大部分的使用權限都應該遵照以下的標準設計模式或組合:
布林 (Boolean) 使用權限。 含有一個或多個位元最簡單的使用權限物件,其中每一個位元都分別對應至「要執行 X 的使用權限」。 表示您擁有或不擁有某一使用權限。 這類使用權限的範例是 SecurityPermission 類別,其中包含的各個 Boolean 變數表示執行不同項目的權限,如呼叫進入 Unmanaged 程式碼的使用權限,每一個變數都有允許或不允許兩種狀態。
使用權限等級。 這是更詳細的使用權限形式,其中的變數是以數字表示每一種存取權限,從零 (表示沒有任何存取權) 至某一最高的數字 (表示存取完全不受限制),兩個數字間則為不同程度的權限等級。 例如,您可以使用 UIPermission 類別表示各個等級 (從沒有 UI 使用權限到不受限制,同時兩者間還有一些不同等級的使用權限) 的視窗使用權限。
物件清單使用權限。 這類使用權限對允許和不允許的權限提供了很詳細的劃分規格。 FileIOPermission 類別是這類使用權限的好例子,因為它的狀態由允許特定存取種類的檔案清單來表示。 含有清單的使用權限最適合用來保護包含很多具名物件的資源。
一般而言,將自訂使用權限類別中的外部相依性減至最低是比較適切的作法,因為使用權限相依的每一個組件,當安全性系統要求您的使用權限類別時將必須載入。 請盡量將自訂使用權限及任何關聯的屬性類別置於單獨的組件中,以避免載入非必要的組件。