web.config中的securityTrimmingEnabled =“true”工作得太好了

时间:2012-04-29 22:25:55

标签: asp.net

我正在使用C#ASP.NET 4 VS2010。

我正在使用角色成员资格,这些角色已经像往常一样定义。

我有一个~/web.sitemap文件,其中包含:

~/安全性是允许所有人。)

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >

  <siteMapNode url="" title=""  description="">

    <siteMapNode url="" title="A menu for the Administrator"  description="">
      <siteMapNode url="~/Admin/ResetPassword.aspx" title="Reset password for a user"  description="" />
      <siteMapNode url="~/Admin/SendEmailToUser.aspx" title="Send e-mail to a user"  description="" />
    </siteMapNode>

    <siteMapNode url="" title="A menu for the SIC (second in command) person"  description="">
      <siteMapNode url="~/SIC/UnlockUser.aspx" title="Unlock a user"  description="" />
      <siteMapNode url="~/SIC/ApproveUser.aspx" title="Approve a user"  description="" />
    </siteMapNode>

    <siteMapNode url="" title="A menu for users"  description="">
      <siteMapNode url="~/Users/MakeYourContribute.aspx" title="Make your contribution"  description="" />
      <siteMapNode url="~/Users/CheckOnYourBalance.aspx" title="Check on your balance"  description="" />
    </siteMapNode>

    <siteMapNode url="" title="A menu for anonymous visitors"  description="">
      <siteMapNode url="~/AboutUs.aspx" title="About us"  description="" />
      <siteMapNode url="~/Application.aspx" title="Send an application to join us"  description="" />
    </siteMapNode>

  </siteMapNode>

</siteMap>

和一个像这样结束的web.config文件:

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

我的菜单基于asp:Repeater控件,如下所示:

<div>
    <ul>
        <li>
            <asp:hyperlink runat="server" id="lnkHome" navigateurl="~/Default.aspx">Home</asp:hyperlink>
        </li>
        <asp:repeater runat="server" id="menu" datasourceid="SiteMapDataSource1">
                        <ItemTemplate>
                            <li>
                                <asp:HyperLink ID="lnkMenuItem" runat="server" NavigateUrl='<%# Eval("Url") %>'><%# Eval("Title") %></asp:HyperLink>

                                <asp:Repeater ID="submenu" runat="server" DataSource="<%# ((SiteMapNode) Container.DataItem).ChildNodes %>">
                                    <HeaderTemplate>
                                        <ul>
                                    </HeaderTemplate>
                                    <ItemTemplate>
                                        <li>
                                            <asp:HyperLink ID="lnkMenuItem" runat="server" NavigateUrl='<%# Eval("Url") %>'><%# Eval("Title") %></asp:HyperLink>
                                        </li>
                                    </ItemTemplate>
                                    <FooterTemplate>
    </ul>
    </FooterTemplate> </asp:Repeater> </li> </ItemTemplate> </asp:Repeater> </ul>
    <asp:sitemapdatasource id="SiteMapDataSource1" runat="server" showstartingnode="true" />
</div>

为各个文件夹定义了允许/拒绝文件夹的安全性。 有4个级别的安全性:1)管理员。 2)第二命令(SIC)。 3)用户(所有注册用户)。 4)匿名用户。

例如,管理员角色和SIC角色的成员都可以在文件夹~/SIC中操作,但其他用户都受到限制。

现在,只要我将securityTrimmingEnabled="true"添加到web.config,我在菜单上看到的唯一行就是Home

我配置错了吗?

为了让这个依赖于安全性的菜单有效,我还需要进行哪些配置吗?

1 个答案:

答案 0 :(得分:0)

问题是菜单标题中的空URL。

 <siteMapNode url="" title="A menu for the Administrator"  description="">

站点地图功能似乎正在尝试确定空网址“”的权限,并且失败。

解决方法是修改.sitemap文件以显式声明可以访问父节点的角色。

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >

  <siteMapNode url="" title=""  description="" roles="*">

    <siteMapNode url="" title="A menu for the Administrator"  description="" roles="Administrators">
      <siteMapNode url="~/Admin/ResetPassword.aspx" title="Reset password for a user"  description="" />
      <siteMapNode url="~/Admin/SendEmailToUser.aspx" title="Send e-mail to a user"  description="" />
    </siteMapNode>

    <siteMapNode url="" title="A menu for the SIC (second in command) person"  description="" roles="administrators,second in command">
      <siteMapNode url="~/SIC/UnlockUser.aspx" title="Unlock a user"  description="" />
      <siteMapNode url="~/SIC/ApproveUser.aspx" title="Approve a user"  description="" />
    </siteMapNode>

    <siteMapNode url="" title="A menu for users"  description="" roles="administrators,secondincommand,users">
      <siteMapNode url="~/Users/MakeYourContribute.aspx" title="Make your contribution"  description="" />
      <siteMapNode url="~/Users/CheckOnYourBalance.aspx" title="Check on your balance"  description="" />
    </siteMapNode>

    <siteMapNode url="" title="A menu for anonymous visitors"  description="" roles="*">
      <siteMapNode url="~/AboutUs.aspx" title="About us"  description="" />
      <siteMapNode url="~/Application.aspx" title="Send an application to join us"  description="" />
    </siteMapNode>

  </siteMapNode>

</siteMap>

不可否认,这并不理想,因为现在您在两个地方部分配置安全性。

另一种选择是在每个菜单标题上放置roles="*"。它仍将对每个叶节点应用权限检查,并在必要时隐藏它们。这样做的缺点是它可以显示空的菜单标题。

以下资源指出了我的解决方案:http://www.4guysfromrolla.com/articles/122805-1.aspx