當服務器接收到對於特定 Web 資源的請求時,ASP.NET 就會使用所請求的 URL 的虛擬目錄路徑中所有的配置文件來分級計算該資源的配置設置。例如,您有一個網站具有如下的文件結構,其中應用程序的根目錄就是應用程序虛擬目錄 (Vdir)。
在通常情況下,最後一個配置設置會覆蓋父目錄中提供的相同節的設置,但節處理程序可能會執行某種不同的繼承方案。
例如,作為一名管理員,您可以將應用程序的設置配置為允許所有用戶訪問應用程序根目錄(即映射到應用程序虛擬目錄的物理路徑)中的 ASP.NET 資源,而只有選定的用戶才能訪問兩個子目錄中的 ASP.NET 資源。
假定 SubDir1 目錄中有 Web.config 文件而應用程序根目錄或 SubDir2 目錄中卻沒有。在這種情況下,ASP.NET 使用兩個配置文件。級別最高的文件是位於 systemroot\Microsoft .NET \Framework\versionNumber\CONFIG 目錄中的文件。該文件名為 Machine.config,它是計算機級別的文件,所有 ASP.NET 目錄和子目錄都繼承其設置。Machine.config 隨 .NET Framework 提供,其中包含了許多默認的 ASP.NET 設置。該文件的安全配置節的默認配置允許所有用戶訪問全部 URL 資源。在示例的應用程序根目錄中沒有對安全性進行修改的配置文件,因此所有用戶都有權訪問其中 ASP.NET 資源(因為該目錄繼承了計算機級別的配置文件的設置)。如果 SubDir1 目錄中的 Web.config 文件包含了僅允許部分用戶訪問的安全配置節,那麼 SubDir2 會繼承該設置。因此,所有的用戶都有權訪問應用程序根目錄中的 ASP.NET 資源,但是只有部分用戶可以訪問 SubDir1 和 SubDir2 中的 ASP.NET 資源。
虛擬目錄的配置設置是與物理目錄結構無關,虛擬目錄必須細心組織,以避免產生配置問題。例如,可能有一個名為 MyResource.aspx 的應用程序具有如下物理目錄結構。
C:\Subdir1\Subdir2\MyResource.aspx
假定配置文件位於 Subdir1 中,名稱為 Vdir1 的虛擬目錄映射到 c:\Subdir1 上,名稱為 Vdir2 的虛擬目錄映射到 c:\Subdir1\Subdir2 上。如果客戶端使用 URL http://localhost/vdir1/subdir2/MyResource.aspx 訪問物理路徑為 c:\Subdir1\Subdir2\MyResource.aspx 的資源,則該資源從 Vdir1 繼承配置設置。然而,如果客戶端使用 URL http://localhost/vdir2/MyResource.aspx 來訪問相同的資源,則該資源不會從 Vdir1 繼承設置。因此,按照這樣的方式創建虛擬目錄會產生預料不到的結果,甚至使應用程序不能運行。我們並不建議您這樣做。
注意 ASP.NET 配置系統僅適用於 ASP.NET 資源(通過 Aspnet_isapi.dll 注冊以便由 ASP.NET 處理的資源)。在默認情況下,配置系統不提供對於非 ASP.NET 資源的授權。例如,所有的用戶都可以訪問 ASP、HTML、TXT、GIF 和 JPEG 文件。在前面的示例中,如果啟用了目錄浏覽且沒有其他限制,則所有用戶都可以查看應用程序根目錄、SubDir1 和 SubDir2 中的非 ASP.NET 文件。有關 ASP.NET 安全的詳細信息,請參閱 ASP.NET 安全。
配置 <location> 設置
通過使用具有適當 path 屬性的 <location> 標記,可將配置設置應用到特定的資源。path 屬性可用於指明應用特殊配置設置的特定文件或子目錄。
例如,下列配置文件在三個級別上指定了設置:
應用於當前目錄和所有子目錄的設置,即包含在頂級 <configuration> 標記中的所有內容。
應用於 Sub1 子目錄的設置,即包含在路徑屬性設置為 Sub1 的 <location> 標記中的所有內容。
應用於 Sub2 子目錄的設置,即包含在路徑屬性設置為 Sub2 的 <location> 標記中的所有內容。
<configuration>
<system.web>
<sessionState cookieless="true" timeout="10"/>
</system.web>
<!-- "Sub1" 子目錄的配置。 -->
<location path="sub1">
<system.web>
<httpHandlers>
<add verb="*" path="Sub1.Scott" type="Sub1.Scott"/>
<add verb="*" path="Sub1.David" type="Sub1.David"/>
</httpHandlers>
</system.web>
</location>
<!-- "Sub2" 子目錄的配置。 -->
<location path="sub2">
<system.web>
<httpHandlers>
<add verb="*" path="Sub2.Scott" type="Sub2.Scott"/>
<add verb="*" path="Sub2.David" type="Sub2.David"/>
</httpHandlers>
</system.web>
</location>
</configuration>
鎖定配置設置
默認情況下,位於子目錄的配置文件覆蓋並擴展父配置文件中定義的所有配置設置。在應用程序宿主方案中,管理員通常要鎖定或禁止他人訪問站點上的某些設置以免這些設置被修改。例如,管理員可能要鎖定宿主應用程序的沙盒安全設置,以防止 Web 用戶攻擊該系統。
管理員可通過將 allowOverride="false" 屬性添加到 <location> 指令中來鎖定配置設置。它通知配置系統:如果低級配置文件試圖覆蓋此鎖定 <location> 指令中定義的任何配置節,則引發錯誤。
以下配置文件示例(可在主系統級別或站點級別存儲該文件)鎖定兩個不同的 ASP.NET 應用程序(application1 和 application2)的信任級別。
<configuration>
<location path="application1" allowOverride="false">
<system.web>
<trust level="High"/>
</system.web>
</location>
<location path="application2" allowOverride="false">
<system.web>
<trust level="Medium"/>
</system.web>
</location>
</configuration>
如果使用以下示例中的配置設置覆蓋上一示例中的配置設置,就會生成一個配置系統錯誤。
<configuration>
<system.web>
<trust level="Full"/>
</system.web>
</configuration>