我有一个(简单的)站点地图,我试图找出为什么某个子菜单始终可见.
<?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>
Run Code Online (Sandbox Code Playgroud)
<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)
我在这里做错了什么或者想错了路?
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上的这个),则可能必须执行它自己的安全检查,但这取决于您从哪个基类继承.这是另一篇文章的另一个故事.
因此,如果您不需要自己修改站点地图元素,那么角色属性是什么?通过打开节点的可见性,显示节点是否用户处于声明的角色,即使他们没有访问页面本身的权限(因为授权规则限制它们),这可能与您可能期望的方式相反.从访问它).你为什么要这样做?那么,您必须了解安全修整的工作原理.在确定用户是否可以看到节点时,检查授权和物理文件权限; 如果任何一个失败,那么该节点被认为是不可访问的.物理文件检查失败有两种非常常见的情况:
在这两种情况下,物理文件检查都会失败,因此不会显示节点.因此,您可能需要打开节点的可见性.例如,请考虑以下事项:
<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角色中的用户显示该节点.我们不需要子节点上的属性,因为它们具有物理页面,因此文件检查将成功.
所以如果你还记得这些规则,那就相当简单了:
归档时间: |
|
查看次数: |
21822 次 |
最近记录: |