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功能,啟用了這個功能後,就不用像文章中那麼繁瑣的實現這個功能了。