-
前兩天我寫了一篇關於ASP.NET程式許可權的隨筆,今天繼續和大家討論下代碼訪問安全。
代碼訪問安全(Code Access Security),顧名思義,是用來限制代碼的。它能限制代碼能否被執行,進而來限制ASP.NET程式能執行什麼樣的操作。比如CAS限制你不允許使用FileIOPermission,那麼ASP.NET程式便不能進行IO操作。同樣,如果限制你使用SqlClientPermission,ASP.NET程式便不能進行SQL Server的操作。
CAS預設定義了5個不同的level,它們是Full,High,Medium,Low 以及Minimal。從Full到Minimal,許可權越來越低。基本上在Full level的時候什麼都能做,Minimal level的時候只能執行最基本的mangered code。在我們的ASP.NET程式中,trust level是在根目錄下的web.config中配置的,如:<trust level="Full"/>,如果你沒有配置的話,預設為Full level。今天以一個host admin的角色講講怎樣通過CAS來保護server。大概有如下幾個步驟:
1) 明確server上ASP.NET程式需要進行什麼樣的操作。
2) 從預定義好的5個層級中選擇一個最適合的層級。
3) 如果沒有合適的,自己定義一個層級。
4) 定義層級不允許被覆蓋。
5) 測試效果。
第一步:明確server上ASP.NET程式需要進行什麼樣的操作。這是要根據host admin的來定的,在這方面我也沒太多經驗,這裡不過多討論。P.S. 如果你想知道你的ASP.NET程式需要什麼樣的許可權,你可以通過一個.NET Framework內建的工具來查看。這個工具叫Permissions Calculator Tool,我們可以通過.NET Framework的命令視窗來調用它:
輸入:percalc -show D:\MyProjects\Job\bin\Job.dll 斷行符號
結果:工具會自動分析assembly裡面每個type中的任一method所需要的許可權,並把這個結果輸出到同目錄下的xml檔案中。如:
第二步:從預定義好的5個層級中選擇一個最適合的層級。根據需要,可以選擇一個最適合的層級,如High,Medium等等。
第三步:如果沒有合適的,自己定義一個層級。如果High層級比需要的許可權要大,Medium又比需要的許可權要小(e.g. RegistryPermission)怎麼辦?此時,我們可以考慮自訂一個層級。為了簡單化,我們可以copy整個Medium policy,然後在其中添加上RegistryPermission,這樣就成了我們自己的自訂level,還是很簡單明了吧
所有不同層級的設定檔都可以在 C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG 目錄下找到。為了自訂一個machine-level的配置,我們可以在此目錄建立一個新的xml檔案,命名為custom.config,然後將web_mediumtrust檔案內容都copy進去。這樣我們的自訂層級就有了和Medium相同的許可權。為了有更高的許可權,我們需要將RegistryPermission手動添加進去。這個過程分為三個步驟:
1) 在<SecurityClass> section添加這段代碼:
Code
<SecurityClass Name="RegistryPermission"
Description="System.Security.Permissions.RegistryPermission,
mscorlib, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089"/>
2) 在如下section中添加這段代碼:
Code
<PermissionSet
class="NamedPermissionSet"
version="1"
Name="ASP.Net">
<IPermission
class="RegistryPermission"
version="1"
Unrestricted="true" />
</PermissionSet>
3) 將自訂層級定義到machine-level的web.config中:
Code
<location allowOverride="true">
<system.web>
<securityPolicy>
<trustLevel name="Full" policyFile="internal" />
<trustLevel name="High" policyFile="web_hightrust.config" />
<trustLevel name="Medium" policyFile="web_mediumtrust.config" />
<trustLevel name="Low" policyFile="web_lowtrust.config" />
<trustLevel name="Minimal" policyFile="web_minimaltrust.config" />
<trustLevel name="Custom" policyFile="Custom.config" />
</securityPolicy>
<trust level="Full" originUrl="" />
</system.web>
</location>
第四步:定義層級不允許被覆蓋。我們只需要將剛才的 allowOverride 設定為 false 即可。
第五步:測試效果。可以在本機建立一個ASP.NET程式,然後部署到原生IIS中。然後可以測試下只有Full level或High level下可以訪問的代碼現在能否訪問。以及除了Medium level的代碼,RegistryPermission能否訪問。
P.S. 這裡有一篇非常好的MSDN文章就詳細講解了CAS,本文也參考了這篇文章。
Have a nice day!