2011-08-27 4 views
0

나는 이것을 이해할 수 없다.역할 기반 메뉴가 작동하지 않습니다. 무엇이 잘못 되었나요?

  • 나는이 사이트 맵 파일을 가리키는 securityTrimmingEnabled="true",과 XmlSiteMapProvider를했습니다 다음 사이트 맵

    <?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> 
    
    • 있습니다. 그것은 내가 페이지를 로그인 리디렉션 http://localhost/h/uo/get를 입력하면 폴더의 web.config

      <configuration> 
          <system.web> 
          <authorization> 
           <deny users="?" /> 
          </authorization> 
          </system.web> 
      </configuration> 
      
    • 파일은, URL을 통해 액세스 할 수 없습니다 년대에

    • 내가 다듬을 파일은 authorization 규칙을 가지고있다. 페이지가 렌더링 될 때 그러나

      <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> 
      

가, I가 예상되는 Get account 노드를 참조 : 나는 마스터 페이지 파일에서이 같은 <asp:Menu>을 설정 한

  • 내가 무엇이든지간에 로그인하지 않았을 때 손질 해주세요.

    • 내가 뭘 잘못하고 있니?
    • 보안 트리밍 사용 가능 사이트 맵 탐색 메뉴를 빌드하는 다른 방법이 있습니까?

    저는 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); 
        } 
    } 
    

    그럼, 내가해야했던 유일한 변화가 루트 수준의 역할 정의에 별표 (*)를 추가했다.

    어떻게 작동합니까?

    먼저이 노드에 대해 정의 된 역할 중 하나라도 별표가 있는지 확인합니다. 그렇다면 노드를 볼 수 있습니다.

    둘째, 노드가 everyone-level이 아닌 경우 지정된 역할이 있고 로그인 한 사용자가 적어도 하나의 역할을 수행하고 있는지 확인합니다.

    마지막으로, 부모 노드가 있는지 확인하고 규칙을 상속합니다.

    이렇게하면 보안 조정이 실제로 "보안 트리밍"이 될 수 있으며 기본적으로 잘 작동한다고 가정합니다.