使用Sitemap和asp:Menu控件进行表单身份验证

时间:2009-10-29 17:04:28

标签: asp.net forms-authentication sitemap roles

我有一个包含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中的设置推断出权限,你必须指定站点地图中的角色。否则,它们将默认隐藏。

2 个答案:

答案 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以确保权限不会丢失。