覆寫安全性檢查
更新:2007 年 11 月
在正常的情況下,安全性檢查都會檢查呼叫堆疊中的每一個呼叫端,以確保每一個呼叫端都已被授與指定的使用權限。但是,您可以在個別使用權限物件或使用權限集合物件上呼叫 Assert、Deny 或 PermitOnly,以覆寫安全性檢查的結果。依照您呼叫的方法類型而定,您可以使安全性檢查成功或失敗,即使尚未檢查完堆疊上所有呼叫端的使用權限。
當一個方法呼叫另一個方法時,將在呼叫堆疊上產生一個新的框架 (Frame) 以儲存被呼叫方法的相關資訊(使用建構函式和存取屬性在這種情況下被視同一種呼叫方式)。每個堆疊框架 (Stack Frame) 中都含有方法對 Assert、Deny 或 PermitOnly 的任何呼叫資訊。如果呼叫端在同一個方法呼叫中使用一個以上的 Assert、Deny 或 PermitOnly,執行階段會套用下列會影響覆寫行為的處理規則:
如果在堆疊查核行程 (Stack Walk) 期間內,執行階段在一個堆疊框架 (Stack Frame) 中找到一個以上同類型的覆寫 (即兩個對 Assert) 的呼叫),第二個覆寫會導致擲回例外狀況。
當相同的堆疊框架 (Stack Frame) 中有不同的覆寫時,執行階段會依照下列順序處理這些覆寫:先處理 PermitOnly,接著是 Deny,最後才處理 Assert。
如果要取代覆寫,請先呼叫適當的還原方法 (例如,RevertAssert),再套用新的覆寫。
注意事項: |
---|
堆疊查核行程 (Stack Walk) 覆寫不應該置於類別建構函式 (Constructor) 內,因為無法保證類別建構函式程式碼的執行時點和內容。因為類別建構函式內的呼叫堆疊狀態並沒有定義完整,因此將堆疊查核行程覆寫置於類別建構函式內可能會產生無法預期的結果。 |
應用程式開發人員通常不需要使用 Assert、Deny 或 PermitOnly,元件和類別庫 (Class Library) 開發人員也很少需要使用。不過,適用安全性覆寫的情形將在 Assert、Deny 和 PermitOnly 主題中說明。
注意事項: |
---|
如果您執行覆寫 (Deny、Assert 或 PermitOnly),則必須先還原使用權限,才能在相同的堆疊框架 (也就是方法) 中執行相同類型的覆寫。否則,會擲回 SecurityException。例如,如果您拒絕了使用權限 P,就必須先還原該使用權限,然後才能使用相同的方法拒絕另一個使用權限 Q。 |
請使用以下表格列示的其中一種靜態方法來還原覆寫。
方法 |
方法動作 |
---|---|
造成目前框架先前的所有覆寫都被移除且不再發生作用 |
|
造成目前框架先前的所有 Assert 都被移除且不再發生作用 |
|
造成目前框架先前的所有 Deny 都被移除且不再發生作用 |
|
造成目前框架先前的所有 PermitOnly 都被移除且不再發生作用 |