asp.net|安全|安全性|訪問 使用 ASP.NET 來承載多個 Web 網站的一個主要優點是:公用語言運行庫支援代碼訪問安全,可協助保護伺服器應用程式的安全。根據關於代碼來源的證據(例如帶有強式名稱的程式集或源的 URL 等證據),代碼被分配到安全區域分類中。如果不能為安裝在公用伺服器上的各個互不相關的應用程式配置安全機制,那麼 ASP.NET 頁中屬於一個應用程式的代碼將能夠讀取另一個應用程式中的檔案(例如 Web.config 檔案)。以完全信任方式啟動並執行應用程式只受作業系統帳戶的限制,這些應用程式在該帳戶下執行。
通過對程式集進行強命名並為該程式集添加策略,可以方便地為個別程式集處理程式碼存取安全性。但是,作為動態網頁編譯的結果,將動態產生許多 ASP.NET 程式集,因此這些程式集未進行強命名,所以需要附加功能。
ASP.NET 允許您嚮應用程式分配對應於一組預定義許可權的可配置信任層級。預設情況下(除非顯式更改配置),應用程式將接收到與它們提供的證據相稱的信任層級。例如,本地應用程式必須在 MyComputer 地區中使用 Full 信任許可權集運行,位於通用命名規則 (UNC) 共用上的應用程式必須在 Intranet 地區中使用 LocalIntranet 限制許可權集運行。如果要使用低於 Full 信任的層級運行 Web 應用程式,則您必須使用 ASP.NET 信任層級和策略檔案中定義的某個預定義信任層級來實施部分信任策略。
您可以使用以下配置設定重寫預設行為並將應用程式和給定的安全性原則關聯起來。
<location path="MyApp" allowOverride="false"><trust level="High"originUrl="http://www.contoso.com"/></location>
<trust> 配置標記可應用於電腦層級或階層中的任何應用程式根目錄。
如果要為整個網站設定策略,您可以通過將網站的根目錄指定為路徑位置完成該操作,如下所示。
<location path="ContosoSite" allowOverride="false"><trust level="High"originUrl="http://www.contoso.com"/></location>
如果不想讓應用程式能夠指定它們自己的信任層級(多數共用伺服器安裝中是這種情況),則在使用 allowOverride 屬性指定 <location> 指令時應小心。
下表列出了 <trust> 元素預設支援的屬性。
屬性 |
說明 |
預設支援的值 |
level |
指定應用程式將在其中啟動並執行安全區域。 |
Full、High、Medium、Low 和 Minimal。 |
originUrl |
允許管理員設定應用程式的源的 URL。 這允許依賴於宿主概念的許可權正常工作 |
格式正確的 HTTP URL。 |
預設情況下,向與不同的安全層級關聯的策略授與權限顯示在下表中。
|
層級 |
許可權 |
完全 |
高 |
中 |
低 |
最小 |
AspNetHostingPermission |
完全 |
高 |
中 |
低 |
最小 |
Environment |
Un |
Un |
讀:TEMP、TMP、OS、USERNAME、COMPUTERNAME |
|
|
FileIO |
Un |
Un |
讀、寫、追加、路徑發現:應用程式目錄 |
讀、路徑發現:應用程式目錄 |
|
IsolatedStorage |
Un |
Un |
AssemblyIsolationByUser、不受限制的使用者配額 |
1 MB 配額(對於個別網站可能有所變化)、AssemblyIsolationByUser |
|
Reflection |
Un |
ReflectionEmit |
|
|
|
Registry |
Un |
|
|
|
|
Security |
Un |
執行、斷言、控制主體、控制線程、遠端配置 |
執行、斷言、控制主體、控制線程、遠端配置 |
執行 |
執行 |
Socket |
Un |
Un |
|
|
|
WebPermission |
Un |
Un |
串連到原始主機(如果已配置) |
|
|
DNS |
Un |
Un |
Un |
|
|
Printing |
Un |
預設列印 |
預設列印 |
|
|
OleDBPermission |
Un |
|
|
|
|
SqlClientPermission |
Un |
Un |
AllowBlankPassword=false |
|
|
EventLog |
Un |
|
|
|
|
Message Queue |
Un |
|
|
|
|
Service Controller |
Un |
|
|
|
|
Performance Counters |
Un |
|
|
|
|
Directory Service |
Un |
|
|
|
|
Un = 無限制的
空白 = 無許可權
如果某個權限等級可用但未在安全性原則中明確提出,則使用 Full 信任層級啟動並執行應用程式可以使用它(因為它們具有 Full 信任許可權集)。使用較低信任層級啟動並執行應用程式將不能使用被非明確權限保護的資源,除非您明確更改策略允許它使用。
如該表所示,High 信任應用程式對位於其應用程式目錄中的檔案具有讀/寫入權限,而 Low 信任應用程式對位於其應用程式目錄中的檔案具有唯讀許可權。因為 FileIO 許可權依賴於實體路徑(例如 c:\MyAppPath
),所以 ASP.NET 在策略檔案中使用標記化的語句,這些標記化的語句在運行時被應用程式的相關路徑資訊替換。
請注意,WebPermission 允許應用程式串連到原始主機。該機制通過在給定應用程式的 <trust> 部分提供可選的 OriginUrl 屬性在 ASP.NET 中工作。OriginUrl 屬性用於替換策略檔案中的
$OriginHost$ 變數,如 Web_hightrust.config 中的以下代碼所示。
<IPermission class="WebPermission" version="1"><ConnectAccess><URI uri="$OriginHost$"/></ConnectAccess></IPermission>
SocketPermission 擷取主機名稱或以點分隔的 IP 字串(可能帶有萬用字元),WebPermission 擷取包括協議的Regex(例如 http://backendmachine/.*
)。如果要對此變更,您可以使用所需的許可權更改策略檔案(或通過複製預設設定建立新的策略檔案)。例如,您可以從 ASP.NET 命名許可權集更改 SocketPermission 部分,以向連接埠 8080 上的“backend1”和“backend2”授予 TCP 通訊端串連,如下所示。
<IPermission class="SocketPermission" version="1"><ConnectAccess><ENDPOINT host="backend1" transport="Tcp" port="8080"/><ENDPOINT host="backend2" transport="Tcp" port="8080"/></ConnectAccess></IPermission>
出處:MSDN