首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用web.sitemap控制页面访问

使用web.sitemap控制页面访问
EN

Stack Overflow用户
提问于 2010-04-01 08:41:28
回答 3查看 8.1K关注 0票数 1

我为ASP.NET网站中的页面设置了web.config中的<location>标记的权限,类似于以下内容:

代码语言:javascript
复制
<location path="Users.aspx">
  <system.web>
    <authorization>
      <allow roles="Administrator"/>
      <deny users="*"/>
    </authorization>
  </system.web>
</location>

但是,我还有一个web.sitemap,它基本上包含相同的信息,即哪些用户角色可以看到/访问哪些页面。我的web.sitemap上的一个片段:

代码语言:javascript
复制
<?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>

是否有一种只使用web.sitemap来配置访问权限的巧妙方法?<location>标记非常冗长,我不喜欢重复这些信息。

EN

回答 3

Stack Overflow用户

发布于 2010-04-01 08:59:22

也许你在找SecurityTrimmingEnabled。有关更多细节,请参见此论坛帖子博客条目

因此,Web.config限制来自直接URL类型和Web.sitemap -从正在显示的URL的访问。

票数 1
EN

Stack Overflow用户

发布于 2010-04-01 09:26:13

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

首先声明您的siteMap提供者(web.config):

代码语言:javascript
复制
<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进行页面访问控制的示例代码(您可以做得更好;):

代码语言:javascript
复制
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角色(*),非常有用。

票数 0
EN

Stack Overflow用户

发布于 2010-06-30 07:15:00

下面是我自己的SiteMapProvider代码,它抛出一个异常,当用户被请求时,页面(节点)无权这样做(他的角色不在节点的角色列表中)

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2559115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档