Demand failed
Demand failed
在上面的代碼示例中,盡管第一個 Demand 訪問的是一個受限制系統目錄,但它還是成功了。請記住,運行庫安全系統是在基礎操作系統設置上面運行的。因此,可以讓運行庫安全策略對某些目錄授予訪問權限,當托管代碼試圖訪問這些目錄時,將會引發操作系統訪問沖突。直接跟在 Deny 后面的下一個 Demand 也成功了。當執行 Demand 時,沒有檢查請求函數的激活記錄,而只檢查了它的調用方。因此,盡管函數已經拒絕訪問,但也不會被 Demand 檢測到。對 CheckDeny 和后面的 Demand 的調用失敗了,F在檢查前面方法中的 Deny,因為它位于調用方的堆棧幀中。接下來我們返回到 Main 并進行一個 Assert。在這里,有一個已經斷言的權限也在這個堆棧幀中被拒絕了。當我們進入 CheckDeny 時,Demand 會再次引發一個異常,這是為什么呢?從本質上講,Deny 重寫了 Assert;這是因為 Deny 權限集總是在 Assert 權限集之前接受檢查。
簡要的說,使托管資源可以引發托管安全堆棧審核的功能是保護資源的運行庫安全系統方法。授予的權限集是程序集從每個策略級別上運行的授權計算收到的,該權限集會與資源請求的權限進行對照檢查。如果后者形成了前者的一個子集,那么就可以訪問受保護資源。除非已像上面描述的那樣對堆棧進行了修改,否則就會對調用鏈中托管資源的所有調用方執行這種子集檢查。因此安全堆棧審核綜合了運行庫安全系統的以下兩個方面:1) 證據和權限之間的可配置映射;2) 通過強制所有的調用方擁有一定級別的權限來保護資源。
實際上有兩種不同的方式可用于以編程的方式表達堆棧審核請求和堆棧修改操作 — 聲明性安全和命令性安全。
返回頁首
聲明性方式和命令性方式
.NET 框架允許開發人員以兩種方式表達安全約束。以聲明性方式 表達安全約束意味著使用自定義屬性語法。這些批注保留在類型的元數據中,在編譯時會有效地溶入到程序集中。下面是聲明性方式安全的一個示例:
[PrincipalPermissionAttribute(SecurityAction.Demand,
Name=@"culex\damien")]
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/