Clase XmlResolver

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

El tipo XmlResolver se usa para resolver recursos XML externos, como entidades, definiciones de tipo de documento (DTD) o esquemas. También se usa para procesar elementos de inclusión e importación que se encuentran en hojas de estilos del lenguaje de hoja de estilos extensible (XSL) o esquemas del lenguaje de definición de esquemas XML (XSD).

XmlResolver controla todos los aspectos de la negociación de la conexión a los recursos, incluyendo el control de las credenciales de seguridad, la apertura de la conexión al origen de datos y la devolución del recurso en forma de una secuencia u otro tipo de objeto. El objeto que llama a XmlResolver tiene la tarea de interpretar la secuencia.

El espacio de nombres System.Xml incluye dos implementaciones concretas de la clase XmlResolver:

  • XmlUrlResolver es la resolución predeterminada de todas las clases del espacio de nombres System.Xml. Es compatible con los protocolos file:// y http:// y las solicitudes de la clase System.Net.WebRequest. Para obtener ejemplos de extensión de la clase para mejorar el rendimiento, consulte la página de referencia XmlUrlResolver.

  • XmlSecureResolver ayuda a proteger otro objeto XmlResolver ajustando el objeto y restringiendo los recursos a los que puede acceder. Por ejemplo, XmlSecureResolver puede prohibir el acceso a sitios o zonas de Internet específicos.

Puede crear y especificar su propio solucionador. Si no especifica un solucionador, el lector usa un valor predeterminado XmlUrlResolver sin credenciales de usuario.

Para especificar el XmlResolver que se va a utilizar, establezca la propiedad XmlReaderSettings.XmlResolver y pase el objeto XmlReaderSettings al método Create.

Si el recurso se almacena en un sistema que requiere autenticación, use la propiedad XmlResolver.Credentials para especificar las credenciales necesarias.

Proporcionar credenciales de autenticación

El archivo que contiene los datos XML que se van a leer puede tener una directiva de acceso restringido. Si se necesita autenticación para obtener acceso a un recurso de red, utilice la propiedad Credentials para especificar las credenciales necesarias. Si no se establece la propiedad Credentials, las credenciales se establecen en null.

Por ejemplo, suponga que se necesitan credenciales para solicitar datos web para realizar la autenticación. A menos que el directorio virtual web permita el acceso anónimo, debe establecer la propiedad Credentials para proporcionar credenciales. En el siguiente ejemplo se crea un objeto XmlReader que usa un XmlUrlResolver con credenciales predeterminadas para acceder al sitio http://localhost/bookstore/inventory.xml.

// Create a resolver with default credentials.
XmlUrlResolver resolver = new XmlUrlResolver();
resolver.Credentials = System.Net.CredentialCache.DefaultCredentials;

// Set the reader settings object to use the resolver.
settings.XmlResolver = resolver;

// Create the XmlReader object.
XmlReader reader = XmlReader.Create("http://ServerName/data/books.xml", settings);
' Create a resolver with default credentials.
Dim resolver as XmlUrlResolver = new XmlUrlResolver()
resolver.Credentials = System.Net.CredentialCache.DefaultCredentials

' Set the reader settings object to use the resolver.
settings.XmlResolver = resolver

' Create the XmlReader object.
Dim reader as XmlReader = XmlReader.Create("http://ServerName/data/books.xml", settings)

Puede proporcionar credenciales diferentes para diferentes URI y agregarlas a una memoria caché. Estas credenciales se utilizan para comprobar la autenticación de los diferentes identificadores URI del origen inicial del XML. En el siguiente ejemplo se muestra cómo agregar credenciales a una memoria caché.

// Create the credentials.
NetworkCredential myCred = new NetworkCredential(UserName,SecurelyStoredPassword,Domain);
CredentialCache myCache = new CredentialCache();
myCache.Add(new Uri("http://www.contoso.com/"), "Basic", myCred);
myCache.Add(new Uri("http://app.contoso.com/"), "Basic", myCred);

// Set the credentials on the XmlUrlResolver object.
XmlUrlResolver resolver = new XmlUrlResolver();
resolver.Credentials = myCache;

// Compile the style sheet.
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load("http://serverName/data/xsl/order.xsl",XsltSettings.Default, resolver);
' Create the credentials.
Dim myCred As NetworkCredential = New NetworkCredential(UserName,SecurelyStoredPassword,Domain)
Dim myCache As CredentialCache = New CredentialCache()
myCache.Add(new Uri("http://www.contoso.com/"), "Basic", myCred)
myCache.Add(new Uri("http://app.contoso.com/"), "Basic", myCred)

' Set the credentials on the XmlUrlResolver object.
Dim resolver As XmlUrlResolver = New XmlUrlResolver()
resolver.Credentials = myCache

' Compile the style sheet.
Dim xslt As XslCompiledTransform = New XslCompiledTransform()
xslt.Load("http://serverName/data/xsl/order.xsl", XsltSettings.Default, resolver)

Consideraciones sobre la seguridad

Tenga en cuenta los siguientes elementos al trabajar con la clase XmlResolver.

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

  • Si está diseñando una propiedad de clase que utilice la clase XmlResolver, dicha propiedad se debería definir como de solo escritura. La propiedad se puede utilizar para especificar el XmlResolver que se debe utilizar, pero no se puede utilizar para devolver un objeto XmlResolver.

  • Si la aplicación acepta objetos XmlResolver del código que no es de confianza, no puede suponer que el URI pasado al método GetEntity será el mismo que el devuelto por el método ResolveUri. Las clases derivadas de la clase XmlResolver pueden invalidar el método GetEntity y devolver datos diferentes a lo que contenía el identificador URI original.

  • La aplicación puede mitigar las amenazas de denegación de servicio de memoria al método GetEntity mediante la implementación de un IStream que limita el número de bytes leídos. Esto ayuda a protegerse frente a situaciones en las que el código malintencionado intenta pasar un flujo infinito de bytes al método GetEntity.