ASP.NET 網站導覽安全性調整

更新:2007 年 11 月

網站的一般安全性要求的目的在於,只允許某些成員或其他已驗證的使用者可以看到某些頁面。ASP.NET 角色管理提供根據安全性角色限制存取 Web 檔案的方法。網站導覽安全性調整也會根據安全性角色,提供隱藏網站導覽中巡覽連結的方法。如需角色安全性的詳細資訊,請參閱了解角色管理

網站導覽安全性調整的運作方式

請考慮 ASP.NET 網頁中顯示的下列巡覽結構。

Home
   Products
      Hardware
      Software
      Discounts
   Services
      Training
      Consulting
      Support

不屬於角色成員的用戶端稱為「客戶」,其會受到針對 Support.aspx 頁面設定的 ASP.NET 存取角色限制,而無法檢視「支援」網頁。

若要隱藏巡覽顯示中的「支援」連結,請在 Web.config 檔中設定網站導覽提者,以啟用安全性調整。因為應用程式會使用 ASP.NET URL 授權和檔案授權隱藏支援網頁的連結,所以不需要額外的變更。ASP.NET 2.0 版隨附的 XmlSiteMapProvider 控制項,會使用 URL 和檔案授權功能,自動針對每個網站導覽節點執行授權檢查。

如果您想要讓不屬於「客戶」角色的用戶端看到「支援」連結,可以使用 Support.aspx 檔案之網站導覽節點的 roles 屬性。roles 屬性會將存取權擴展至 URL 授權和檔案授權所授與之存取層級以外的網站導覽節點。

下列程式碼範例會將支援網頁的 roles 屬性設定為 Customers。在啟用安全性調整後,即便是 URL 授權或檔案授權並不允許檢視實際檔案,這項設定仍然可以讓「客戶」角色中的使用者檢視支援網頁的巡覽連結。

<?xml version="1.0" encoding="utf-8" ?>
  <siteMap>
    <!-- other <siteMapNode> elements -->
      <siteMapNode title="Support" description="Support"
        url="~/Customers/Support.aspx" roles="Customers" />
  </siteMap>

如果因為 URL 或檔案授權規則導致無法檢視支援網頁,則不屬於「客戶」角色成員的使用者會看到下列巡覽結構。

Home
   Products
      Hardware
      Software
      Discounts
   Services
      Training
      Consulting

啟用安全性調整

安全性調整會與 ASP.NET 角色結合使用。因此,您必須使用存取規則 (allow 和 deny 項目) 限制頁面,以便讓安全性調整順利運作。如需存取規則的詳細資訊,請參閱使用角色管理授權

預設不會啟用安全性調整,並且無法以程式方式啟用安全性調整,只能在 Web.config 檔案中設定。這也適用於任何繼承自 SiteMapProvider 類別的自訂類別。

若要啟用安全性調整,必須在 Web.config 檔中設定 siteMap 項目 (ASP.NET 設定結構描述) 項目。如果網站導覽使用預設的 ASP.NET 網站導覽提供者,則 Web.config 檔可能不會包含 siteMap 項目 (ASP.NET 設定結構描述) 項目,此時您必須要新增一個項目。下列程式碼範例會加入預設網站導覽提供者,並且啟用安全性調整。

<system.web>
<!-- …other configuration settings -->
  <siteMap defaultProvider="XmlSiteMapProvider" enabled="true">
    <providers>
      <add name="XmlSiteMapProvider"
        description="Default SiteMap provider."
        type="System.Web.XmlSiteMapProvider "
        siteMapFile="Web.sitemap"
        securityTrimmingEnabled="true" />
    </providers>
  </siteMap>
</system.web>

效能考量

安全性調整功能會在每個要求上使用 URL 授權,判斷使用者是否具有與 siteMapNode 項目關聯的 URL 存取權限。但是,這項額外的工作會視授權的節點數量而降低效能,所以當您啟用安全性調整時,可以使用下列方法改善效能:

  • 在網站導覽檔案中限制節點數量:使用 150 個節點以上的網站導覽檔案,要花費較長的時間來執行安全性調整作業。

  • roles 屬性明確設定為 siteMapNode 項目:請注意,除非節點可以安全地向所有用戶端顯示,否則不可以將 roles 屬性設定為萬用字元或星號 (*)。當使用者屬於屬性列出的其中一個角色時,只要有 roles 屬性,便可以讓 ASP.NET 略過與 siteMapNode 相關聯的 URL 授權。

選取角色以避免不經意的調整

若要避免不經意的子網站導覽節點調整,請小心設定授權規則和角色屬性。請考慮 ASP.NET 網頁中顯示的下列巡覽結構。

Home
   Products
      Hardware

Products.aspx 檔設定的 URL 或檔案授權規則,不應該比 Hardware.aspx 檔設定的授權規則更嚴格。否則,因為「產品」的父連結被隱藏,所以應該能夠檢視「硬體」連結的使用者會發現連結已經隱藏。若要公開隱藏的連結,請在所有網站導覽節點中,加入列出被忽略之 ASP.NET 角色的 roles 屬性。

建議您允許所有人存取網站導覽中的根節點。若要執行這項操作,請將 roles 屬性設定為星號 (*) 或萬用字元,如下列程式碼範例所示。

<?xml version="1.0" encoding="utf-8" ?>
<siteMap>
  <siteMapNode title="Home" description="Home" 
    url="default.aspx" roles="*">
    <!-- other <siteMapNode> elements -->
  </siteMapNode>
</siteMap>

