1

我正在使用 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) 匿名用户。

例如,Administrators 角色和 SIC 角色的成员都可以在文件夹中进行操作~/SIC,但其余用户则被限制。

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

我配置错了吗?

为了让这个依赖于安全的菜单正常工作,我还需要进行更多配置吗?

4

1 回答 1

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

于 2012-10-09T05:38:30.550 回答