我有一个包含2个部分的网站 - 一个用于客户,一个用于管理员,实质上。 每个部分都在自己的目录中,并带有自己的web.config和sitemap。安全和访问工作正常。
当我以管理员身份登录时,我希望看到链接到其他部分的菜单项。我添加了指向站点地图的链接,例如:
<siteMapNode url="~/Customer/Default.aspx?3" title="Customer Site"
description="Switch to customer site" roles="Administrator"/>
这似乎没有效果,因为我作为客户登录时仍然会看到菜单项。 当我打开安全修整时,如
<siteMap enabled="true">
<providers>
<add name="InternalSiteMap" type="System.Web.XmlSiteMapProvider"
siteMapFile="~/Internal/Internal.sitemap" />
<add name="CustomerSiteMap" type="System.Web.XmlSiteMapProvider"
siteMapFile="~/Customer/Customer.sitemap" securityTrimmingEnabled="true" />
</providers>
</siteMap>
所有菜单项都消失了。
我实际上在Internal和Customer文件夹中都有web.configs,例如为客户:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<authorization>
<allow roles="Customer" />
<deny users="*" />
</authorization>
</system.web>
</configuration>
和管理员:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<authorization>
<allow roles="Administrator" />
<deny users="*" />
</authorization>
</system.web>
</configuration>
同样,授权有效,当我以客户身份登录并单击菜单中的内部站点链接时,我将被重定向到登录页面。作为管理员,我可以点击进入管理站点。一旦我打开了站点地图提供程序的安全修整程序,它应该从菜单中获取我未授权的链接,整个菜单就会消失。我错过了什么?我是否需要将asp.menu控件配置为与此一起使用?
更新:我对此问题表示赏心悦目,因为我仍然无法让它发挥作用。我们倾向于抛弃菜单控件并编写自己的菜单控件,但如果有人可以提供提示,那当然是首选。 同样 - 问题不在于安全性 - 角色和访问规则按预期工作。它具有菜单控制和安全修整功能。当为站点地图打开安全修整时,菜单会全部消失。
更新:感谢您找到此博客文章,Pavel。我从中学到的是,如果有站点地图条目没有路径和URL(对于我的一些子菜单也是如此),控件无法从web.config中的设置推断出权限,你必须指定站点地图中的角色。否则,它们将默认隐藏。
答案 0 :(得分:2)
来自Horizontal Menu Disappears with securityTrimmingEnabled="true":
确保每个角色都有权限 到(未使用的)虚拟siteMapNode at 通过包含roles =“*”的根 web.sitemap如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<siteMap enableLocalization="true"
xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
<siteMapNode url="" title="" roles="*" description="">
<siteMapNode url="~/default.aspx" resourceKey="siteMapHome"
title="Home" roles="admin,account" description="" />
<!-----More nodes-->
答案 1 :(得分:0)
http://www.vbforums.com/showthread.php?p=3625975
检查登录用户是否具有管理员角色。
编辑:
我也很确定你没有在siteMapNode中指定角色。我相信基于角色的站点地图可以处理现有角色,例如,如果用户有权访问站点注释所指定的路径,那么它将显示它。
还要在webs.config中指定路径。
<location path="admin/">
<system.web>
<authorization>
<allow roles="Admin" />
<deny users="*"/>
</authorization>
</system.web>
</location>
最后从您的站点地图中删除“〜”,以便比较匹配。
完成所有操作后如果仍然无效,请合并web.configs以确保权限不会丢失。