安全性要求
更新:2007 年 11 月
若要確保呼叫端已擁有指定的使用權限以呼叫您的程式碼,您可以宣告或命令要求程式碼的呼叫端必須擁有指定的使用權限或使用權限集合。需求將使 Runtime 執行一項安全性檢查來對程式碼的呼叫加上條件限制。在安全性檢查期間,Runtime 會全程查核呼叫堆疊,檢查堆疊中每一個呼叫端的使用權限,並決定需求的使用權限是否已授與每一個呼叫端。如果發現沒有所需使用權限的呼叫端,則安全性檢查失敗,並擲回 SecurityException。唯一不會造成堆疊查核行程 (Stack Walk) 的需求是連結要求,這種需求只會檢查立即呼叫端。
您可以讓安全性檢查在呼叫特定的方法時或執行特定的程式碼區塊之前進行檢查。如果想讓安全性檢查在呼叫特定類別的任何成員時進行檢查,您可以在類別之前放入一項需求,使它套用至類別中的每一個成員。這個主題的其餘部分將說明如何產生安全性要求、產生安全性要求的時機以及應該選擇那一類型的安全性要求。
當您正在撰寫一個直接存取受保護資源的類別庫,而呼叫端也可以看到這項存取時,您必須在類別庫產生一個安全性要求,以利於驗證呼叫堆疊中的所有呼叫端都擁有存取該資源的使用權限。您的需求可能是宣告式或命令式。請注意需求不應該設定於類別建構函式內,因為無法確定類別建構函式程式碼的執行時點和內容。因為類別建構函式內的呼叫堆疊狀態並沒有定義完整,因此將需求置於類別建構函式內可能會產生無法預期的結果。
無論您要設定的是那一種類型的需求,您都應該遵照以下的指示:
確認呼叫端是由那一特定站台或區域而來,或已由要求該呼叫端需擁有識別 (Identity) 使用權限的特定發行者 (Publisher) 簽章。然而,確認的時機應該是在符合識別使用權限而取得額外存取權的時機,而非因為符合識別使用權限而被拒絕存取的時候。因為修改或遮罩程式碼的識別是相當容易的,所以只依據識別的拒絕存取在面對未經授權的存取時並不是保護程式碼和資源的可靠方式。
確認物件只可由擁有特定使用權限的呼叫端將需求置於該物件的類別等級上來建立。例如,假設有一個衍生自 FileStream 類別的 myFileStream 類別,而您想確認只有獲得授權的呼叫端才可以建立 myFileStream 的執行個體。您可以將一個 FileIOPermission 物件的宣告式需求 (表示可以存取由 myFileStream 所建立資料流的權限) 置於 myFileStream 類別的類別等級上。
您也可以將需求放入可以設定或取得屬性的程式碼內。一般而言,放入取得存取子的需求其使用權限限制會少於設定存取子,含有敏感資訊的屬性除外,如密碼。
注意事項: 以角色為基礎的安全性檢查的語意 (Semantics) 和程式碼存取安全性檢查的語意只有些許的不同。如需詳細資訊,請參閱以角色為基礎的安全性。
注意事項: 需求只能套用在類別、方法、事件和屬性層級上;組件和個別非私用變數成員不會受到需求的保護。放入組件或非私用變數層即上的需求並不會產生編譯器警告。因此,您必須使用屬性,不能使用公用成員,才能確保需求所提供的保護。