Classe XmlResolver

Cet article vous offre des remarques complémentaires à la documentation de référence pour cette API.

Le type XmlResolver sert à résoudre des ressources XML externes, comme des entités, des définitions du type de document (DTD) ou des schémas. C’est également utilisé pour traiter les éléments inclus et importés qui se retrouvent dans les feuilles de style XSL (Extensible Stylesheet Language) ou les schémas XSD (XML Schema Definition Language).

XmlResolver gère tous les aspects de la négociation de la connexion aux ressources, notamment la gestion des informations d’identification de sécurité, l’ouverture de la connexion à la source de données et le retour de la ressource sous la forme d’un flux ou de tout autre type d’objet. L’objet appelant XmlResolver a la tâche d’interpréter le flux.

L’espace de noms System.Xml comprend deux implémentations concrètes de la classe XmlResolver :

  • XmlUrlResolver est le programme de résolution par défaut de toutes les classes dans l’espace de noms System.Xml. Elle prend en charge les requêtes et les protocoles file:// et http:// de la classe System.Net.WebRequest. Pour obtenir des exemples d’extension de la classe pour améliorer les performances, consultez la page de référence XmlUrlResolver.

  • XmlSecureResolver permet de sécuriser un autre objet XmlResolver en enveloppant l’objet et en limitant les ressources auxquelles il peut accéder. Par exemple, le XmlSecureResolver peut interdire l’accès à des sites ou zones spécifiques d’Internet.

Vous pouvez créer et spécifier votre propre programme de résolution. Si vous ne spécifiez pas de programme de résolution, le lecteur utilise une valeur par défaut XmlUrlResolver sans informations d’identification utilisateur.

Pour spécifier l'objet XmlResolver à utiliser, définissez la propriété XmlReaderSettings.XmlResolver et transmettez l'objet XmlReaderSettings à la méthode Create.

Si la ressource est stockée sur un système exigeant une authentification, vous utilisez la propriété XmlResolver.Credentials pour spécifier les informations d’identification nécessaires.

Fournir les informations d’authentification

Le fichier contenant les données XML à lire peut avoir une stratégie d’accès restreint. Si une authentification est requise pour accéder à une ressource réseau, utilisez la propriété Credentials pour spécifier les informations d'identification nécessaires. Si la propriété Credentials n’est pas définie, les informations d’identification sont définies sur null.

Par exemple, supposons que des informations d’identification soient nécessaires à des fins d’authentification lors de la requête de données sur le Web. À moins que le répertoire virtuel web n’autorise l’accès anonyme, vous devez définir la propriété Credentials pour fournir des informations d’identification. L’exemple suivant crée un objet XmlReader qui utilise un XmlUrlResolver avec des informations d’identification par défaut pour accéder au site 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)

Vous pouvez fournir différentes informations d’identification pour les différentes URI et les ajouter à un cache. Ces informations d'identification permettent de vérifier l'authentification vis-à-vis des différents URI, quelle que soit la source initiale du XML. L’exemple suivant montre l’ajout d’informations d’identification à un cache.

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

Considérations de sécurité

Tenez compte des éléments suivants lors de l’utilisation de la classe XmlResolver.

  • Les objets XmlResolver peuvent contenir des informations confidentielles telles que des informations d'identification de l'utilisateur. Vous devez être prudent lors de la mise en cache des objets XmlResolver et éviter de passer l’objet XmlResolver à un composant non approuvé.

  • Si vous concevez une propriété de classe qui utilise la classe XmlResolver, cette propriété doit être définie comme étant en écriture seule. La propriété peut servir à spécifier l'objet XmlResolver à utiliser, mais pas à retourner un objet XmlResolver.

  • Si votre application accepte des objets XmlResolver provenant d’un code non approuvé, vous ne pouvez pas supposer que l’URI passé dans la méthode GetEntity va être identique à celui retourné par la méthode ResolveUri. Les classes dérivées de la classe XmlResolver peuvent se substituer à la méthode GetEntity et retourner des données différentes de ce qui était contenu dans l'URI d'origine.

  • Votre application peut diminuer le risque d’attaques de type déni de service sur la méthode GetEntity en implémentant un IStream qui limite le nombre d’octets lus. Cela contribue à prévenir les situations où un code malveillant tente de passer un flux infini d’octets à la méthode GetEntity.