Asp.net主页链接了一篇文章 Creating Menu Based on Role,主要讲述了根据不同角色和授权,显示不同的menu。感觉其解决方法并不是很好,其实ASP.NET 2.0 的SiteMaps特性内置就有Site-Map Security Trimming功能,就是根据角色和授权,menu显示不同项,完全是基于配置的,不用编码,并不用像前篇文章实现的那样繁琐。
复述一下文章中的场景,假设网站中有2个角色:Administrators, Users。
Administrators可访问路径为
Admins-/AddUser.aspx
/DeleteUser.aspx
/ModifyUser.aspx
Users的可访问路径为
Users-/ShowDetail.aspx
/ShowList.aspx
/......
需要根据用户登录后角色的判断显示不同的menu。
实现方式:一,可以使用SiteMap的Multiple Site Maps功能(像文章中那样);二,也完全可以不用。
方式一:
web.sitemap文件如下配置
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
<siteMapNode url="Default.aspx" title="Home" description="Home">
<siteMapNode siteMapFile="~/Navigation/Admin.sitemap" />
<siteMapNode siteMapFile="~/Navigation/User.sitemap" />
</siteMapNode>
Navigation目录下Admin.sitemap, User.sitemap分别为:
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
<siteMapNode url="" title="AdminFunctions" roles="administrators">
<siteMapNode url="~/Admin/AddUser.aspx" title="Add User" />
<siteMapNode url="~/Admin/DeleteUser.aspx" title="Delete User" />
<siteMapNode url="~/Admin/UpdateUser.aspx" title ="Update User"/>
</siteMapNode>
</siteMap>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
<siteMapNode url="" title="UserFunctions" roles="users">
<siteMapNode url="Showmydetails.aspx" title="Show my details" />
<siteMapNode url="Editmydetails.aspx" title="Edit my details" />
</siteMapNode>
</siteMap>
注意红色的两行只是为了起分组的作用,并不对应实际的地址,所以url为空。
web.config中启用securith trimming:
<siteMap defaultProvider="XmlSiteMapProvider" enabled="true">
<providers>
<add siteMapFile="web.sitemap" name="XmlSiteMapProvider" type="System.Web.XmlSiteMapProvider" securityTrimmingEnabled="true" />
</providers>
</siteMap>
其实以上配置做完后只要正确使用了navigation控件(treeview,menu等),就已经起到了根据不同角色、授权,显示不同menu的作用了。但是要实现真正的授权控制还学要在web.config中配置,如:
<location path="Admin">
<system.web>
<authorization>
<allow roles="administrators" />
<deny users="*" />
</authorization>
</system.web>
</location>。
方式二:
不使用Multiple Site Maps功能,简单说就是只是用一个web.sitemap文件就可以了,
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
<siteMapNode url="Default.aspx" title="Home" description="Home">
<siteMapNode url="" title="AdminFunctions" roles="administrators">
<siteMapNode url="~/Admin/AddUser.aspx" title="Add User" />
<siteMapNode url="~/Admin/DeleteUser.aspx" title="Delete User" />
<siteMapNode url="~/Admin/UpdateUser.aspx" title ="Update User"/>
</siteMapNode>
<siteMapNode url="" title="UserFunctions" roles="users">
<siteMapNode url="Showmydetails.aspx" title="Show my details" />
<siteMapNode url="Editmydetails.aspx" title="Edit my details" />
</siteMapNode>
</siteMapNode>
</siteMap>
其他和前一种方式一样。
总结:其实说了半天,要点就是应用Security Trimming功能,启用了这个功能后,就不用像文章中那么繁琐的实现这个功能了。