16.7 站点地图安全性调整
网站在安全性方面有一个常见的要求:特定的页面仅允许某些成员或其他经过身份验证的用户浏览。ASP.NET的角色管理提供了一种方法,可以基于安全角色限制对Web文件的访问。站点地图安全性调整提供了一种同样基于安全角色的方法来隐藏站点地图中的导航链接。
16.7.1 启用安全性调整
以如下的导航结构为例,该导航结构显示在一个Default.aspx页面中:
主页
产品信息
硬件
处理器
内存
软件
Windows
Office
根据系统要求,要求特定的用户才能够访问“Office”链接。但即使已经通过授权规则显示禁止大多数人访问Office.aspx页面,但所有用户还是能够看到该页面的链接。这时可以通过安全调整的技术来避免这一混乱。
安全性调整在默认情况下不启用,而且也不能通过编程的方式启用,只能通过在Web.config文件中进行设置来启用。对于继承自SiteMapProvider类的任何自定义类,情况亦是如此。打开安全调整时,所有用户不允许访问的页面(基于授权规则)都不会出现在站点地图中。也就是说,非管理员用户将不会看到Office.aspx页面的链接。如果通过授权规则为不同角色创建了独立的页面组,那么所有用户都将只看到被授权的页面。
若要启用安全性调整,需要在Web.config文件中配置siteMap元素((AP.NET设置架构)元素。如果站点地图使用默认的ASP.NET站点地图提供程序,那么Web.config文件可能不包含siteMap元素((AP.NET设置架构),在这种情况下,需要添加一个。同时,在Web.config文件中注册站点地图提供程序时,使用securityTrimmingEnabled特性才能打开安全调整。下面的代码示例添加默认的站点地图提供程序,并启用安全性调整:
<?xml version="1.0"?>
<configuration>
<system.web>
<siteMap defaultProvider="XmlSiteMapProvider"enabled="true">
<providers>
<add name="XmlSiteMapProvider"
description="Default SiteMap provider."
type="System.Web.XmlSiteMapProvider"
siteMapFile="Web.sitemap"
securityTrimmingEnabled="true"/>
</providers>
</siteMap>
<compilation debug="true"targetFramework="4.0"/>
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
16.7.2 使用角色
如果想要向不属于“客户”角色的访问者显示“Office”链接,可以对Office.aspx文件的站点地图节点使用roles属性。roles属性扩展了对站点地图节点的访问,使其超出了URL授权和文件授权所准许的访问级别。
下面的代码示例将“Office”页面的roles属性设置为Customers。尽管根据URL授权和文件授权,并不允许属于"客户"角色的用户查看实际的"Office"页面文件,但在启用安全性调整之后,此设置将允许这些用户看到指向该页面的导航链接。
<siteMapNode title="Office"description="Office"
url="~/Office.aspx"roles="Customers"/>
如果根据URL授权或文件授权规则的限制,不属于“客户”角色的用户无法查看“支持”页面,那么这些用户将看到下面的导航结构:
主页
产品信息
硬件
处理器
内存
软件
Windows
若要防止对子站点地图节点的意外调整,要谨慎地配置授权角色及角色属性。
如在上面的例子中,对Software.aspx(软件节点)文件设置的URL授权或文件授权规则限制不应高于对Office.aspx(Office节点)文件设置的授权规则限制。否则,那些本来能够看见"Office"链接的用户将无法看到该链接,因为指向"软件"的父链接将被隐藏。若要显示隐藏的链接,请为这两个站点地图节点均添加一个roles属性,该属性列出了要忽略的ASP.NET角色。
在这里,建议将站点地图中的根节点设置为可由所有用户访问。为此,请将roles属性设置为星号(*)或通配符。如下面的代码示例中所示:
<?xml version="1.0"encoding="utf-8"?>
<siteMap
xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0">
<siteMapNode title="主页"description="网站主页"
url="~/Default.aspx"roles="(*)">
……
</siteMapNode>
</siteMap>
在站点地图中,可以引用Web应用程序外部的URL。ASP.NET无法测试对应用程序外部的URL的访问。因此,如果启用安全性调整,站点地图节点将不可见。但有一种情况除外,当将角色属性设置为星号(*)时,可使所有访问者均能查看站点地图节点,而ASP.NET不会先测试对URL的访问。
16.7.3 对多个站点地图或提供程序使用安全性调整
对多个站点地图或提供程序使用安全性调整的方法很简单,只需要在父站点地图要显示子站点地图的SiteMapNode中添加一个securityTrimmingEnabled属性即可。如下面的代码所示:
<siteMapNode siteMapFile="~/SiteMap/Service.sitemap"
securityTrimmingEnabled="true"/>
16.7.4 性能注意事项
安全性调整功能对每个请求使用URL授权,以确定用户是否能访问与siteMapNode元素关联的URL。这种额外的工作会使性能下降,下降的程度取决于要进行授权的节点数。如果启用了安全性调整,可以使用下面的方法提高性能:
1)限制站点地图文件中的节点数。节点数超过150的站点地图文件执行安全性调整操作所耗费的时间明显变长。
2)在siteMapNode元素上显式设置roles属性。需要注意的是,只有对于可在任何客户端上安全显示的节点,才能将roles属性设置为通配符(*)。当用户属于roles属性中列出的某一角色时,使用该属性后,ASP.NET可避开与siteMapNode关联的URL授权限制。