<p>原文地址:<a href="http://www.cnblogs.com/twilight/articles/1279832.html">http://www.cnblogs.com/twilight/articles/1279832.html</a></p>

Asp.net 2.0的Sitemap和Role机制,为我们提供了一种简洁的办法处理权限与菜单显示的问题.例如,我们可以在Web.sitemap中,通过下面的配置进行菜单显示的控制:

     <siteMapNode url="" title="First Level Menu" description="" roles="RoleA">

         <siteMapNode url="~/A/AAA.aspxtitle="Menu Item For Role Aroles="RoleA"></siteMapNode>

         <siteMapNode url="~/B/BBB.aspxtitle="Menu Item For Role Aroles="RoleA"></siteMapNode>

         <siteMapNode url="~/B/CCC.aspxtitle="Menu Item For Role Aroles="RoleA"></siteMapNode>

     </siteMapNode>

  在这个简单的例子里,只有登陆用户属于RoleA,才能看到"First Leve Menu"及其子菜单.很容易理解.不过,有时候需求会稍微复杂一点,比如,只有属于RoleA的用户有权限看到第一个子菜单;只有属于RoleB的用户有权限看到第二个子菜单;只有属于RoleC的用户有权限看到第三个子菜单.这个时候,我们可能会很自然的想到使用如下的配置进行控制:

     <siteMapNode url="" title="First Level Menu" description="" roles="RoleA,RoleB,RoleC">

         <siteMapNode url="~/A/AAA.aspxtitle="Menu Item For Role Aroles="RoleA"></siteMapNode>

         <siteMapNode url="~/B/BBB.aspxtitle="Menu Item For Role Broles="RoleB"></siteMapNode>

         <siteMapNode url="~/B/CCC.aspxtitle="Menu Item For Role Croles="RoleC"></siteMapNode>

     </siteMapNode>
  应该是符合要求的,不是吗?不过,当你以属于RoleA的用户登陆后,你会发现,你同样可以看到"Menu Item For Role B"和"Menu Item For Role C".相当令人疑惑.博客堂的一位同学也对这个问题不解了一下.Web.sitemap和Membership内部机制没深入研究过,这里只记录下解决方案.其实也十分简单,我们只需要在相应的目录下增加一个web.config,在其中增加location配置节,配合着authorization配置节,来解决这个问题,以上面这个需求为例子,我们只需要在目录A下增加一个web.config,具体内容如下:

     <configuration>

         <system.web>

             <authorization>

                 <allow roles="RoleA"/>

                 <deny users="*"/>

             </authorization>

         </system.web>

     </configuration>
  在目录B下增加一个web.config,具体内容如下:

     <configuration>

         <location path="BBB.aspx">

              <system.web>

                   <authorization>

                       <allow roles="RoleB"/>

                       <deny users="*"/>

                   </authorization>

              </system.web>

         </location>

         <location path="CCC.aspx">

              <system.web>

                   <authorization>

                       <allow roles="RoleC"/>

                       <deny users="*"/>

                   </authorization>

              </system.web>

         </location>

     </configuration>
  好了,分别用属于RoleA,RoleB,RoleC的用户登陆,将只看到相应的菜单.