代码之家  ›  专栏  ›  技术社区  ›  Jakob Gade

使用网站地图控制页面访问

  •  1
  • Jakob Gade  · 技术社区  · 16 年前

    我正在为ASP.NET网站 <location>

    <location path="Users.aspx">
      <system.web>
        <authorization>
          <allow roles="Administrator"/>
          <deny users="*"/>
        </authorization>
      </system.web>
    </location>
    

    不过,我也有一个网站地图基本上包含相同的信息,即哪些用户角色可以查看/访问哪些页面。我的一个片段网站地图:

    <?xml version="1.0" encoding="utf-8" ?>
    <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
      <siteMapNode title="Home">
        ... lots of nodes here ...
        <siteMapNode url="users.aspx" roles="Administrator" title="users" description="Edit users" />
        ...
      </siteMapNode>
    </siteMap>
    

    有什么好的使用方法吗网站地图 只有 要配置访问权限?这个 <位置>

    3 回复  |  直到 16 年前
        1
  •  1
  •   abatishchev Karl Johan    16 年前

    SecurityTrimmingEnabled forum post blog entry

    所以 Web.config 限制从直接URL键入和 Web.sitemap

        2
  •  0
  •   JoeBilly    16 年前

    当然,您可以在web.config配置,并使用CurrentNode属性获取与请求页面相关的SiteMapNode。

    首先声明站点地图提供程序(web.config配置) :

    <siteMap enabled="true" defaultProvider="DefaultXmlSiteMapProvider">
      <providers>
        <add siteMapFile="Web.sitemap" name="DefaultXmlSiteMapProvider" securityTrimmingEnabled="true" type="System.Web.XmlSiteMapProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
      </providers>
    </siteMap>
    

    使用CurrentNode进行页面访问控制的示例代码(您可以做得更好;):

    bool hasAccess = false;
    
    if (SiteMap.CurrentNode == null)
        throw new ApplicationException("Page not present in SiteMap : " + this.Request.Url.AbsolutePath);
    
    if (SiteMap.CurrentNode.Roles.Count > 0)
    {
        // All roles or no roles
        if (SiteMap.CurrentNode.Roles.Contains("*") == true)
        {
            hasAccess = true;
        }
        else
        {
            for (int index = 0; index < SiteMap.CurrentNode.Roles.Count; index++)
            { 
                string role = SiteMap.CurrentNode.Roles[index].ToString();
                hasAccess = HttpContext.Current.User.IsInRole(role);
                if (hasAccess == true)
                   break;
            }
        }
    }
    

    注意,我添加了everyone角色(*),非常有用。

        3
  •  0
  •   abatishchev Karl Johan    16 年前

    这是我自己的密码 SiteMapProvider

    public class XmlSiteMapProvider : System.Web.XmlSiteMapProvider
    {
        public override bool IsAccessibleToUser(HttpContext context, SiteMapNode node)
        {
            var roles = node.Roles.OfType<string>();
            if (roles.Contains("*") || (roles.Count(r => context.User.IsInRole(r)) > 0))
            {
                return true;
            }
            else
            {
                throw new InsufficientRightsException();
            }
        }
    }
    

    为了实现自己的角色逻辑,我还创建了自己的 RoleProvider .