2010-03-22 27 views
11

我有一個(簡單的)站點地圖,並試圖找出爲什麼某個子菜單是總是可見。ASP.NET web.sitemap - 角色似乎無法控制可見性?

<?xml version="1.0" encoding="utf-8" ?> 
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > 
    <siteMapNode url="~/Login.aspx" title="Home" description="RivWorks" roles="*"> 
    <siteMapNode url="" title="Dashboard" description="" roles="campaigns, auto_negotiation"> 
     <siteMapNode url="CampaignBuilder.aspx" title="Campaign Manager" description="Manage your campaign settings" roles="campaigns" /> 
     <siteMapNode url="ProductManager.aspx" title="Negotiation Manager" description="Manage your product and negotiation settings" roles="auto_negotiation" /> 
    </siteMapNode> 
    <siteMapNode url="" title="Support Options" description="" roles="customers, customer_super, riv_admins, riv_super"> 
     <siteMapNode url="ChangePassword.aspx" title="Change Password" description="" roles="customers, customer_super, riv_admins, riv_super" /> 
     <siteMapNode url="http://rivworks.zendesk.com/requests/anonymous/new" title="Submit a Support Ticket" description="" roles="customers, customer_super, riv_admins, riv_super" /> 
     <siteMapNode url="http://rivworks.zendesk.com/forums/49919/entries" title="Tips &amp; Tricks" description="" roles="customers, customer_super, riv_admins, riv_super" /> 
    </siteMapNode> 
    </siteMapNode> 
</siteMap> 


注:web.config設置

<siteMap defaultProvider="XmlSiteMapProvider" enabled="true"> 
    <providers> 
    <add name="XmlSiteMapProvider" 
     description="Default Site Map Provider" 
     type="System.Web.XmlSiteMapProvider" 
     siteMapFile="Web.sitemap" 
     securityTrimmingEnabled="true" /> 
    </providers> 
</siteMap> 


我有 「儀表板」 的主菜單選項。在這個菜單項下,我有兩個選項:1)競選經理& 2)談判經理。現在,有趣的是,當我處於廣告系列角色 的自動協商角色時,我看到了Dashboard和 BOTH子菜單項。這不是我預期的行爲。當我處於廣告系列角色 自動協商角色時,我預計只能看到這兩個子菜單。該 OR情況下應該給我的儀表盤菜單項和一個 OR其他子項...

我在這裏做得不對或思維錯誤的方法?

TIA

回答

25

我懷疑你已經掉進陷阱大家都這樣做,相信角色屬性限制了節點的可見性。它沒有,它實際上擴大了知名度。所有限制都在web.config中的標準部分完成。

全部下面的文字是從原來的職位在https://web.archive.org/web/20130408064047/http://ipona.com/asp-net-site-maps-security-trimming-and-roles/

這是最常見的問題之一,似乎混淆了大家的恆定源,因爲它是我,當我第一次讀到它。 ASP.NET SiteMap允許將導航結構定義爲一組XML元素,這些元素非常適合描述菜單項的層次結構。這些XML項目是一個siteMapNode元素,它具有屬性角色。看起來很明顯,這定義了可以看到這個項目的角色,但顯而易見的事實上是錯誤的。以下是有關站點地圖的最重要的事實:

roles屬性不限制節點的可見性。

這應該足夠清楚,即使它看起來還是錯的。這是它的工作原理。 所有頁面限制都通過授權處理。您可以在基本web.config中或文件夾中的web.config文件中執行此操作。例如,假設存在一個Admin文件夾,在該文件夾下保存所有管理頁面。您只希望這些頁面可以在管理員角色中使用。您可以像這樣配置授權:

<location path="Admin"> 
    <system.web> 
    <authorization> 
     <allow roles="Admin" /> 
     <deny users="*" /> 
    </authorization> 
    </system.web> 
</location> 

現在,Admin文件夾不能再由任何不在Admin角色的人訪問;如果您不是Admin角色,並嘗試導航到Admin文件夾中的某個頁面,可以通過另一個頁面上的鏈接或通過直接在瀏覽器中輸入URL,將您重定向到登錄頁面。你可以在你的web.config中有多個位置元素,用於不同的文件夾甚至單個文件;事實上,如果您擁有限制性網站,則可能需要明確開放某些網頁,例如登錄頁面;當您無權訪問登錄頁面時,很難登錄到網站。如果您不想讓基礎web.config混亂,則可以使用相同的規則在Admin文件夾中創建一個web.config文件;由於配置適用於當前文件夾,因此您不需要位置元素。

