ASP.NET 站点地图安全性调整

更新:2007 年 11 月

网站在安全性方面有一个常见的要求:特定的页面仅允许某些成员或其他经过身份验证的用户浏览。ASP.NET 的角色管理提供了一种方法,可以基于安全角色限制对 Web 文件的访问。站点地图安全性调整提供了一种同样基于安全角色的方法来隐藏站点地图中的导航链接。有关基于角色的安全性的信息,请参见了解角色管理

站点地图安全性调整的工作原理

以如下的导航结构为例,该结构显示在一个 ASP.NET 页面中。

Home
   Products
      Hardware
      Software
      Discounts
   Services
      Training
      Consulting
      Support

根据为 Support.aspx 页面配置的 ASP.NET 访问规则,不属于“客户”角色的成员的访问者无权查看“支持”网页。

若要在导航界面中隐藏“支持”链接,请在 Web.config 文件中配置站点地图提供程序,以启用安全性调整。不需要其他更改,因为应用程序将使用 ASP.NET 的 URL 授权和文件授权来隐藏指向“支持”页面的链接。ASP.NET 版本 2.0 中包含的 XmlSiteMapProvider 控件将使用 URL 授权和文件授权功能,对站点地图中的每个节点自动执行授权检查。

如果您想要向不属于“客户”角色的访问者显示“支持”链接,可以对 Support.aspx 文件的站点地图节点使用 roles 属性。roles 属性扩展了对站点地图节点的访问,使其超出了 URL 授权和文件授权所准许的访问级别。

下面的代码示例将“支持”页面的 roles 属性设置为 Customers。尽管根据 URL 授权和文件授权,并不允许属于“客户”角色的用户查看实际的“支持”页面文件,但在启用安全性调整之后,此设置将允许这些用户看到指向该页面的导航链接。

<?xml version="1.0" encoding="utf-8" ?>
  <siteMap>
    <!-- other <siteMapNode> elements -->
      <siteMapNode title="Support" description="Support"
        url="~/Customers/Support.aspx" roles="Customers" />
  </siteMap>

如果根据 URL 授权或文件授权规则的限制,不属于“客户”角色的用户无法查看“支持”页面,那么这些用户将看到下面的导航结构。

Home
   Products
      Hardware
      Software
      Discounts
   Services
      Training
      Consulting

启用安全性调整

安全性调整与 ASP.NET 角色协同工作。所以,必须使用访问规则(allow 和 deny 元素)限制页面,才能使安全性调整起作用。有关访问规则的更多信息,请参见使用角色管理授权

安全性调整在默认情况下不启用,而且也不能通过编程的方式启用,只能通过在 Web.config 文件中进行设置来启用。对于继承自 SiteMapProvider 类的任何自定义类,情况亦是如此。

若要启用安全性调整,您需要在 Web.config 文件中配置 siteMap 元素(ASP.NET 设置架构) 元素。如果站点地图使用默认的 ASP.NET 站点地图提供程序,那么 Web.config 文件可能不包含 siteMap 元素(ASP.NET 设置架构) 元素,在这种情况下,您需要添加一个。下面的代码示例添加默认的站点地图提供程序,并启用安全性调整。

<system.web>
<!-- …other configuration settings -->
  <siteMap defaultProvider="XmlSiteMapProvider" enabled="true">
    <providers>
      <add name="XmlSiteMapProvider"
        description="Default SiteMap provider."
        type="System.Web.XmlSiteMapProvider "
        siteMapFile="Web.sitemap"
        securityTrimmingEnabled="true" />
    </providers>
  </siteMap>
</system.web>

性能注意事项

安全性调整功能对每个请求使用 URL 授权,以确定用户是否能访问与 siteMapNode 元素关联的 URL。这种额外的工作会使性能下降,下降的程度取决于要进行授权的节点数。如果启用了安全性调整,您可以使用下面的方法提高性能:

  • 限制站点地图文件中的节点数 节点数超过 150 的站点地图文件执行安全性调整操作所耗费的时间明显变长。

  • 显式设置 roles 属性(在 siteMapNode元素上) 注意,只有对于可在任何客户端上安全显示的节点,才能将 roles 属性设置为通配符(即星号 (*))。当用户属于 roles 属性中列出的某一角色时,使用该属性后,ASP.NET 可避开与 siteMapNode 关联的 URL 授权限制。

选择角色以防止意外的调整

若要防止对子站点地图节点的意外调整,要谨慎地配置授权角色及角色属性。以如下的导航结构为例,该结构显示在一个 ASP.NET 页面中。

Home
   Products
      Hardware

对 Products.aspx 文件设置的 URL 授权或文件授权规则限制不应高于对 Hardware.aspx 文件设置的授权规则限制。否则,将对那些本应能看见“硬件”链接的用户无法看到该链接,因为指向“产品”的父链接将被隐藏。若要显示隐藏的链接,请为这两个站点地图节点均添加一个 roles 属性,该属性列出了要忽略的 ASP.NET 角色。

建议您将站点地图中的根节点设置为可由所有用户访问。为此,请将 roles 属性设置为星号 (*) 或通配符,如下面的代码示例中所示。

<?xml version="1.0" encoding="utf-8" ?>
<siteMap>
  <siteMapNode title="Home" description="Home" 
    url="default.aspx" roles="*">
    <!-- other <siteMapNode> elements -->
  </siteMapNode>
