作者
朱先忠
一 简介在本文中我们将主要探讨ASPNET 的会员角色和配置问题ASPNET中的会员系统提供了一个可编程API用于创建和管理用户账户而其中的角色部分使开发者能够定义一组角色并把用户与角色相关联典型地一个提供用户账户的网站都具有只为某些用户认证用户或属于特定角色的用户所存取的内容部分
例如一个Web站点可能有一组页面它允许一个信任用户编辑该Web站点的内容或管理已有用户不是简单地试图隐藏这个页面并且希望没有人偶然在浏览它时遇到麻烦或硬编码授权而仅允许单个用户一种更为强壮和安全的方式是定义一个管理员角色然后赋给他一组选出来的信任用户然后这些管理web页面被进一步配置以允许仅对那些具有管理员角色的用户可以存取同样该Web站点可能包含一组只有认证用户可以存取的页面
既然该站点的某些部分可能只能为某些用户所存取那么这就使得我们在站点导航时有点进退两难我们是否要包括那些只有授权用户才能在Web站点的站点地图中存取的页面?如果我们这样做了那么所有的用户将会在该站点的菜单或树视图中看到受限制的页面为什么不能向存取它们的用户显示指向这些页面的链接呢?如果我们从站点地图上删除了这些受限制的页面那么那些来观看这些页面的授权用户就无法容易地导航到它们因为它们不是站点地图的一部分并因此不会出现在该站点的树视图或菜单中!
值得庆幸的是ASPNET 的站点导航提供了一种称为安全性修剪的特性当用支持安全性修剪的功能获得站点地图信息时只有那些当前登录的用户具有访问授权的站点地图结点才是可用的这意味着站点的TreeView或Menu将仅包含为当前登录用户可存取的那些部分要想了解怎样配置站点导航以支持安全性修剪请接着往下读!
二 配置ASPNET 的会员和(可选)角色
既然站点导航安全性修剪把站点地图数据基于访问页面的用户和为站点地图中的页面定义的授权设置那么在我们可以分析安全性修剪之前你必须首先配置你的Web站点以使用ASPNET 的会员服务功能(你也可以配置该站点来使用角色并使用基于角色的授权优点但是这对于展示安全性修剪概念并不作要求)至于详细讨论怎样配置一站点以使用会员和角色已经超出了本文的范围
在本文最后的下载中包括一个可用实例它实现为一个Web站点安全地修剪站点地图该站点实现了会员和角色如果你不想在一个新的Web站点上花费时间来安装会员和角色特性的话你可以使用它具体地说在本文后面可下载的Web站点中包含两个角色管理员(Administrator)和测试员(Tester)并有四个用户
·Superman其角色为管理员和测试者
·Admin其角色为管理员
·MrTester其角色为测试者
·Average User没有任何角色
而且我在该工程中有三个文件夹AdminTester和AuthUsersOnly前两个文件夹已经被配置仅允许具有管理员和测试者角色的用户存取AuthUsersOnly文件夹被限制仅用于认证的用户
三 配置站点导航以使用安全性修剪默认地站点导航并不使用安全性修剪不管什么用户正在访问站点并且不管定义什么样的授权规则当每个用户通过一TreeView或菜单Web控件来观看站点地图数据时他都被可以看到站点地图中的所有部分通过启动安全性修剪站点导航系统将自动地基于当前登录的用户和为站点地图中的<siteMapNode>元素所参考的页面的授权而限制显示结果
可以使用下列模式通过nfig文件来配置站点导航设置
<siteMap defaultProvider=XmlSiteMapProvider enabled=true>
<providers>
<add name=XmlSiteMapProvider
description=Default SiteMap provider
type=SystemWebXmlSiteMapProvider
siteMapFile=siteMapFileName
securityTrimmingEnabled=true />
</providers>
</siteMap>
回想一下在本系列第一部分中的讨论站点导航系统使用了提供者模型这个模型提供给开发者一些良好定义的公共API但是允许(如果需要的话)定制内部实现细节缺省地站点导航特点使用XmlSiteMapProvider它从XML格式化的站点地图文件Websitemap中获得站点地图信息你可以通过nfig文件来改变所使用的提供者或修改针对缺省提供者的缺省设置
为了定制缺省提供者的设置只要简单地添加一新的提供者它使用与缺省提供者(SystemWebXmlSiteMapProvider)相同的类型来定制所需要的设置上面显示的代码片段展示了定制两个XmlSiteMapProvider的设置
·siteMapFile设置指定由提供者所使用的站点地图文件的文件名缺省地这个值是Websitemap你如果喜欢可以在此定制文件名但是我鼓励你确保站点地图文件名以sitemap扩展名结尾因为缺省地这个扩展名被ASPNET引擎保护从而阻止web访问者观看站点地图文件
·securityTrimmingEnabled设置显示是否使用安全性修剪为了使用安全性修剪可以把它设置为true如上面所示
就是这些!仅需作此改变站点导航系统就会根据当前登录的用户和为在<siteMapNode>元素中的URL定义的授权设置非常聪明地返回正确的部分下列屏幕快照显示了当分别在匿名访问者(还没有登录的)普通用户以及Admin用户访问时的TreeView的显示情况该匿名访问者仅能看到两个链接Home和 My Blog普通用户能看到另外的一个链接Auth Users而匿名访问者是看不到它的因为这个结点的URL(~/AuthUsers/Defaultaspx)被配置为仅允许认证用户观看Admin用户还能看到另外其它链接因为他是管理员角色并且为Admin站点地图结点(~/Admin/Defaultaspx)所指向的URL被配置仅允许由管理员存取
当由匿名访问者访问时的TreeView
为普通用户访问时的TreeView
为Admin访问时的TreeView
四 用角色属性阻止安全性修剪可能有一些时候你想要显式地通知安全性修剪不要为一个特别的角色或一组角色修剪一个站点地图部分例如如果你的站点地图包含一个到外部资源的链接那么该站点导航系统不可能针对这个远程资源确定授权规则因此它为所有的用户修剪该结点也就是说如果你启动了安全性修剪功能并且在用一外部链接(如<siteMapNode url= title=My Blog/>)使用一个站点地图那么没有用户会在TreeView或Menu控件中看到这些然而你可能想要让该站点导航系统为那些具有Administrator和Tester角色的用户显示这一结点(或不考虑任何用户的角色)
同样即使他们没有被授权存取该资源你也可能想向这些用户显示一个局部站点地图结点例如一访问该站点却还没有登录的用户肯定不会看到在TreeView中的Admin链接然而我们仍可能想显示之点击它将会使用户被导航到~/Admin/Defaultaspx页面此时系统将看到他们没有被认证这将把他们引导到登录页面在登录后他们将被自动地引导回Admin页面如果他们不是管理员角色他们将被送回到登录页面否则他们将被同意存取Admin部分
为了不修剪针对一个特定的站点地图结点的特别角色可以使用在相应的<siteMapNode>元素中的角色属性(注意这一设置不会应用到descendent<siteMapNode>元素也就是说对那些显式地指定另外的应该看到该结点的角色你必须显式地在每一个<siteMapNode>元素上设置这一属性)此角色属性能包含一个角色名一个用逗号间隔列表的角色名字或一个星号(*)来表示所有的用户包含在本文末尾的下载文件中的下列站点地图文件显示出怎样使用角色属性来使得所有的用户拥有一个外部的站点地图结点参考(可以联想到当启动安全性修剪功能时如果在此忽略角色属性这将导致不向任何用户显示这个站点地图结点)>
<siteMap xmlns=File >
<siteMapNode url=~/Defaultaspx title=Home>
<siteMapNode url=~/Aboutaspx title=About />
<siteMapNode url=~/Admin/Defaultaspx title=Admins />
<siteMapNode url=~/Tester/Defaultaspx title=Tester />
<siteMapNode url=~/AuthUsers/Defaultaspx title=Auth Users Only />
<! For links to outside resources need to explicitly define what
roles should be shown this section >
<siteMapNode url= title=My Blog
roles=* />
</siteMapNode>
</siteMap>
该角色属性还可以用于在安全性修剪功能性上增加一些性能改进在启动了安全性修剪功能后站点导航提供者为所有的定义在站点地图中的结点自动地检查授权规则对于那些你想要向所有的用户显示的结点通过添加roles=*你可以绕过这一检查如上例中所示通过添加这个属性你会短路正常的授权检查从而改进安全性修剪性能
五 结论
除了提供站点导航支持外ASPNET 还使得构建包括用户帐户支持和基于角色的授权的Web站点非常容易随之而来的并不令人感到惊奇这两个系统可以互操作并且提供一个站点地图其返回内容是基于当前登录的用户和定义在站点地图中的URL的授权设置配置站点导航以限制基于访问用户和授权设置的结果就象把一些代码添加nfig文件一样地容易