XmlResolver クラス
この記事では、この API のリファレンス ドキュメントへの補足的な解説を提供します。
この XmlResolver 型は、エンティティ、ドキュメント型定義 (DTD)、スキーマなどの外部 XML リソースを解決するために使用されます。 また、拡張スタイルシート言語 (XSL) スタイル シートまたは XML スキーマ定義言語 (XSD) スキーマにあるインクルードおよびインポート要素の処理にも使用されます。
XmlResolver は、セキュリティ資格情報を処理し、データ ソースへの接続を開き、ストリームまたはその他のオブジェクトの種類の形式でのリソースを返すなど、リソースへの接続のネゴシエートのすべての側面を処理します。 XmlResolver を呼び出すオブジェクトには、ストリームを解釈するタスクがあります。
System.Xml 名前空間には XmlResolver クラスの 2 つの具象実装が含まれています。
XmlUrlResolver は、System.Xml 名前空間内のクラスすべての既定のリゾルバーです。 これは、
file://
およびhttp://
プロトコルをサポートし、System.Net.WebRequest クラスからの要求をサポートします。 パフォーマンスを向上させるためにクラスを拡張する例については、XmlUrlResolver リファレンス ページを参照してください。XmlSecureResolver は、オブジェクトをラップし、アクセスできるリソースを制限して、別の XmlResolver オブジェクトをセキュリティで保護するのに役立ちます。 たとえば、XmlSecureResolver は、特定のインターネット サイトまたはゾーンへのアクセスを禁止できます。
独自のリゾルバーを作成して指定できます。 リゾルバーを指定しない場合、閲覧者はユーザー資格情報のない既定値 XmlUrlResolver を使用します。
XmlResolver プロパティを設定して XmlReaderSettings.XmlResolver オブジェクトを XmlReaderSettings メソッドに渡すことにより、使用する Create を指定します。
リソースが認証を必要とするシステム上に格納されている場合は、XmlResolver.Credentials プロパティを使用して必要な資格情報を指定してください。
認証資格情報を指定する
読み取る XML データを含むファイルは、アクセス ポリシーが制限されている場合があります。 ネットワーク リソースにアクセスするために認証が必要な場合は、Credentials プロパティを使用して必要な資格情報を指定します。 Credentials プロパティが設定されていない場合、資格情報は null
に設定されます。
たとえば、Web にデータを要求するときに、認証のための資格情報が必要であるとします。 Web 仮想ディレクトリが匿名アクセスを許可していない限り、資格情報を指定するようにCredentials プロパティを設定する必要があります。 次の例では、既定の資格情報を持つ XmlUrlResolver を使用して http://localhost/bookstore/inventory.xml
サイトにアクセスする XmlReader オブジェクトを作成します。
// 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)
URI ごとに異なる資格情報を指定し、それらをキャッシュに追加できます。 これらの資格情報は、XML の出所には関係なく、異なる URI について認証をチェックするために使用されます。 キャッシュへの資格情報の追加方法を次の例に示します。
// 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)
セキュリティに関する考慮事項
XmlResolver クラスを操作するときは、次の項目を考慮してください。
XmlResolver オブジェクトはユーザー資格情報など、重要な情報を含むことがあります。 XmlResolver オブジェクトをキャッシュする場合は、XmlResolver オブジェクトを信頼できないコンポーネントに渡さないように、注意する必要があります。
XmlResolver クラスを使用したクラス プロパティを設計する場合は、そのプロパティは書き込み専用として定義する必要があります。 使用する XmlResolver を指定するためにそのプロパティを使用できますが、XmlResolver オブジェクトを返すためには使用できません。
アプリケーションが信頼されていないコードから XmlResolver オブジェクトを受け入れる場合、GetEntity メソッドに渡される URI が、ResolveUri メソッドから返されたものと同じであると仮定することはできません。 XmlResolver クラスから派生したクラスは、GetEntity メソッドをオーバーライドすることができ、元の URI に含まれていたデータと異なるデータを返すことができます。
アプリケーションは、読み取るバイト数を制限する IStream を実装して、GetEntity メソッドに対するメモリサービス拒否の脅威を軽減できます。 これにより、悪意のあるコードが無限のバイト ストリームを GetEntity メソッドに渡そうとする状況を防ぐことができます。
.NET