覆寫安全性檢查

在正常的情況下,安全性檢查都會檢查呼叫堆疊中的每一個呼叫端,以確保每一個呼叫端都已被授與指定的使用權限。 但是,您可以在個別使用權限物件或使用權限集合物件上呼叫 AssertDenyPermitOnly,以覆寫安全性檢查的結果。 依照您呼叫的方法類型而定,您可以使安全性檢查成功或失敗,即使尚未檢查完堆疊上所有呼叫端的使用權限。

重要事項重要事項

在 .NET Framework 4 版 中,已經移除對強制 DenyRevertDeny 使用權限要求的執行階段支援。在依據 .NET Framework 4 (含) 以後版本為基礎的程式碼上不可以使用這些要求。如需這項變更和其他變更的詳細資訊,請參閱 .NET Framework 4 中的安全性變更

當一個方法呼叫另一個方法時,將在呼叫堆疊上產生一個新的框架 (Frame) 以儲存被呼叫方法的相關資訊 (使用建構函式和存取屬性在這種情況下被視同一種呼叫方式)。每個堆疊框架 (Stack Frame) 中都含有方法對 AssertDenyPermitOnly 的任何呼叫資訊。 如果呼叫端在同一個方法呼叫中使用一個以上的 AssertDenyPermitOnly,執行階段會套用下列會影響覆寫行為的處理規則:

  • 如果在堆疊查核行程 (Stack Walk) 期間內,執行階段在一個堆疊框架 (Stack Frame) 中找到一個以上同類型的覆寫 (即兩個對 Assert) 的呼叫),第二個覆寫會導致擲回例外狀況。

  • 當相同的堆疊框架 (Stack Frame) 中有不同的覆寫時,執行階段會依照下列順序處理這些覆寫:先處理 PermitOnly,接著是 Deny,最後才處理 Assert

如果要取代覆寫,請先呼叫適當的還原方法 (例如,RevertAssert),再套用新的覆寫。

注意事項注意事項

堆疊查核行程 (Stack Walk) 覆寫不應該置於類別建構函式 (Constructor) 內,因為無法保證類別建構函式程式碼的執行時點和內容。因為類別建構函式內的呼叫堆疊狀態並沒有定義完整,因此將堆疊查核行程覆寫置於類別建構函式內可能會產生無法預期的結果。

應用程式開發人員通常不需要使用 AssertDenyPermitOnly,元件和類別庫 (Class Library) 開發人員也很少需要使用。 不過,適用安全性覆寫的情形將在 AssertDenyPermitOnly 主題中說明。

注意事項注意事項

如果您執行覆寫 (DenyAssertPermitOnly),則必須先還原使用權限,才能在相同的堆疊框架 (也就是方法) 中執行相同類型的覆寫。否則,會擲回 SecurityException。例如,如果您拒絕了使用權限 P,就必須先還原該使用權限,然後才能使用相同的方法拒絕另一個使用權限 Q。

請使用以下表格列示的其中一種靜態方法來還原覆寫。

方法

方法動作

CodeAccessPermission.RevertAll

造成目前框架先前的所有覆寫都被移除且不再發生作用

CodeAccessPermission.RevertAssert

造成目前框架先前的所有 Assert 都被移除且不再發生作用

CodeAccessPermission.RevertDeny

造成目前框架先前的所有 Deny 都被移除且不再發生作用 這個方法在 .NET Framework 4 中已過時。

CodeAccessPermission.RevertPermitOnly

造成目前框架先前的所有 PermitOnly 都被移除且不再發生作用

請參閱

參考

使用 Assert 方法

使用 Deny 方法

使用 PermitOnly 方法

概念

程式碼存取安全性

撰寫安全類別庫