【问题标题】:Alternative to Roles.IsUserInRole("rolename") using Web.config location element使用 Web.config 位置元素替代 Roles.IsUserInRole("rolename")
【发布时间】:2014-09-18 07:38:58
【问题描述】:

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

我有一个用于导航栏的 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 解决方案在站点地图文件中添加嵌入代码,该代码将使用网络配置中的设置 - 但这不起作用(因为您不能将嵌入代码放入站点地图文件中)。

【问题讨论】:

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


    【解决方案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"]%>"/>
    

    【讨论】:

    • 我知道他们没有定义相同的行为。如果他们这样做了,我就不需要所有 3 个步骤:-)。我试图消除到处都有硬编码的角色。它们在 Web.config 中得到了充分定义——我想找到一种方法来重用它们。
    • 当您说它们在您的 web.config 中定义明确时,您是指您列出的位置元素吗?
    • 是的(请注意,实际上,位置元素不止一个)。我的观点是,对每个页面/目录的角色访问是在 Web.config 的 location 元素中定义的。应该有一些方法可以从站点地图和代码中利用它。就像现在一样,如果组名更改,我必须在至少 2 个地方(web.config 和 web.sitemap)更改它 - 然后在代码中使用它的任何地方。
    • 您是否尝试过将角色名称存储在 web.config 的其他位置、自定义名称值集合中并引用它?位置元素并不意味着以您正在寻找的方式引用。
    • 如果我在 appSettings 中添加了类似 msdn.microsoft.com/en-us/library/vstudio/…
    猜你喜欢
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 2023-03-31
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    相关资源
    最近更新 更多