Поделиться через


Класс System.Xml.XmlSecureResolver

В этой статье приводятся дополнительные замечания к справочной документации по этому API.

Класс XmlUrlResolver — это сопоставитель по умолчанию для всех классов в System.Xml пространстве имен. Он используется для загрузки XML-документов и разрешения внешних ресурсов, таких как сущности, DTD или схемы, а также импорт или включение директив.

Этот параметр по умолчанию можно переопределить, указав используемый XmlResolver объект. Например, если вы хотите ограничить ресурсы, к которым может получать доступ базовый элемент XmlResolver, можно использовать объект XmlSecureResolver.

XmlSecureResolver обтекает конкретную реализацию XmlResolver и ограничивает ресурсы, к которым имеет доступ базовый XmlResolver объект. Например, XmlSecureResolver имеет возможность запрета перенаправления между доменами, которая возникает из внедренной ссылки на универсальный идентификатор ресурса (URI).

При создании XmlSecureResolver объекта вы предоставляете допустимую XmlResolver реализацию вместе с URL-адресом, экземпляром объекта доказательства или набором разрешений, который используется XmlSecureResolver для определения безопасности. Либо создается System.Security.PermissionSet, либо используется существующий, и на нем вызывается PermissionSet.PermitOnly для помощи в защите базового XmlResolver.

Это важно

XmlSecureResolver объекты могут содержать конфиденциальную информацию, например учетные данные пользователя. Будьте осторожны при кэшировании объектов XmlSecureResolver и не передавайте объект XmlSecureResolver в ненадежный компонент.

Это важно

Существуют различия в инфраструктуре безопасности для кода, выполняемого в среде CLR .NET, и для кода, работающего в среде CLR, интегрированной в Microsoft SQL Server 2005. Это может привести к случаям, когда код, разработанный для .NET CLR, работает по-разному при использовании в интегрированной среде CLR SQL Server. Одно из этих различий влияет на XmlSecureResolver класс при наличии доказательств, основанных на URL-адресе (то есть при использовании CreateEvidenceForUrl(String) метода или конструктора XmlSecureResolver ). Механизм разрешения политик CLR, интегрированной в SQL Server, не использует информацию Url или Zone. Вместо этого он предоставляет разрешения на основе GUID, добавляемого сервером при загрузке сборок. Когда вы используете XmlSecureResolver в интегрированной среде CLR SQL Server, предоставьте необходимые данные напрямую с помощью указанного PermissionSet.

Использовать безопасный сопоставитель

  1. Создайте XmlSecureResolver с правильным набором разрешений.

  2. XmlReaderSettings Создайте объект, использующий XmlSecureResolver объект.

    XmlReaderSettings settings = new XmlReaderSettings();
    settings.XmlResolver = myResolver;
    
    Dim settings As New XmlReaderSettings()
    settings.XmlResolver = myResolver
    
  3. Передайте объект XmlReaderSettings методу Create при создании объекта XmlReader.

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

Ограничение доступа с помощью URL-адреса

Используйте конструктор XmlSecureResolver(XmlResolver, String), чтобы создать объект XmlSecureResolver, который может получить доступ только к вашему сайту локальной интрасети.

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

Ограничение доступа с помощью набора разрешений

  1. Создайте объект WebPermission.

    WebPermission myWebPermission = new WebPermission(PermissionState.None);
    
    Dim myWebPermission As New WebPermission(PermissionState.None)
    
  2. Укажите URL-адреса, к которым требуется разрешить доступ.

    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. Добавьте веб-разрешения в PermissionSet объект.

    PermissionSet myPermissions = new PermissionSet(PermissionState.None);
    myPermissions.AddPermission(myWebPermission);
    
    Dim myPermissions As New PermissionSet(PermissionState.None)
    myPermissions.AddPermission(myWebPermission)
    
  4. XmlSecureResolver(XmlResolver, PermissionSet) Используйте конструктор для создания XmlSecureResolver объекта с помощью набора разрешений.

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

    См. на странице справки XmlSecureResolver другой пример.

Ограничение доступа с помощью доказательств

Доступ можно ограничить с помощью конструктора XmlSecureResolver(XmlResolver, Evidence) и указания Evidence. Evidence используется для создания PermissionSet, который применяется к базовому XmlResolver. XmlSecureResolver вызывает PermitOnly на созданный PermissionSet перед открытием любых ресурсов.

Ниже приведены некоторые распространенные сценарии и тип доказательств для каждого из них:

  • Если вы работаете в полностью доверенной среде, используйте сборку для создания доказательств:

    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)
    
  • Если вы работаете в полунадежной среде, у вас есть код или данные, поступающие из внешнего источника, и вы знаете источник внешнего источника и имеете проверяемый URI, используйте URI для создания доказательств:

    
    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)
    
  • Если вы работаете в полунадежной среде и у вас есть код или данные, поступающие из внешнего источника, но происхождение этого источника вам неизвестно:

    Установите для параметра evidence значение null. Это позволяет не обращаться к ресурсам.

    -или-

    Если вашему приложению требуется доступ к ресурсам, запросите доказательства от вызывающей стороны.

Использование безопасного сопоставителя для загрузки таблицы стилей XSLT

  1. Создайте XmlSecureResolver с правильным набором разрешений.

  2. Передайте XmlSecureResolver методу 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)