Reducción de seguridad del mapa del sitio de ASP.NET

Actualización: noviembre 2007

Un requisito de seguridad común para los sitios Web es permitir que sólo algunos miembros u otros usuarios autenticados puedan ver ciertas páginas. La administración de funciones de ASP.NET proporciona un medio para restringir el acceso a los archivos Web basado en funciones de seguridad. La característica de reducción de seguridad del mapa del sitio proporciona un medio para ocultar los vínculos de exploración en un mapa del sitio, que se basa también en funciones de seguridad. Para obtener información sobre la seguridad basada en funciones, vea Descripción de la administración de funciones.

Cómo funciona la reducción de seguridad del mapa del sitio

Observe la estructura de exploración siguiente, que se muestra en una página ASP.NET.

Home
   Products
      Hardware
      Software
      Discounts
   Services
      Training
      Consulting
      Support

Los clientes que no son miembros de una función denominada Customers no pueden ver la página Web Support porque se ha configurado una regla de acceso de ASP.NET para la página Support.aspx.

Para ocultar el vínculo Support en la presentación de exploración, configure el proveedor del mapa del sitio en el archivo Web.config para que habilite la reducción de seguridad. No es necesario realizar otros cambios porque la aplicación utilizará la autorización de direcciones URL y la autorización de archivos de ASP.NET para ocultar el vínculo en la página Support. El control XmlSiteMapProvider que se incluye con la versión 2.0 de ASP.NET realiza las comprobaciones de autorización automáticamente en cada nodo de mapa del sitio utilizando las características de autorización de direcciones URL (y archivos).

Si desea mostrar el vínculo Support a clientes que no pertenecen a la función Customers, puede utilizar el atributo roles en el nodo del mapa del sitio del archivo Support.aspx. El atributo roles amplía el acceso a un nodo del mapa del sitio por encima del nivel de acceso que permiten la autorización de direcciones URL y de archivos.

En el ejemplo de código siguiente, el atributo roles de la página Support se establece en Customers. Tras habilitar la reducción de seguridad, esta configuración permite a los usuarios de la función Customers ver el vínculo de desplazamiento de la página Support, aunque la autorización de direcciones URL o la autorización de archivos no le permitan ver el archivo real.

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

Los usuarios que no son miembros de la función Customers verían la estructura de exploración siguiente aunque tuvieran restricciones para ver la página Support debido a las reglas de autorización de direcciones URL o de archivos.

Home
   Products
      Hardware
      Software
      Discounts
   Services
      Training
      Consulting

Habilitar la reducción de seguridad

La reducción de seguridad trabaja con las funciones de ASP.NET. Por consiguiente, las páginas deben restringirse utilizando reglas de acceso (elementos allow y deny ) para que funcione la reducción de seguridad. Para obtener más información sobre las reglas de acceso, vea Administrar autorizaciones con funciones.

La reducción de seguridad no está habilitada de forma predeterminada, y no se puede habilitar mediante programación; sólo se puede establecer en el archivo Web.config. Esto también se aplica a cualquier clase personalizada que se herede de la clase SiteMapProvider.

Para habilitar la reducción de seguridad, es preciso configurar un elemento Elemento siteMap (Esquema de configuración de ASP.NET) en el archivo Web.config. Si el mapa del sitio utiliza el proveedor de mapas de sitio de ASP.NET predeterminado, el archivo Web.config podrá no contener un elemento Elemento siteMap (Esquema de configuración de ASP.NET), en cuyo caso será preciso agregar uno. El ejemplo de código siguiente agrega el proveedor de mapas de sitio predeterminado y habilita la reducción de seguridad.

<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>

Consideraciones sobre el rendimiento

