2010-10-04 46 views
0

我寫了下面的代碼來測試CAS:關於產品代碼訪問安全(CAS)的工作模式

[SecurityPermission(SecurityAction.Demand,Flags=SecurityPermissionFlag.Execution)] 
    static void Main(string[] args) 
    { 
     Console.WriteLine("hello, world!"); 
    } 

在.NET 2.0的配置,我用上面的程序集的強名稱創建一個代碼組並給予該組權限集。所以大會沒有按預期開始。

但我注意到,如果我刪除以下屬性:

[SecurityPermission(SecurityAction.Demand,Flags=SecurityPermissionFlag.Execution)] 

程序還是無法啓動。那麼這個所謂的聲明式安全有什麼意義?

我讀了幾篇有關CAS的教程,他們使用命令式/聲明式安全來使用CAS。但從上面的例子來看,似乎沒有必要。

如果我故意編寫沒有強制/聲明安全性的代碼,也不提供任何證據給我的程序集,CAS是否會盲目執行任何安全策略?

或者我誤解了預計CAS如何使用?

謝謝。

回答

1

CAS權限需求導致在進行請求的方法之上驗證每個調用堆棧幀。由於您的程序集不運行代碼來調用Main方法,因此不會針對您的任何代碼對需求進行評估。

這是拒絕通過策略執行權限導致您的程序集被阻止執行。當CLR運行您的彙編代碼時,該權限正在被CLR評估。沒有必要添加您自己的權限需求。要退後一步,看看CAS要求(聲明式或命令式)如何使用,請考慮權限保護對資源的訪問。允許訪問資源(例如:文件系統)的任何代碼都不會被託管代碼訪問,該代碼應提供可用於控制對該資源的訪問權限(例如:FileIOPermission)。允許訪問資源的代碼還負責在允許訪問資源之前對該權限提出要求。

大多數編寫託管代碼的開發人員永遠不需要編寫CAS權限或明確要求CAS權限,因爲他們通常會訪問由.NET基類庫或其他微軟或第三方庫。