Partilhar via


XmlSecureResolver está obsoleto

O método System.Xml.XmlSecureResolver.GetEntity(Uri, String, Type) lança incondicionalmente um XmlException em tempo de execução. Se a sua aplicação utilizar XmlSecureResolver e tentar resolver um recurso XML através dele, a resolução falhará com uma exceção.

Além disso, o tipo System.Xml.XmlSecureResolver todo é obsoleto. Todas as referências a este tipo resultarão num aviso SYSLIB0047 durante a compilação. Se tiveres ativado avisos como erros, isso causará uma quebra de build se o teu aplicativo fizer referência a XmlSecureResolver.

using System.Xml;

// Compiler warning SYSLIB0047: XmlSecureResolver type is obsolete.
XmlResolver resolver = new XmlSecureResolver(
    resolver: new XmlUrlResolver(),
    securityUrl: "https://www.example.com/");

// Call to XmlSecureResolver.GetEntity below throws XmlException at run time.
object entity = resolver.GetEntity(
    absoluteUri: new Uri("https://www.example.com/some-entity"),
    role: null,
    ofObjectToReturn: null);

Comportamento anterior

No .NET Framework, XmlSecureResolver.GetEntity(Uri, String, Type) constrói uma área restrita CAS (Segurança de Acesso ao Código) para restringir o processo de resolução de recursos XML externos. Se a política for violada, um SecurityException é lançado.

No .NET Core 3.1 e no .NET 6, XmlSecureResolver.GetEntity(Uri, String, Type) não restringe a resolução de recursos XML externos. A resolução de recursos externos pode prosseguir sem limitações.

Novo comportamento

A partir do .NET 7, XmlSecureResolver.GetEntity(Uri, String, Type) lança incondicionalmente um XmlException. Não constrói uma sandbox CAS e não tenta resolver o recurso externo.

Versão introduzida

.NET 7

Tipo de mudança disruptiva

Essa alteração pode afetar a compatibilidade de origem e a compatibilidade binária.

Motivo da mudança

Essa alteração melhora a segurança do ecossistema .NET. Essa obsolescência move o comportamento de XmlSecureResolver fail-dangerous (sempre executar resolução) para fail-safe (nunca executar resolução) ao executar no .NET 7 ou posterior.

Em vez disso, considere usar a propriedade XmlResolver.ThrowingResolverestática recém-introduzida. Esta propriedade fornece uma XmlResolver instância que impede a resolução de recursos externos.

using System.Xml;

// BAD: Do not use XmlSecureResolver.
// XmlResolver resolver = new XmlSecureResolver(
//     resolver: new XmlUrlResolver(),
//     securityUrl: "https://www.example.com/");

// GOOD: Use XmlResolver.ThrowingResolver instead.
XmlResolver resolver = XmlResolver.ThrowingResolver;

APIs afetadas