Web.SiteMap中的Roles问题
Web.sitemap&Role点滴
Asp.net 2.0的Sitemap和Role机制,为我们提供了一种简洁的办法处理权限与菜单显示的问题.例如,我们可以在Web.sitemap中,通过下面的配置进行菜单显示的控制:
<siteMapNode url=“” title=“First Level Menu“ description=“” roles=“RoleA“>
<siteMapNode url=“~/A/AAA.aspx” title=“Menu Item For Role A” roles=“RoleA“></siteMapNode>
<siteMapNode url=“~/B/BBB.aspx” title=“Menu Item For Role A” roles=“RoleA“></siteMapNode>
<siteMapNode url=“~/B/CCC.aspx” title=“Menu Item For Role A” roles=“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.aspx” title=“Menu Item For Role A” roles=“RoleA“></siteMapNode>
<siteMapNode url=“~/B/BBB.aspx” title=“Menu Item For Role B” roles=“RoleB“></siteMapNode>
<siteMapNode url=“~/B/CCC.aspx” title=“Menu Item For Role C” roles=“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的用户登陆,将只看到相应的菜单.