在網站導覽中,您可以參考 Web 應用程式以外的 URL。ASP.NET 無法測試存取應用程式以外的 URL。因此,啟用安全性調整時,除非您將角色屬性設定為星號 (*),讓所有用戶端都能夠在不需先行測試 URL 存取的情況下檢視網站導覽節點,否則將會看不到網站導覽節點。

搭配多重網站導覽或提供者使用安全性調整

您可以同時使用多重網站導覽定義單一網站的巡覽結構。例如,因為 Web.sitemap 檔能夠被分割而且放在不同的資料夾中,所以與 Web.config 檔類似。

網站導覽會藉由參考父網站導覽中,SiteMapNode 物件之 siteMapFile 或 provider 屬性中的子網站導覽檔案或提供者,以便進行互相連結。

下列程式碼範例會說明參考其他網站導覽的網站導覽節點。

<?xml version="1.0" encoding="utf-8" ?>

<siteMap>
  <!-- other <siteMapNode> elements -->
    <siteMapNode siteMapFile="~/Customers/Customers.sitemap" 
      securityTrimmingEnabled="true" />
</siteMap>

安全性調整影響的 API 成員

您可以使用巡覽控制項,在搭配少許或不使用程式碼的情況下,將站台巡覽加入頁面,但是您也可以透過程式方式使用站台巡覽。當 Web 應用程式執行時,ASP.NET 會公開反映網站導覽結構的 SiteMap 物件。SiteMap 物件的所有成員都是靜態的。SiteMap 物件則是會公開包含導覽中每個節點屬性的 SiteMapNode 物件集合。這是因為當您使用 SiteMapPath 控制項時,控制項會使用 SiteMapSiteMapNode 物件自動呈現正確的連結。

您可以在自己的程式碼中使用 SiteMapSiteMapNodeSiteMapProvider 物件,周遊網站導覽結構或是建立自訂控制項以顯示網站導覽資料。您無法寫入網站導覽,但是可以在物件的執行個體中改變網站導覽節點。如需詳細資訊,請參閱 HOW TO:在記憶體中以程式設計方式修改網站導覽節點HOW TO:以程式設計方式列舉 Site-Map 節點

ASP.NET 會使用預設網站導覽提供者 XmlSiteMapProvider 讀取 Web.sitemap 檔。如果您想要將網站導覽資訊存放在網站導覽檔案以外的位置,可以建立自己的網站導覽提供者,然後設定應用程式呼叫自訂提供者。網站導覽提供者是在 Web.config 檔中設定。當應用程式執行時,ASP.NET 會叫用提供者以便擷取所需的網站導覽資訊。然後 ASP.NET 會根據提供者回傳的資訊,建立並填入 SiteMapNode 物件。您可以使用 SiteMap 類別,以程式方法存取這些物件。如需詳細資訊,請參閱實作 ASP.NET 網站導覽提供者

安全性注意事項:

實作自訂的網站導覽提供者,並將網站導覽資料儲存在副檔名不是 .sitemap 的檔案中,可能會造成安全性風險。根據預設,ASP.NET 會設定為保護具有已知副檔名 (如 .sitemap) 的檔案,使用戶端無法下載這類檔案。若要協助保護您的資料,請將任何副檔名不是 .sitemap 的自訂網站導覽資料檔置於 App_Data 資料夾中。如需詳細資訊,請參閱設定 ASP.NET 網站巡覽的安全性

當啟用安全性調整時,會影響 SiteMapSiteMapNodeSiteMapNodeCollection 類別中某些成員的行為。當使用這些類別時,您會看到下列行為:

  • 如果站台巡覽 API 成員嘗試參考使用者沒有安全性權限檢視的網站導覽節點,就會傳回 null。例如,如果 CurrentNodeNextSiblingParentNodePreviousSibling 屬性嘗試傳回受限制的網站導覽節點,則這些屬性會傳回 null。

  • 如果站台巡覽 API 成員需要周遊網站導覽節點的樹狀目錄,在周遊時會排除不允許使用者檢視的任何網站導覽節點。例如,當執行 ChildNodes 方法時,就會將節點集合篩選為僅包含允許使用者檢視的節點。在 API 成員需要追蹤節點路徑的情況下,例如 CloneIsDescendantOf 方法,路徑會結束在受限制的節點。這會造成複製作業傳回較少的節點數量。即使在結構上這個節點實際可能是所要求節點的子代,也可能導致 IsDescendantOf 方法傳回 false 值。

  • 如果站台巡覽 API 成員參考使用者沒有安全性權限檢視的根節點,就會傳回 InvalidOperationException 例外狀況。只有根提供者的根節點需要能讓所有的使用者存取,以避免在一開始取得 SiteMap 物件時擲回例外狀況。

  • 如果 SiteMapNode 物件以錯誤的方式參考其他網站導覽檔案或提供者,就會擲回 ConfigurationException 例外狀況。

注意事項:

在網站導覽中,您可以參考 Web 應用程式以外的 URL。ASP.NET 無法測試存取應用程式以外的 URL。因此,如果您啟用安全性調整,除非您將角色屬性設定為星號 (*),讓所有用戶端都能夠在不需先行測試 URL 存取的情況下檢視網站導覽節點,否則將會看不到網站導覽節點。

請參閱

工作

逐步解說:根據安全性角色篩選網站導覽節點

概念

設定 ASP.NET 網站巡覽的安全性

設定資料存取的安全性

其他資源

使用角色管理授權

裝載環境中 ASP.NET 應用程式的安全性