Clase System.Xml.XmlSecureResolver

En este artículo se proporcionan comentarios adicionales a la documentación de referencia de esta API.

La clase XmlUrlResolver es la resolución predeterminada de todas las clases del espacio de nombres System.Xml. Se utiliza para cargar documentos XML y para resolver recursos externos, como entidades, DTD o esquemas, e importar o incluir directivas.

Puede invalidar esta clase predeterminada especificando el objeto XmlResolver que se va a utilizar. Por ejemplo, si desea restringir los recursos a los que puede acceder el XmlResolver subyacente, puede usar un objeto XmlSecureResolver.

XmlSecureResolver se encapsula alrededor a una implementación concreta de XmlResolver y restringe los recursos a los que tiene acceso el XmlResolver subyacente. Por ejemplo, XmlSecureResolver tiene la capacidad de prohibir el redireccionamiento entre dominios, que se produce desde una referencia insertada de identificador uniforme de recursos (URI).

Al construir un objeto XmlSecureResolver, se debe proporcionar una implementación válida de XmlResolver junto con una dirección URL, una instancia de un objeto de evidencia o un conjunto de permisos, que XmlSecureResolver usa para determinar la seguridad. Se genera un System.Security.PermissionSet o se usa el existente y PermissionSet.PermitOnly se llama a en él para ayudar a proteger el XmlResolver subyacente.

Importante

Los objetos XmlSecureResolver pueden contener información confidencial como, por ejemplo, credenciales de usuario. Debe tener cuidado al almacenar objetos XmlSecureResolver en caché y no debe pasar el objeto XmlSecureResolver a un componente que no es de confianza.

Importante

Existen diferencias en la infraestructura de seguridad para el código que se ejecuta en Common Language Runtime (CLR) de .NET y para el código que se ejecuta en CLR integrado en Microsoft SQL Server 2005. Esto puede generar casos en los que el código desarrollado para .NET CLR funciona de forma diferente cuando se usa en CLR integrado de SQL Server. Una de estas diferencias afecta a la clase XmlSecureResolver cuando se tiene evidencia de que se basa en una dirección URL (es decir, cuando se usa el método CreateEvidenceForUrl(String) o el constructor XmlSecureResolver). El mecanismo de resolución de directivas de CLR integrado en SQL Server no usa la información de Url o Zone. En su lugar, concede permisos basados en el GUID, que el servidor agrega cuando se cargan los ensamblados. Cuando use XmlSecureResolver en el CLR integrado en SQL Server, proporcione cualquier evidencia necesaria directamente mediante un PermissionSet especificado.

Para usar un resolver seguro

  1. Cree un objeto XmlSecureResolver con el conjunto de permisos correcto.

  2. Cree un objeto XmlReaderSettings que utilice el objeto XmlSecureResolver.

    XmlReaderSettings settings = new XmlReaderSettings();
    settings.XmlResolver = myResolver;
    
    Dim settings As New XmlReaderSettings()
    settings.XmlResolver = myResolver
    
  3. Pase el objeto XmlReaderSettings al método Create al crear el objeto XmlReader.

    XmlReader reader = XmlReader.Create("books.xml", settings);
    
    Dim reader As XmlReader = XmlReader.Create("books.xml", settings)
    

Para restringir el acceso con una URL

Use el constructor XmlSecureResolver(XmlResolver, String) para crear un objeto XmlSecureResolver que solo tenga permiso para acceder al sitio de intranet local.

XmlSecureResolver myResolver = new XmlSecureResolver(new XmlUrlResolver(), "http://myLocalSite/");
Dim myResolver As New XmlSecureResolver(New XmlUrlResolver(), "http://myLocalSite/")

Para restringir el acceso con un conjunto de permisos

  1. Crear un objeto WebPermission.

    WebPermission myWebPermission = new WebPermission(PermissionState.None);
    
    Dim myWebPermission As New WebPermission(PermissionState.None)
    
  2. Especifique las direcciones URL a las que desea permitir el acceso.

    myWebPermission.AddPermission(NetworkAccess.Connect, "http://www.contoso.com/");
    myWebPermission.AddPermission(NetworkAccess.Connect, "http://litwareinc.com/data/");
    
    myWebPermission.AddPermission(NetworkAccess.Connect, "http://www.contoso.com/")
    myWebPermission.AddPermission(NetworkAccess.Connect, "http://litwareinc.com/data/")
    
  3. Agregue permisos web al objeto PermissionSet.

    PermissionSet myPermissions = new PermissionSet(PermissionState.None);
    myPermissions.AddPermission(myWebPermission);
    
    Dim myPermissions As New PermissionSet(PermissionState.None)
    myPermissions.AddPermission(myWebPermission)
    
  4. Use el constructor XmlSecureResolver(XmlResolver, PermissionSet) para crear un objeto XmlSecureResolver con el conjunto de permisos.

    XmlSecureResolver myResolver = new XmlSecureResolver(new XmlUrlResolver(), myPermissions);
    
    Dim myResolver As New XmlSecureResolver(New XmlUrlResolver(), myPermissions)
    

    Consulte la página de referencia de XmlSecureResolver para ver otro ejemplo.

Para restringir el acceso con evidencia

Puede restringir el acceso con el constructor XmlSecureResolver(XmlResolver, Evidence) y especificando Evidence. Evidence se utiliza para crear el PermissionSet que se aplica al XmlResolver subyacente. XmlSecureResolver llama a PermitOnly en el PermissionSet creado antes de abrir cualquier recurso.

Estos son algunos escenarios comunes y el tipo de evidencia que se debe proporcionar para cada uno:

  • Si trabaja en un entorno de plena confianza, use el ensamblado para crear la evidencia:

    Evidence myEvidence = this.GetType().Assembly.Evidence;
    XmlSecureResolver myResolver;
    myResolver = new XmlSecureResolver(new XmlUrlResolver(), myEvidence);
    
    Dim myEvidence As Evidence = Me.GetType().Assembly.Evidence
    Dim myResolver As XmlSecureResolver
    myResolver = New XmlSecureResolver(New XmlUrlResolver(), myEvidence)
    
  • Si trabaja en un entorno de confianza parcial, tiene código o datos procedentes de un origen externo, y conoce la procedencia del origen externo y tiene un URI verificable, use el URI para crear la evidencia:

    
    Evidence myEvidence = XmlSecureResolver.CreateEvidenceForUrl(sourceURI);
    XmlSecureResolver myResolver = new XmlSecureResolver(new XmlUrlResolver(), myEvidence);
    
    Dim myEvidence As Evidence = XmlSecureResolver.CreateEvidenceForUrl(sourceURI)
    Dim myResolver As New XmlSecureResolver(New XmlUrlResolver(), myEvidence)
    
  • Si trabaja en un entorno de confianza parcial y tiene código o datos procedentes de un origen externo, pero no conoce la procedencia del origen externo:

    Establezca el parámetro evidence en null. De esta manera, no se permite el acceso a los recursos.

    o bien

    Si su aplicación necesita determinado acceso a los recursos, solicite evidencias a quien realiza la llamada.

Para utilizar el resolver seguro para cargar una hoja de estilos XSLT

  1. Cree un objeto XmlSecureResolver con el conjunto de permisos correcto.

  2. Pasar XmlSecureResolver al método Load.

    XslCompiledTransform xslt = new XslCompiledTransform();
    xslt.Load("http://serverName/data/xsl/sort.xsl", null, myResolver);
    
    Dim xslt As New XslCompiledTransform()
    xslt.Load("http://serverName/data/xsl/sort.xsl", Nothing, myResolver)