La característica de reducción de seguridad utiliza la autorización de direcciones URL en cada solicitud para determinar si un usuario tiene acceso a una dirección URL que está asociada con un elemento siteMapNode. Este trabajo adicional reduce el rendimiento en función del número de nodos que se estén autorizando. Cuando la reducción de seguridad esté habilitada, podrá utilizar los métodos siguientes para mejorar el rendimiento:

  • Limitar el número de nodos en el archivo del mapa del sitio   Los archivos de mapas de sitio que tienen más de 150 nodos pueden tardar mucho más tiempo en realizar las operaciones de reducción de seguridad.

  • Establecer el atributo roles de forma explícita en elementossiteMapNode    Tenga en cuenta que sólo debe establecer el atributo roles en un carácter comodín o un asterisco (*) en los nodos que pueden mostrarse sin riesgo en cualquier cliente. La presencia de un atributo roles permite a ASP.NET omitir la autorización de la dirección URL que está asociada con siteMapNode cuando un usuario pertenece a una de las funciones que aparecen en el atributo.

Seleccionar funciones para evitar una reducción involuntaria

Para evitar una reducción involuntaria de los nodos del mapa del sitio, configure minuciosamente las reglas de autorización y los atributos de funciones. Observe la estructura de exploración siguiente, que se muestra en una página ASP.NET.

Home
   Products
      Hardware

Las reglas de autorización de archivos o de direcciones URL descritas en el archivo Products.aspx no deben ser más restrictivas que las reglas de autorización que se han definido en el archivo Hardware.aspx. De lo contrario, habrá usuario que no puedan ver el vínculo Hardware cuando deberían poder hacerlo porque el vínculo principal de Products estará oculto. Para mostrar los vínculos ocultos, agregue a ambos nodos del mapa del sitio un atributo roles que muestre las funciones de ASP.NET restringidas.

Es conveniente que todos los usuarios puedan tener acceso al nodo raíz de un mapa del sitio. Para ello, establezca el atributo roles en un asterisco (*) o carácter comodín, como en el ejemplo de código siguiente.

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

En un mapa del sitio, es posible hacer referencias a direcciones URL que son ajenas a la aplicación Web. ASP.NET no puede comprobar el acceso a una dirección URL ajena a la aplicación. Por tanto, si habilita la reducción de seguridad, el nodo del mapa del sitio no estará visible a menos que el atributo roles se establezca en un asterisco (*), lo que permitirá a todos los clientes ver el nodo de mapa del sitio sin tener que comprobar primero el acceso a la dirección URL.

Utilizar la reducción de seguridad con varios mapas de sitio o proveedores

Puede utilizar varios mapas de sitio juntos para definir la estructura de exploración de un solo sitio Web. Por ejemplo, un archivo Web.sitemap es similar a un archivo Web.config porque se puede dividir y ubicar en carpetas diferentes.

Los mapas del sitio se vinculan entre sí mediante referencias a un archivo de mapa de sitio o a un proveedor en el atributo siteMapFile o provider de un objeto SiteMapNode en el mapa del sitio principal.

En el ejemplo de código siguiente se muestra un nodo del mapa del sitio que hace referencia a otro mapa del sitio.

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

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

Miembros de la API afectados por la reducción de seguridad

Puede utilizar los controles de exploración para agregar la función de exploración del sitio a sus páginas sin apenas escribir código o sin escribir código alguno, aunque también puede trabajar con la función de exploración del sitio mediante programación. Cuando la aplicación Web se ejecuta, ASP.NET expone un objeto SiteMap que refleja la estructura del mapa del sitio. Todos los miembros del objeto SiteMap son estáticos. El objeto SiteMap, a su vez, expone una colección de objetos SiteMapNode que contienen las propiedades de cada nodo del mapa. Esto se debe a que, cuando utiliza el control SiteMapPath, este control trabaja con los objetos SiteMap y SiteMapNode para representar los vínculos adecuados automáticamente.

Puede utilizar los objetos SiteMap, SiteMapNode y SiteMapProvider en su propio código para recorrer la estructura del mapa del sitio o crear un control personalizado para mostrar los datos del mapa del sitio. No puede escribir en el mapa del sitio, pero puede modificar sus nodos en la instancia del objeto. Para obtener más información, vea Cómo: Modificar los nodos de mapa de sitio en memoria mediante programación o Cómo: Enumerar los nodos del mapa del sitio mediante programación.