</siteMap>

在站点地图中,您可以引用 Web 应用程序外部的 URL。ASP.NET 无法测试对应用程序外部的 URL 的访问。因此,如果启用安全性调整,站点地图节点将不可见。但有一种情况除外,当您将角色属性设置为星号 (*) 时,可使所有访问者均能查看站点地图节点,而 ASP.NET 不会先测试对 URL 的访问。

对多个站点地图或提供程序使用安全性调整

您可以同时使用多个站点地图,为单个网站定义导航结构。例如,Web.sitemap 文件类似于 Web.config 文件,因为它能被分割并置于不同的文件夹中。

通过在父站点地图中的 SiteMapNode 对象的 siteMapFile 或 provider 属性中引用子站点地图文件或提供程序,站点地图可以相互链接。

下面的代码示例阐释了引用了另一个站点地图的站点地图节点。

<?xml version="1.0" encoding="utf-8" ?>

<siteMap>
  <!-- other <siteMapNode> elements -->
    <siteMapNode siteMapFile="~/Customers/Customers.sitemap" 
      securityTrimmingEnabled="true" />
</siteMap>

受安全性调整影响的 API 成员

通过导航控件,您只需编写极少的代码甚至不需要代码,就可以在页面中添加站点导航;不过您也能以编程的方式处理站点导航。当 Web 应用程序运行时,ASP.NET 公开一个反映站点地图结构的 SiteMap 对象。SiteMap 对象的所有成员均为静态成员。而 SiteMap 对象会公开 SiteMapNode 对象的集合,这些对象包含地图中每个节点的属性。这是因为,当您使用 SiteMapPath 控件时,该控件会使用 SiteMapSiteMapNode 对象来自动呈现相应的链接。

您可以在自己的代码中使用 SiteMapSiteMapNodeSiteMapProvider 对象来遍历站点地图结构,或创建自定义的控件来显示站点地图数据。您不能向站点地图进行写入,但可以在对象的实例中修改站点地图节点。有关更多信息,请参见如何:以编程方式修改内存中的站点地图节点如何:以编程方式枚举站点地图节点

ASP.NET 使用默认的站点地图提供程序 XmlSiteMapProvider 来读取 Web.sitemap 文件。如果要将站点地图信息存储在站点地图文件以外的位置,您可以创建自己的站点地图提供程序并对您的应用程序进行配置以调用自定义提供程序。站点地图提供程序在 Web.config 文件中配置。当应用程序运行时,ASP.NET 会调用您的提供程序,后者可以根据需要检索站点地图信息。然后,ASP.NET 根据您的提供程序返回的信息,相应地创建和填充 SiteMapNode 对象。通过使用 SiteMap 类,可以以编程方式访问这些对象。有关更多信息,请参见实现 ASP.NET 站点地图提供程序

ms178428.alert_security(zh-cn,VS.90).gif安全说明:

实现自定义的站点地图提供程序时,如果存储站点地图数据的文件的扩展名不是 .sitemap,则会有潜在安全风险。默认情况下,ASP.NET 配置为阻止客户端下载具有已知文件扩展名(如 .sitemap)的文件。为帮助保护您的数据,可将文件扩展名不是 .sitemap 的所有自定义站点地图数据文件放入 App_Data 文件夹中。有关更多信息,请参见保证 ASP.NET 站点导航的安全

启用安全性调整会影响 SiteMap 类、SiteMapNode 类和 SiteMapNodeCollection 类中某些成员的行为。使用这些类时,将看到下面的行为:

  • 如果站点导航 API 成员尝试引用用户无安全权限查看的站点地图节点,则会返回 null。例如,如果 CurrentNodeNextSiblingParentNodePreviousSibling 属性尝试返回受限制的站点地图节点,则它们将返回 null。

  • 如果站点导航 API 成员需要遍历站点地图节点的树,所有用户无权查看的站点地图节点将从遍历中排除。例如,当 ChildNodes 方法运行时,会对节点集合进行筛选,使得只包含用户有权查看的节点。对于需要跟踪节点路径的 API 成员,例如 CloneIsDescendantOf 方法,则路径终止于受限制的节点。这可能导致克隆那些返回节点数减少的操作。还可能导致 IsDescendantOf 方法返回 false 值,即使在结构上某个节点实际可能是被请求节点的子代节点。

  • 如果站点导航 API 成员引用了用户无安全权限查看的根节点,则会返回 InvalidOperationException 异常。只有根提供程序的根节点才需要能被所有用户访问,这可以防止在一开始获取 SiteMap 对象时引发异常。

  • 如果 SiteMapNode 对象不正确地引用另一个站点地图文件或提供程序,则会引发 ConfigurationException 异常。

ms178428.alert_note(zh-cn,VS.90).gif说明:

在站点地图中,您可以引用 Web 应用程序外部的 URL。ASP.NET 无法测试对应用程序外部的 URL 的访问。因此,如果启用安全性调整,站点地图节点将不可见。但有一种情况除外,当您将角色属性设置为星号 (*) 时,可使所有访问者均能查看站点地图节点,而 ASP.NET 不会先测试对 URL 的访问。

请参见

任务

演练:根据安全角色筛选站点地图节点

概念

保证 ASP.NET 站点导航的安全

保证数据访问的安全

其他资源

使用角色管理授权

寄宿环境中的 ASP.NET 应用程序安全性