使用Web.config位置元素替代Roles.IsUserInRole(" rolename")

时间:2014-07-26 15:59:24

标签: c# asp.net web-config web.sitemap role-manager

首先让我说我的作品 - 我只是不喜欢它。

我有一个用于导航栏的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>

1 个答案:

答案 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"]%>"/>