ASP.NET utiliza el proveedor de mapas de sitio predeterminado, XmlSiteMapProvider, para leer el archivo Web.sitemap. Si desea almacenar la información del mapa del sitio en otra ubicación del archivo del mapa del sitio, puede crear su propio proveedor de y configurar su aplicación para que llame a este proveedor personalizado. El proveedor del mapa del sitio se configura en el archivo Web.config. Cuando la aplicación se ejecute, ASP.NET llamará a su proveedor, que podrá recuperar la información del mapa del sitio cuando sea necesario. A continuación, ASP.NET crea y rellena los objetos SiteMapNode en función de la información que el proveedor devuelve. El acceso a estos objetos puede realizarse mediante programación si se utiliza la clase SiteMap. Para obtener más información, vea Implementar proveedores de mapas de sitio de ASP.NET.

Nota de seguridad:

La implementación de un proveedor de mapas de sitio personalizado que almacene los datos del mapa del sitio en un archivo con una extensión de nombre de archivo que no sea .sitemap es un riesgo de seguridad en potencia. De forma predeterminada, ASP.NET se configura para impedir que los archivos con extensiones de nombre de archivo conocidas, como .sitemap, las pueda descargar un cliente. Para ayudar a proteger sus datos, sitúe todos los archivos de datos del mapa del sitio personalizado que tengan una extensión de nombre de archivo que no sea .sitemap en la carpeta App_Data. Para obtener más información, vea Proteger la exploración del sitio de ASP.NET.

Cuando está habilitada, la característica de reducción de seguridad afecta al funcionamiento de algunos miembros de las clases SiteMap, SiteMapNode y SiteMapNodeCollection. Cuando utilice estas clases, observará el comportamiento siguiente:

  • Un miembro de la API de exploración del sitio devuelve un valor null si intenta hacer referencia a un nodo del mapa del sitio que el usuario no tiene derechos de seguridad para ver. Por ejemplo, las propiedades CurrentNode, NextSibling, ParentNode y PreviousSibling devolverán un valor null si intentan devolver un nodo del mapa del sitio que está restringido.

  • Si un miembro de la API de exploración del sitio necesita recorrer el árbol de nodos del mapa del sitio, cualquier nodo del mapa del sitio que el usuario no pueda ver se excluirá de la exploración. Por ejemplo, cuando el método ChildNodes se ejecuta, la colección de nodos se filtra para incluir sólo aquellos nodos que el usuario puede ver. En caso de que haya miembros de la API que necesiten hacer un seguimiento de las rutas de acceso de un nodo, como los métodos Clone o IsDescendantOf, las rutas de acceso terminarán en nodos restringidos. Esto puede generar operaciones duplicadas que devuelvan un número reducido de nodos. También puede pasar que el método IsDescendantOf devuelva un valor false aunque estructuralmente un nodo pudiera ser realmente un descendiente del nodo solicitado.

  • Si un miembro de la API de exploración del sitio hace referencia a un nodo raíz que el usuario no tiene derechos de seguridad para ver, se produce una excepción InvalidOperationException. Sólo el nodo raíz del proveedor raíz debe ser accesible para todos los usuarios, lo que impide que se produzca una excepción cuando se obtiene primero el objeto SiteMap.

  • Si un objeto SiteMapNode hace referencia a otro archivo de mapa de sitio o a un proveedor de forma incorrecta, se produce una excepción ConfigurationException.

Nota:

En un mapa del sitio, es posible hacer referencias a direcciones URL que son ajenas a la aplicación Web. ASP.NET no puede comprobar el acceso a una dirección URL ajena a la aplicación. Por tanto, si habilita la reducción de seguridad, el nodo del mapa del sitio no estará visible a menos que el atributo roles se establezca en un asterisco (*), lo que permitirá a todos los clientes ver el nodo de mapa del sitio sin tener que comprobar primero el acceso a la dirección URL.

Vea también

Tareas

Tutorial: Filtrar nodos de mapas de los sitios basándose en las funciones de seguridad

Conceptos

Proteger la exploración del sitio de ASP.NET

Proteger el acceso a datos

Otros recursos

Administrar autorizaciones con funciones

Seguridad de aplicaciones ASP.NET en entornos alojados en host