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