技术总奸

ASP.NET 2.0: Site Maps

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功能,启用了这个功能后,就不用像文章中那么繁琐的实现这个功能了。

posted on 2010-01-01 00:00  阿福  阅读(119)  评论(0编辑  收藏  举报