让我先说一下,我所拥有的是有效的——我只是不喜欢它。
我有一张网。用于我的导航栏的站点地图。其中一些节点可供所有人访问,其中一些节点具有分配的角色(以便节点不会显示给无法访问它的用户)。
。<siteMapNode url="~/adminpage.aspx" title="admin" roles="domainAdministrators"/>
然后,在我的网上。配置,我有这样的位置元素:
<location path="adminpage.aspx">
<system.web>
<authorization>
<allow roles="domainAdministrators"/>
<deny roles="*"/>
</authorization>
</system.web>
</location>
除此之外,一些页面有根据角色显示或隐藏的超链接,如:
myHyperlink.Visible = Roles.IsUserInRole(@"domainAdministrators");
所有这些都很好-但是…这似乎有点可笑。是否有任何方法可以利用在我的Web中建立的权限。通过sitemap和Roles.IsUserInRole?基本上,我试图防止在435234个不同的地方有相同的权限描述。
我尝试在sitemap文件中添加嵌入代码,这将使用web配置中的设置-但这不起作用(因为你不能在sitemap文件中放入嵌入代码)
你的例子实际上并没有以3种不同的方式定义相同的行为。第一个和第三个是相似的,尽管方法不同。它们阻止用户看到链接。但是,如果用户知道直接到目标的URL,他们可以绕过链接并到达那里。
这就是你发布的第二个例子的由来。它会阻止加载页面,除非你的角色是正确的。
如果您不关心将链接显示到任何地方,那么第二个示例就是您所需要的。用户将能够在站点地图上看到元素,并在任何页面上看到链接,但点击它们不会将它们带到管理页面。对于你的项目来说,这是否可以接受取决于你。
如果你想隐藏链接并限制你可以这样做的代码量,我建议这样做:
<% if Roles.IsUserInRole(@"domainAdministrators") { %>
<a href="~/adminpage.aspx">Admin Page</a>
... any other links you want to limit to the admin role ...
<% } %>
这样至少可以将代码保持在最低限度。除非经过身份验证的用户处于该角色中,否则这些链接甚至不会被添加到DOM中,如果以后需要更改要检查的角色,则必须在更少的位置进行更改。
无论如何,网络。应该包括您提供的配置项。您不应该假设恶意用户不知道您的管理页面的名称。特别是当它被称为adminpage
编辑
为了减少角色名的重复,尝试在web的一个部分中定义它。配置并从那里引用它。你不能为位置标签这样做,但你应该可以在其他任何地方。
ConfigurationManager.AppSettings["AdminRole"]
例如。
在Sitemap中,尝试
<siteMapNode url="~/adminpage.aspx" title="admin" roles="<% ConfigurationManager.AppSettings["AdminRole"]%>"/>