這就是授權完成;訪問頁面被鎖定。現在讓我們考慮導航。 ASP.NET導航框架支持授權,但前提是您需要在提供程序上配置安全修整功能,但默認情況下未配置該功能。這意味着你需要在站點地圖配置添加到web.config中:

<siteMap enabled="true" defaultProvider="AspXmlSiteMapProvider"> 
    <providers> 
    <clear /> 
    <add name="AspXmlSiteMapProvider" securityTrimmingEnabled="true" 
    type="System.Web.XmlSiteMapProvider, System.Web, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 
    siteMapFile="web.sitemap"/> 
    </providers> 
</siteMap> 

大部分是機器級配置安裝ASP.NET時,但關鍵的securityTrimmingEnabled值設置爲默認爲false 。上面所做的是清除現有配置並添加一個新屬性設置爲true的條目。在這個階段,導航框架現在將遵守授權規則,所以如果用戶沒有對該項目的授權,菜單項將不會顯示;如果使用Menu或TreeView來顯示菜單項,則無關緊要,關鍵部分是使用SiteMapDataSource(或者如果您手動構建菜單,則使用Sitemap API)。如果你有一個自定義的站點地圖提供程序,比如數據庫驅動的(比如MSDN上的這個),那麼這可能需要自己進行安全檢查,但這取決於你從哪個基類繼承而來。這是另一篇文章的另一個故事。

所以如果你不需要修改站點地圖元素本身,角色屬性是什麼?那麼它的工作方式與你可能期望的相反,即打開節點的可見性,顯示節點是否該用戶處於規定的角色,即使他們沒有權限訪問頁面本身(因爲授權規則限制了它們從訪問它)。你爲什麼要這樣做?那麼,你必須瞭解安全修整的工作原理。在決定用戶是否可以看到節點時,檢查授權和物理文件權限;如果其中一個失敗,那麼該節點將被視爲無法訪問。有兩種常見的物理文件檢查失敗的情況:

  1. 該URL不是本地的。如果該文件不在本地,則不能進行檢查。
  2. 沒有URL。該節點可能只是一個容器節點,具有子頁面,但本身不包含頁面。

在這兩種情況下,物理文件檢查都會失敗,因此節點將不會顯示。因此,您可能需要打開節點的可見性。例如,考慮以下因素:

<siteMapNode title="Admin" roles="Admin"> 
    <siteMapNode url="~/Admin/membership_CreateMember.aspx" title="Create User" /> 
    <siteMapNode url="~/Admin/membership_GetUsers.aspx" title="View Users" /> 
    <siteMapNode url="~/Admin/roleManager_CreateRole.aspx" title="Create Role" /> 
    <siteMapNode url="~/Admin/roleManager_AddUserToRole.aspx" title="Add User to Role" /> 
</siteMapNode> 

這裏管理節點沒有物理頁,這純粹是允許管理項目的組織到自己的子菜單。如果沒有額外角色屬性,節點和子節點將不會出現,但角色=「管理員」指出,即使安全檢查失敗,節點也應顯示給管理員角色內的用戶。我們不需要子節點上的屬性,因爲它們有物理頁面,所以文件檢查會成功。

  • 配置的安全性限制與授權頁 web.config中:

    所以,如果你還記得的規則,這是相當簡單的。

  • 重新定義站點地圖提供程序,啓用安全 修剪。
  • 將角色屬性添加到站點地圖節點以擴大 可見性。
+0

謝謝。發現我引入的小錯誤。在我的元素中,我使用'?'代替 '*'。一旦我改變了這一切,開始正常工作。 – 2010-03-23 15:02:14

+0

偉大的博客文章,這很好地解釋了這一點。 – Sprintstar 2011-11-28 12:47:01

+0

偉大的鏈接,我永遠不會知道它這樣工作。 – 2013-08-07 10:26:15

1

你想要的是什麼ASP.NET稱之爲 「Site-Map Security Trimming」。您已經完成了大部分工作 - 即將角色分配給站點地圖中的節點。現在,你只需要做一些配置。

在你web.config,添加使用標準XmlSiteMapProvider一個新的站點地圖提供者,但securityTrimmingEnabled="true",使這個默認的提供:

<system.web> 
    <siteMap defaultProvider="XmlSiteMapProvider" enabled="true"> 
    <providers> 
     <add name="TrimmedSitemap" 
     type="System.Web.XmlSiteMapProvider" 
     siteMapFile="Web.sitemap" 
     securityTrimmingEnabled="true" /> 
    </providers> 
    </siteMap> 
</system.web> 
+1

看到我上面的筆記(我剛剛添加它們)。我已將securityTrimmingEnabled設置爲true ... – 2010-03-22 21:02:35