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

本文关键字:quot rolename 配置 位置 元素 Web Roles IsUserInRole 使用 替代 | 更新日期: 2023-09-27 18:14:53

让我先说一下,我所拥有的是有效的——我只是不喜欢它。

我有一张网。用于我的导航栏的站点地图。其中一些节点可供所有人访问,其中一些节点具有分配的角色(以便节点不会显示给无法访问它的用户)。

<siteMapNode url="~/adminpage.aspx" title="admin" roles="domain'Administrators"/>

然后,在我的网上。配置,我有这样的位置元素:

<location path="adminpage.aspx">
  <system.web>
    <authorization>
      <allow roles="domain'Administrators"/>
      <deny roles="*"/>
    </authorization>
  </system.web>
</location>

除此之外,一些页面有根据角色显示或隐藏的超链接,如:

myHyperlink.Visible = Roles.IsUserInRole(@"domain'Administrators");

所有这些都很好-但是…这似乎有点可笑。是否有任何方法可以利用在我的Web中建立的权限。通过sitemap和Roles.IsUserInRole?基本上,我试图防止在435234个不同的地方有相同的权限描述。

我尝试在sitemap文件中添加嵌入代码,这将使用web配置中的设置-但这不起作用(因为你不能在sitemap文件中放入嵌入代码)

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

你的例子实际上并没有以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中,如果以后需要更改要检查的角色,则必须在更少的位置进行更改。

无论如何,网络。应该包括您提供的配置项。您不应该假设恶意用户不知道您的管理页面的名称。特别是当它被称为adminpage

编辑

为了减少角色名的重复,尝试在web的一个部分中定义它。配置并从那里引用它。你不能为位置标签这样做,但你应该可以在其他任何地方。

ConfigurationManager.AppSettings["AdminRole"]
例如

在Sitemap中,尝试

<siteMapNode url="~/adminpage.aspx" title="admin" roles="<% ConfigurationManager.AppSettings["AdminRole"]%>"/>