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>
    
    • 我有一个XmlSiteMapProviderwith securityTrimmingEnabled="true",它指向这个站点地图文件。

    • 我要修剪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。

4

1 回答 1

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

然后,我必须做的唯一更改是在根级别的角色定义中添加一个星号。

这是如何运作的?

首先,我检查为该节点定义的任何角色是否是星号,如果是这样,那么我可以看到该节点。

其次,如果节点不是所有人级别的,我会检查是否指定了任何角色,以及登录用户是否是其中至少一个的一部分。

最后,我检查是否有父节点,然后继承他们的规则。

这允许安全修剪实际上是“安全修剪”并且不是很好,但是它应该默认工作。

于 2011-08-27T17:36:11.270 回答