1

让我首先说我所拥有的东西 - 我只是不喜欢它。

我有一个用于导航栏的 web.sitemap。每个人都可以访问一些节点,其中一些节点分配了角色(这样节点就不会显示给无法访问它的用户)。

IE<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 配置中的设置——但这不起作用(因为您不能将嵌入代码放入站点地图文件中)。

4

1 回答 1

-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"]%>"/>
于 2014-07-26T16:16:56.370 回答