ASP.NET web.sitemap - 角色似乎无法控制可见性?

Kei*_*ows 13 sitemap asp.net

我有一个(简单的)站点地图,我试图找出为什么某个子菜单始终可见.

<?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 &amp; Tricks" description="" roles="customers, customer_super, riv_admins, riv_super" />
    </siteMapNode>
  </siteMapNode>
</siteMap>
Run Code Online (Sandbox Code Playgroud)


注意: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>
Run Code Online (Sandbox Code Playgroud)


我有一个主板菜单选项"仪表板".在此菜单项下,我有2个选项:1)Campaign Manager&2)Negotiation Manager.现在,有趣的是,当我处于广告系列角色自动协商角色时,我会看到仪表板和BOTH子菜单项.这不是我预期的行为.我希望在参与广告系列角色自动协商角色时,只能看到这两个子菜单.该OR场景应该给我的仪表盘菜单项和一个其它子项...

我在这里做错了什么或者想错了路?

TIA

小智 29

我怀疑你已陷入我们都做的陷阱,因为他们认为roles属性限制了节点的可见性.事实并非如此,它实际上扩大了知名度.所有限制都是使用web.config中的标准部分完成的.

以下全文来自原始帖子:https://web.archive.org/web/20130408064047/http://ipona.com/asp-net-site-maps-security-trimming-and-roles/)

这是最常见的问题之一,似乎是每个人不断混淆的原因,就像我第一次阅读它时一样.ASP.NET SiteMap允许将导航结构定义为一组XML元素,这些元素非常适合描述菜单项的层次结构.这些XML项是siteMapNode元素,它具有属性角色.很明显,这定义了可以看到这个项目的角色,但显而易见的是错误的.以下是有关站点地图的最重要事实:

roles属性不限制节点的可见性.

这应该足够清楚,即使它似乎仍然是错误的.这是它的工作原理.对页面的所有限制都是通过授权处理的.您可以在基本web.config或文件夹中的web.config文件中执行此操作.例如,假设有一个Admin文件夹,在该文件夹下保留所有管理页面.您只希望Admin角色中的用户可以访问这些页面.你可以这样配置你的授权:

<location path="Admin">
  <system.web>
    <authorization>
      <allow roles="Admin" />
      <deny users="*" />
    </authorization>
  </system.web>
</location>
Run Code Online (Sandbox Code Playgroud)

现在,不属于Admin角色的任何人都无法访问Admin文件夹; 如果您不是Admin角色并尝试导航到Admin文件夹中的页面,可以通过其他页面上的链接或直接在浏览器中键入URL,您将被重定向到登录页面.您可以在web.config中拥有多个位置元素,用于不同的文件夹甚至单个文件; 事实上,如果您有一个限制性网站,您可能希望明确打开某些页面,例如登录页面; 当您无权访问登录页面时,很难登录到站点.如果您不想使基本web.config混乱,可以使用相同的规则在Admin文件夹中创建web.config文件; 您将不需要location元素,因为配置适用于当前文件夹.

这样就完成了授权; 对页面的访问被锁定.现在让我们考虑导航.ASP.NET导航框架遵循授权,但仅限于在提供程序上配置安全修整(默认情况下未配置).这意味着您需要将站点地图配置添加到web.config:

<siteMap enabled="true" defaultProvider="AspXmlSiteMapProvider">
  <providers>
    <clear />
    <add name="AspXmlSiteMapProvider" securityTrimmingEnabled="true"
     type="System.Web.XmlSiteMapProvider, System.Web, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
     siteMapFile="web.sitemap"/>
  </providers>
</siteMap>
Run Code Online (Sandbox Code Playgroud)

大多数情况是在安装ASP.NET时在计算机级别配置的,但至关重要的是securityTrimmingEnabled值默认设置为false.以上操作清除现有配置并添加属性设置为true的新条目.在此阶段,导航框架现在将遵守授权规则,因此如果用户没有该项目的授权,则不会显示菜单项; 如果使用Menu或TreeView显示菜单项无关紧要,关键部分是使用SiteMapDataSource(如果您手动构建菜单,则使用Sitemap API).如果您有一个自定义站点地图提供程序,例如数据库驱动的提供程序(例如MSDN上的这个),则可能必须执行它自己的安全检查,但这取决于您从哪个基类继承.这是另一篇文章的另一个故事.

因此,如果您不需要自己修改站点地图元素,那么角色属性是什么?通过打开节点的可见性,显示节点是否用户处于声明的角色,即使他们没有访问页面本身的权限(因为授权规则限制它们),这可能与您可能期望的方式相反.从访问它).你为什么要这样做?那么,您必须了解安全修整的工作原理.在确定用户是否可以看到节点时,检查授权和物理文件权限; 如果任何一个失败,那么该节点被认为是不可访问的.物理文件检查失败有两种非常常见的情况:

  1. 该URL不是本地的.如果文件本地不存在,则不能进行检查.
  2. 没有网址.该节点可以只是一个容器节点,具有子页面但没有页面本身.

在这两种情况下,物理文件检查都会失败,因此不会显示节点.因此,您可能需要打开节点的可见性.例如,请考虑以下事项:

<siteMapNode title="Admin" roles="Admin">
    <siteMapNode url="~/Admin/membership_CreateMember.aspx" title="Create User" />
    <siteMapNode url="~/Admin/membership_GetUsers.aspx" title="View Users" />
    <siteMapNode url="~/Admin/roleManager_CreateRole.aspx" title="Create Role" />
    <siteMapNode url="~/Admin/roleManager_AddUserToRole.aspx" title="Add User to Role" />
</siteMapNode>
Run Code Online (Sandbox Code Playgroud)

这里Admin节点没有物理页面,它纯粹是为了允许将管理项目组织到它们自己的子菜单中.如果没有其他角色属性,节点和子节点将不会出现,但roles ="Admin"表示即使安全检查失败,也应该向Admin角色中的用户显示该节点.我们不需要子节点上的属性,因为它们具有物理页面,因此文件检查将成功.

所以如果你还记得这些规则,那就相当简单了:

  • 在web.config中具有授权的页面上配置安全性限制.
  • 重新定义站点地图提供程序,启用安全修整.
  • 将roles属性添加到站点地图节点以扩大可见性.

  • 链接似乎已经死了.[Wayback机器(https://web.archive.org/web/20130408064047/http://ipona.com/asp-net-site-maps-security-trimming-and-roles/)FTW! (4认同)