令人不解的 roles 属性

在 ASP.NET 2.0 的 Web.sitemap 文件中,siteMapNode 有个属性 roles ,乍一看,就象是设置此结点允许哪些角色可以访问/显示,如:

<siteMapNode url=”~/Admin/Default.aspx” title=”系统管理” description=”” roles=”Manager”> 好象就表示属于 Manager 角色的用户可以访问/显示。但我在使用的时候却发现,无论当前用户是否登录,是否属于 Manager 角色,这个菜单项都能正常显示,且能正常进入,那这个 roles 属性的意义到底在哪里呢?

 

后来查了一下才发现,要想达到我说的效果(即根据用户的角色自动显示/隐藏菜单项),必须进行如下两个步骤:

1) Web.Config 的 SiteMap 中启用安全修整,完成后如下所示:

<siteMap defaultProvider=”default”>
  <providers>
    <clear/>
    <add name=”default” type=”System.Web.XmlSiteMapProvider” siteMapFile=”web.sitemap” securityTrimmingEnabled=”true” />
  </providers>
</siteMap>

2)利用 Web.config 来实现文件或URL授权,即对 Admin 目录下的设置访问规则(可以利用 VS 2005 中的 ASP.NET 配置来实现),完成后如下所示:

<system.web>
  <authorization>
    <allow roles=”Manager” />
    <deny users=”*” />
  </authorization>
</system.web>

现在菜单终于可以自动根据用户的角色是否属于 Manager 来显示/隐藏了,但问题是,这好象完全是 Web.config 来设置的,和 siteMapNode 中的 roles 一点关系也没有,那这么 roles 的意义在哪里呢?

从 MSDN 中找出这么一段话:“当用户属于 roles 属性中列出的某一角色时,使用该属性后,ASP.NET 可避开与 siteMapNode 关联的 URL 授权限制。”,可是如果我想避开限制的话,我就根本不用在 Web.config 中设置。既然在 Web.config 中设置了限制,却又在这里用 roles 绕开限制,是不是吃饱没事干了?

现在唯一能为这个 roles 找到一个很小的用处就是,如果结点上不指定 url 属性,可以利用此属性(roles=”*”)来强制显示此结点,以便能够显示下一级结点,如:

<siteMapNode url=”” title=”系统管理” description=”” roles=”*”>
    <siteMapNode url=”~/Admin/Member_List.aspx” title=”用户管理” description=””/>
    <siteMapNode url=”~/Admin/Role_List.aspx” title=”角色配置” description=”” />
</siteMapNode>

由于 url 没有值,所以只要 Admin 目录下利用 web.config 设置了授权规则,安全调整在检查时会隐藏“系统管理”这个结点,但设置了 roles=”*” 后,可以强制显示此结点,这样下面的两个子结点(菜单项)也能正常根据角色来显示。但是,这个理由也不充分,因为将 url 设置成 “~/Admin” ,也能达到上述效果。

那么,siteMapNode 结点中的这个 roles 属性的作用到底在哪里呢?

“令人不解的 roles 属性”的14个回复

  1. 设定roll 的作用是为了程序的效率,这样显示菜单的时候就不会检查 web.config 里的页面权限了。

  2. 可以尝试着把"~"通配符去掉试试, 因为我试过web.config文件里面的location节点的path是只支持相对路径的…

  3. when you save the "FormsAuthenticationTicket" as a cookies at client browser during login processing, you may set a "cookie.Expires" time, this setting makes your login roles will be cached. If you relogin before cookies expired, your new changes may not take any actions.
    This will give you a fake "roles" when you test a web application.

  4. 应该说,关于URL资源,是web.config与web.sitemap配合工作的!

    web.sitemap是对文件夹的权限管理
    web.config是对文件夹中的URL资源进行管理

  5. Pingback: allenle
  6. 請問是否有辦法所有角色可以看到所有的SiteMap項目,只是該角色沒有權限時,無法選單為Disable,無法點選。

  7. "一个Menu,不同的Role能访问到不同的Menu Node" allenle, 你这个怎么做的啊 我最近在做权限,做不出来,能不能说说你具体怎么做的 🙂

  8. "一个Menu,不同的Role能访问到不同的Menu Node" allenle, 你这个怎么做的啊 我最近在做权限,做不出来,能不能说说你具体怎么做的 🙂

    在sitemapnode的roles中设置你想要access这个节点的角色名,比如:
    <siteMapNode url="~/Admin/Default.aspx" title="系统管理" description="" roles="Manager">
    只有manager才能看到这个节点

    sitemaproles用于visibility
    web。config的location用于access

  9. 这个道理很简单,我来解释一下,主要是用于项目中的受限用户对某个页面链接没有权限还是需要让该用户看到的情况,比如,当会员登陆后,他的个人界面有一个菜单,菜单中有所有可以看到的功能,但是有些功能他必须付费后才能使用,那么就必须设置roles属性了。就象这样子可以让user组的成员可以看到系统管理的链接
    <siteMapNode url="~/Admin/Default.aspx" title="系统管理" description="" roles="Manager,user">

  10. Pingback: 吴頔
  11. 我目前尚未弄清楚,似乎通过自定义的页面权限检查,才可以使用到roles里面的设定。

    –in web.config–
    <httpModules>
    <add name="SecurityHttpModule" type="MySecurityHttpModule" />
    </httpModules>

    –in my code–
    public class SecurityHttpModule : IHttpModule {
    //…
    private void AuthenticateRequest(Object sender, EventArgs e) {
    //这里可以自行读取SiteMap.CurrentNode.Roles中的值进行权限控制。
    }
    }

    通过 override IsAccessibleToUser(HttpContext context, SiteMapNode node)方法来自定义role的判断时,是不是这个方法就
    .

  12. 实现用户的“所见即所得”。
    web.sitemap控制是否显示该菜单;
    web.config控制用户是否有访问该页面的权限;
    因此在用的时候,在两者之间需要进行对应。

评论已关闭。