ASP.NET 程式碼存取安全性
更新:2007 年 11 月
使用 ASP.NET 裝載多個網站的其中一個優點就是 Common Language Runtime (CLR) 對程式碼存取安全性的支援,有助於保護伺服器應用程式的安全。程式碼是根據程式碼來源的辨識項指派給安全性區域類別,例如組件的強式名稱 (Strong Name) 或程式碼的來源 URL。
以完全信任執行的應用程式,仍會受到在 Windows 帳戶 (ASP .NET 處理序識別) 下執行之 NTFS 檔案使用權限、資料庫使用權限等的約束。如需詳細資訊,請參閱設定 ASP.NET 處理序識別。
一般來說,讓組件成為強式名稱的組件,並加入該組件的安全性原則,即可設定各組件的程式碼存取安全性。不過,有許多 ASP.NET 組件是在頁面編譯期間動態產生以致無法強式命名,因此您必須間接地設定這些組件的安全性原則。此外,由於 ASP.NET 支援非編譯式應用程式,所以不支援以組件為基礎的辨識項。由於 ASP.NET 應用程式含有目錄結構的概念,所以相對於手動將 .NET Framework 設定成與個別電腦上的每個 ASP.NET 應用程式個別運作而言,根據 ASP.NET 應用程式的分類來設定程式碼存取安全性會比較容易。
ASP.NET 可讓您針對每個應用程式指派對應於預先定義之使用權限集的可設定信任層級。根據預設,應用程式會根據所呈現的辨識項指派信任層級。如果您要以低於 Full 使用權限集合的權限執行 Web 應用程式,必須使用在 ASP.NET 信任層級和原則檔 中定義之其中一個預先定義的信任層級,以強制部分信任原則。
您可以使用應用程式之 Web.config 檔中的下列組態設定覆寫預設行為,並使應用程式與指定的安全性原則產生關聯。
<location path="SampleApp" allowOverride="false">
<trust level="High"
originUrl="https://www.contoso.com"/>
</location>
Trust 組態項目可套用至電腦層級 (在此情況下,每個 ASP.NET 應用程式都會在該信任層級中執行) 或套用至階層架構中的任何應用程式根目錄 (在此情況下,信任層級會套用至特定的 ASP.NET 應用程式)。如果您要設定整個站台的原則,可透過編輯站台之根應用程式的 Web.config 檔,並將站台的根目錄指定為路徑位置即可達到此目的,如下列範例所示:
<location path="ContosoSite" allowOverride="false">
<trust level="High"
originUrl="https://www.contoso.com"/>
</location>
建議您針對受信任的站台,將 trust 組態項目的 level 屬性 (Attribute) 設定為 High。若為不受信任的站台 (例如 Web 伺服器,其裝載執行外部客戶之程式碼的站台),建議您將 trust 組態項目的 level 屬性設定為 Medium。如需在 Medium 信任中執行 ASP.NET 應用程式的詳細資訊,請參閱 Patterns and Practices (PAG): Security Guidance for Applications 中的<How To: Use Medium Trust in ASP.NET 2.0>。
如果您正在電腦或站台層級設定信任設定,通常可將 location 項目中的 allowOverride 屬性設為 false,這樣個別應用程式就無法指定本身的信任層級。此特性在共用伺服器安裝中很普遍。
下表列出 trust 組態項目的預設支援屬性。
屬性 |
說明 |
支援的值 |
---|---|---|
level |
指定應用程式執行之下的安全性區域。 |
Full、High、Medium、Low 和 Minimal。 |
originUrl |
指定 URL 或 URL 模式,以便允許使用 System.Net 命名空間中的類別進行連接存取。如果出現的話,這個屬性就可以用於檢查某些物件的使用權限 (例如 WebRequest 執行個體),而這些使用權限可允許連接至各種網路位置。例如,您可以使用 Web 伺服陣列中的伺服器主機名稱來設定這項屬性,如此 ASP.NET 網頁就可以呼叫與 Web 應用程式部署在相同 Web 伺服陣列中的 Web 服務。 |
語式正確 (Well-Formed) 的 HTTP URL,或 WebPermissionAttribute 所支援的 regex 架構語法。 |
下表列出 CLR 所支援的使用權限類型,以及不同信任層級下每個使用權限的預設原則。
使用權限 |
完整 |
高 |
中 |
低 |
最小 |
---|---|---|---|---|---|
Full |
High |
Medium |
Low |
Minimal |
|
不受限 |
不受限 |
無使用權限 |
無使用權限 |
無使用權限 |
|
不受限 |
不受限 |
不受限 |
無使用權限 |
無使用權限 |
|
不受限 |
不受限 |
Read:TEMP、TMP、OS、USERNAME、COMPUTERNAME |
無使用權限 |
無使用權限 |
|
不受限 |
不受限 |
Read、Write、Append、PathDiscovery:應用程式目錄 |
Read、PathDiscovery:應用程式目錄 |
無使用權限 |
|
不受限 |
不受限 |
AssemblyIsolationByUser()不受限 UserQuota |
1 MB UserQuota (可以針對個別站台變更),AssemblyIsolationByUser() |
無使用權限 |
|
不受限 |
無使用權限 |
無使用權限 |
|||
不受限 |
無使用權限 |
無使用權限 |
無使用權限 |
||
不受限 |
不受限 |
無使用權限 |
無使用權限 |
無使用權限 |
|
不受限 |
Execution, Assertion, ControlPrincipal, ControlThread, RemotingConfiguration |
Execution, Assertion, ControlPrincipal, ControlThread, RemotingConfiguration |
|||
不受限 |
無使用權限 |
無使用權限 |
|||
不受限 |
不受限 |
無使用權限 |
無使用權限 |
無使用權限 |
|
不受限 |
不受限 |
Connect 至原始主機 (若已設定的話) |
無使用權限 |
無使用權限 |
|
不受限 |
不受限 |
不受限 |
無使用權限 |
無使用權限 |
|
事件記錄檔 |
不受限 |
無使用權限 |
無使用權限 |
無使用權限 |
無使用權限 |
訊息佇列 |
不受限 |
無使用權限 |
無使用權限 |
無使用權限 |
無使用權限 |
服務控制器 |
不受限 |
無使用權限 |
無使用權限 |
無使用權限 |
無使用權限 |
效能計數器 |
不受限 |
無使用權限 |
無使用權限 |
無使用權限 |
無使用權限 |
目錄服務 |
不受限 |
無使用權限 |
無使用權限 |
無使用權限 |
無使用權限 |
當使用權限等級可以使用但未在安全性原則中明確提到時,以 Full 使用權限執行的應用程式一律可以使用該等級。除非您透過改變安全性原則,授予明確使用權限給資源,否則以較低信任層級執行的應用程式將無法使用資源。
如上表所示,具有 High 使用權限集合的應用程式在它們的應用程式目錄中具有讀取/寫入使用權限,而 Low 信任應用程式則在其應用程式目錄中具有檔案的唯讀使用權限。由於 FileIOPermission 型別依賴於實體路徑 (例如 c:\SampleAppPath),因此 ASP.NET 在原則檔案中所用的語彙基元化陳述式 (Statement),在執行階段會以應用程式的相關路徑資訊所取代。
WebPermission 類型可讓應用程式使用 System.Net.WebRequest 等類別,連接至原始主機屬性所定義的網路位置。在 ASP.NET 中,在信任區段對指定的應用程式提供選擇性 originUrl 屬性,即可設定這個使用權限。originUrl 屬性會取代原則檔中的 $OriginHost$ 變數,如 Web_hightrust.config 檔的下列區段所示:
<IPermission class="WebPermission" version="1">
<ConnectAccess>
<URI uri="$OriginHost$"/>
</ConnectAccess>
</IPermission>