2011-08-27 64 views
0

我無法弄清楚這一點。基於角色的菜單不起作用,我做錯了什麼?

  • 我有以下的網站地圖

    <?xml version="1.0" encoding="utf-8" ?> 
    
    <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > 
        <siteMapNode url="~/" title="Root" description="Go root"> 
         <siteMapNode url="~/h" title="Home" description="Go home" /> 
    
         <siteMapNode url="~/h/uo" title="Ultima Online" description="Ultima Online">   
         <siteMapNode url="~/h/uo/get" roles="RegisteredUser" title="Get account!" description="Get account!" /> 
         </siteMapNode> 
        </siteMapNode> 
    </siteMap> 
    
    • 我已經與securityTrimmingEnabled="true",它指向這個網站地圖文件的XmlSiteMapProvider

    • 文件我要修剪有authorization規則,在它的文件夾的web.config

      <configuration> 
          <system.web> 
          <authorization> 
           <deny users="?" /> 
          </authorization> 
          </system.web> 
      </configuration> 
      
    • 文件無法通過URL來訪問,如果我型我http://localhost/h/uo/get重定向到登錄頁面。

    • 我已經成立了一個<asp:Menu>這樣在母版頁文件:

      <asp:SiteMapDataSource ID="MenuSiteMap" ShowStartingNode="false" 
               SiteMapProvider="MenuSiteMapProvider" runat="server" 
      /> 
      
      <div> 
          <asp:Menu ID="NavigationMenu" runat="server" DataSourceID="MenuSiteMap" 
             CssClass="menu" EnableViewState="false" 
             IncludeStyleBlock="false" Orientation="Horizontal" 
          /> 
      </div> 
      

然而,當頁面呈現,我看是應該的Get account節點當我甚至沒有登錄時,無論如何都要修剪。

  • 我在做什麼錯?
  • 有沒有其他的方法來建立一個安全修整功能的網站地圖導航菜單?

我正在使用ASP.NET 4.0,並使用HttpModule進行URL重寫。

回答

1

在閱讀http://forums.asp.net/t/975077.aspx/1我發現這正是我正在發生的事情。

如果節點沒有URL,它表現得很好,但是如果它的確如我所有的節點一樣。安全調整被忽略。

我訴諸一個更直觀的,基於角色的站點地圖的實施解決了我的問題,說:

public class TrimmingXmlSiteMapProvider : XmlSiteMapProvider 
{ 
    public override bool IsAccessibleToUser(HttpContext context, SiteMapNode node) 
    { 
     if (node.Roles.Cast<string>().Any(r => r == "*")) 
      return true; 

     if (node.Roles.Count > 0 && node.Roles.Cast<string>().Count(Roles.IsUserInRole) == 0) 
      return false; 

     return node.ParentNode != null && node.ParentNode.IsAccessibleToUser(context); 
    } 
} 

然後,我不得不做出的唯一改變是增加一個星號,以根級別的角色定義。

這是如何工作的?

首先我檢查是否有任何爲這個節點定義的角色是星號,如果是這樣的話,那麼我可以看到該節點。第二,如果節點不是每個人級別的,我檢查是否指定了任何角色,以及登錄的用戶是否是其中至少一個角色的一部分。

最後,我檢查是否有父節點,並且只是繼承它們的規則。

這允許安全修整實際上是「SECURITY TRIMMING」,但不是很好,但是它默認情況下它應該工作。

相關問題