Classe System.Xml.XmlSecureResolver

Este artigo fornece observações complementares à documentação de referência para essa API.

A classe de XmlUrlResolver é o resolvedor padrão para todas as classes no namespace de System.Xml . Ele é utilizado para carregar documentos XML e resolver recursos externos, como entidades, DTDs ou esquemas, e importar ou incluir diretivas.

Você pode substituir esse padrão especificando o objeto XmlResolver a ser usado. Por exemplo, se você quiser restringir os recursos que o XmlResolver subjacente pode acessar, poderá utilizar um objeto XmlSecureResolver.

XmlSecureResolver envolve uma implementação concreta de XmlResolver e a restrição dos recursos aos quais o XmlResolver subjacente tem acesso. Por exemplo, XmlSecureResolver tem a capacidade de proibir o redirecionamento entre domínios, que ocorre a partir de uma referência de URI (Uniform Resource Identifier) inserida.

Ao construir um objeto XmlSecureResolver, você fornece uma implementação XmlResolver válida juntamente com uma URL, uma instância de um objeto de evidência ou um conjunto de permissões, que é usado pelo XmlSecureResolver para determinar a segurança. Um System.Security.PermissionSet é gerado ou o existente é utilizado e o PermissionSet.PermitOnly é chamado nele para ajudar a proteger o XmlResolver subjacente.

Importante

os objetos deXmlSecureResolver podem conter informações sigilosas como credenciais do usuário. Tenha cuidado ao armazenar objetos XmlSecureResolver em cache e não passe o objeto XmlSecureResolver para um componente não confiável.

Importante

Há diferenças na infraestrutura de segurança para o código executado no CLR (Common Language Runtime) do .NET e para o código executado no CLR que está integrado ao Microsoft SQL Server 2005. Isso pode levar a casos em que o código desenvolvido para o .NET CLR opera de forma diferente quando utilizado no CLR integrado do SQL Server. Uma dessas diferenças afeta a classe XmlSecureResolver quando você tem uma evidência baseada em uma URL (ou seja, quando você usa o método CreateEvidenceForUrl(String) ou o construtor XmlSecureResolver). O mecanismo de resolução de políticas do CLR integrado do SQL Server não usa as informações Url ou Zone. Em vez disso, ele concede permissões com base no GUID que o servidor adiciona quando os assemblies são carregados. Quando você usar o XmlSecureResolver no CLR integrado do SQL Server, forneça qualquer evidência necessária diretamente usando um PermissionSet especificado.

Para utilizar um resolvedor seguro

  1. Crie XmlSecureResolver com o conjunto de permissões correto.

  2. Crie um objeto de XmlReaderSettings que usa o objeto de XmlSecureResolver .

    XmlReaderSettings settings = new XmlReaderSettings();
    settings.XmlResolver = myResolver;
    
    Dim settings As New XmlReaderSettings()
    settings.XmlResolver = myResolver
    
  3. Passe o objeto XmlReaderSettings para o método Create quando estiver criando o objeto XmlReader.

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

Para restringir o acesso usando uma URL

Use o construtor XmlSecureResolver(XmlResolver, String) para criar um objeto XmlSecureResolver que tenha permissão para acessar apenas o site da intranet local.

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

Para restringir o acesso usando um conjunto de permissões

  1. Crie um objeto WebPermission.

    WebPermission myWebPermission = new WebPermission(PermissionState.None);
    
    Dim myWebPermission As New WebPermission(PermissionState.None)
    
  2. Especifique as URLs às quais você deseja permitir o acesso.

    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. Adicione as permissões da Web para o objeto de PermissionSet .

    PermissionSet myPermissions = new PermissionSet(PermissionState.None);
    myPermissions.AddPermission(myWebPermission);
    
    Dim myPermissions As New PermissionSet(PermissionState.None)
    myPermissions.AddPermission(myWebPermission)
    
  4. Use o construtor XmlSecureResolver(XmlResolver, PermissionSet) para criar um objeto XmlSecureResolver usando o conjunto de permissões.

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

    Consulte a página de referência XmlSecureResolver para ver outro exemplo.

Para restringir o acesso usando evidências

Você pode restringir o acesso usando o construtor XmlSecureResolver(XmlResolver, Evidence) e especificando Evidence. Evidence é usado para criar PermissionSet que é aplicado a XmlResolversubjacente. XmlSecureResolver chama PermitOnly em PermissionSet criado antes de abrir qualquer recurso.

Aqui estão alguns cenários comuns e o tipo de evidência a ser fornecida para cada um deles:

  • Se estiver trabalhando em um ambiente totalmente confiável, use seu conjunto para criar a evidência:

    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)
    
  • Se você estiver trabalhando em um ambiente semiconfiável, tiver um código ou dados provenientes de uma fonte externa, souber a origem da fonte externa e tiver um URI verificável, use o URI para criar a evidência:

    
    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)
    
  • Se você estiver trabalhando em um ambiente semiconfiável e tiver o código ou os dados provenientes de uma fonte externa, mas também não souber a origem da fonte externa:

    Defina o parâmetro de evidence a null. Isso não permite sem acesso a recursos.

    -ou-

    Se seu aplicativo requer algum acesso aos recursos, solicite a evidência do chamador.

Para utilizar o resolvedor seguro para carregar uma folha de estilos XSLT

  1. Crie XmlSecureResolver com o conjunto de permissões correto.

  2. Passar XmlSecureResolver para o método de 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)