我有一个(简单的)站点地图,我试图找出某个子菜单总是可见的原因。
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
<siteMapNode url="~/Login.aspx" title="Home" description="RivWorks" roles="*">
<siteMapNode url="" title="Dashboard" description="" roles="campaigns, auto_negotiation">
<siteMapNode url="CampaignBuilder.aspx" title="Campaign Manager" description="Manage your campaign settings" roles="campaigns" />
<siteMapNode url="ProductManager.aspx" title="Negotiation Manager" description="Manage your product and negotiation settings" roles="auto_negotiation" />
</siteMapNode>
<siteMapNode url="" title="Support Options" description="" roles="customers, customer_super, riv_admins, riv_super">
<siteMapNode url="ChangePassword.aspx" title="Change Password" description="" roles="customers, customer_super, riv_admins, riv_super" />
<siteMapNode url="http://rivworks.zendesk.com/requests/anonymous/new" title="Submit a Support Ticket" description="" roles="customers, customer_super, riv_admins, riv_super" />
<siteMapNode url="http://rivworks.zendesk.com/forums/49919/entries" title="Tips & Tricks" description="" roles="customers, customer_super, riv_admins, riv_super" />
</siteMapNode>
</siteMapNode>
</siteMap>
<小时/> 注意:WEB.CONFIG SETTINGS
<siteMap defaultProvider="XmlSiteMapProvider" enabled="true">
<providers>
<add name="XmlSiteMapProvider"
description="Default Site Map Provider"
type="System.Web.XmlSiteMapProvider"
siteMapFile="Web.sitemap"
securityTrimmingEnabled="true" />
</providers>
</siteMap>
<小时/> 我有一个主板菜单选项“仪表板”。在此菜单项下,我有2个选项:1)Campaign Manager&amp; 2)谈判经理。现在,有趣的是,当我处于广告系列角色 OR 自动协商角色时,我会看到信息中心和 BOTH 子菜单项。这不是我预期的行为。当我处于广告系列角色 AND 自动协商角色时,我希望只能看到这两个子菜单。 OR 方案应该为我提供仪表板菜单项和一个 OR 另一个子项...
我在这里做错了什么或想错了方法?
TIA
答案 0 :(得分:29)
答案 1 :(得分:1)
你想要的是ASP.NET所谓的“Site-Map Security Trimming”。您已完成大部分工作 - 即将角色分配给站点地图中的节点。现在,你剩下要做的就是一些配置。
在web.config
中,使用标准XmlSiteMapProvider
添加新的站点地图提供程序,但使用securityTrimmingEnabled="true"
,并将其设为默认提供程序:
<system.web>
<siteMap defaultProvider="XmlSiteMapProvider" enabled="true">
<providers>
<add name="TrimmedSitemap"
type="System.Web.XmlSiteMapProvider"
siteMapFile="Web.sitemap"
securityTrimmingEnabled="true" />
</providers>
</siteMap>
</system.web>
答案 2 :(得分:1)
我知道这是非常古老的,但是我继承了一些旧代码并遇到了相同的问题。我的老板希望我暂时隐藏单个角色的功能可见性,但仍然可以在站点的其他位置访问它。我完全希望只从站点地图中删除该角色,并且此角色不可见。埃里克(Eric)清楚地解释了如何增加可见度而不是限制。
我只是想举例说明如何使其发挥您(和我)期望的作用(角色必须在两个地方都存在)。
<asp:Menu ID="Menu1" runat="server" DataSourceID="SiteMapDataSource1" OnMenuItemDataBound="Menu1_TreeNodeDataBound" />
protected void Menu1_TreeNodeDataBound(object sender, MenuEventArgs e)
{
if (e.Item.DataItem!=null && ((SiteMapNode)e.Item.DataItem).Roles.Count > 0 && HttpContext.Current.User.Identity.IsAuthenticated)
{
string role = Common.GetUserRole(); // I have a single role provider and a common function to get the role. You could always loop through Roles and use HttpContext.Current.User.IsInRole()
if (role.Length > 0)
{
if (!((SiteMapNode)e.Item.DataItem).Roles.Contains(role))
{
if (e.Item.Parent != null)
e.Item.Parent.ChildItems.Remove(e.Item);
else
Menu1.Items.Remove(e.Item);
}
}
}
}