【问题标题】:ASP.NET authentication to allow/prevent page access and show/hide link at the same timeASP.NET 身份验证以同时允许/阻止页面访问和显示/隐藏链接
【发布时间】:2012-01-21 16:45:23
【问题描述】:

我正在寻找一种方法来轻松地围绕某个位置设置安全性,同时使用它来显示/隐藏我的菜单上的链接。

我知道如何为未经授权的用户屏蔽该位置,例如:

<location path="AdminDirectory">
    <system.web>
        <authorization>
            <allow roles="SomeRole"/>
            <deny users="*"/>
        </authorization>
    </system.web>
</location>

我可以使用代码显示/隐藏链接,例如:

myLink.Visible = User.IsInRole("SomeRole");

但我正在寻找一种方法来做到这一点,以便“SomeRole”角色名称只需配置一次。如果我可以从 location 元素中读取并在代码中对其进行测试,那将是理想的,但我没有看到这样做的方法。

// Something like:
myLink.Visible = TestLocationAccess("AdminDirectory");

我可以想到一种非常糟糕的方法,即通过 javascript/AJAX 调用从客户端“测试”目录并使用 javascript 显示/隐藏链接,但显然这并不理想。

谢谢

【问题讨论】:

    标签: c# asp.net security authorization


    【解决方案1】:

    您可以使用CheckUrlAccessForPrincipal 方法:

    myLink.Visible = UrlAuthorizationModule
        .CheckUrlAccessForPrincipal("~/AdminDirectory", User, "GET");
    

    由于该方法是静态的,您显然需要将当前IPrincipal 的实例作为第二个参数传递。

    【讨论】:

    • 这正是我想要的。谢谢。
    【解决方案2】:

    考虑使用ASP.Net sitemap,它内置了基于角色显示或隐藏链接的功能

    即在站点地图的源 xml 中,可以定义链接适用的角色,即

    <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
        <siteMapNode url="default.aspx" title="Home">
            <siteMapNode url="admin.aspx" title="Admin" roles="Admin" />
            <siteMapNode url="user.aspx" title="User Page" roles="User" />
        </siteMapNode>
    </siteMap>
    

    您可以使用角色来限制 web.config 中的访问,并使用相同的角色来限制站点地图中的导航。

    我猜你仍然在两个地方控制授权。这是我会做的(过去做过)。不知道这是否能让你到达你需要去的地方。

    不管怎样,Scott Guthrie 解释得比我还好

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-20
      相关资源
      最近更新 更多