Compartilhar via


Melhores práticas de confiança parcial

Este artigo descreve as melhores práticas ao executar o WCF (Windows Communication Foundation) em um ambiente de confiança parcial.

Serialização

Adote as práticas a seguir ao usar o DataContractSerializer em um aplicativo parcialmente confiável.

Todos os tipos serializáveis devem ser marcados explicitamente com o atributo [DataContract]. Não há suporte para as seguintes técnicas em um ambiente de confiança parcial:

  • Marcação de classes a serem serializadas com SerializableAttribute.
  • Implementação da interface ISerializable para permitir que uma classe controle seu processo de serialização.

Usando o DataContractSerializer

  • Todos os tipos marcados com o atributo [DataContract] devem ser públicos. Tipos não públicos não podem ser serializados em um ambiente de confiança parcial.

  • Todos os membros de [DataContract] em um tipo [DataContract] serializável devem ser públicos. Um tipo com [DataMember] não público não pode ser serializado em um ambiente de confiança parcial.

  • Métodos que lidam com eventos de serialização (como OnSerializing, OnSerializede OnDeserializingOnDeserialized) devem ser declarados como públicos. No entanto, há suporte para implementações explícitas e implícitas de OnDeserialization(Object).

  • Os tipos [DataContract] implementados em assemblies marcados com AllowPartiallyTrustedCallersAttribute não devem executar ações relacionadas à segurança no construtor de tipo, pois DataContractSerializer não chama o construtor do objeto recém-instanciado durante a desserialização. Especificamente, as seguintes técnicas comuns de segurança devem ser evitadas nos tipos [DataContract]:

  • Tentativa de restringir o acesso de confiança parcial, tornando o construtor do tipo interno ou privado.

  • Restrição do acesso ao tipo adicionando um [LinkDemand] ao construtor do tipo.

  • Suposição de que, como o objeto foi instanciado com êxito, todas as verificações de validação impostas pelo construtor foram aprovadas.

Usando IXmlSerializable

As melhores práticas a seguir se aplicam aos tipos que implementam IXmlSerializable e são serializados usando DataContractSerializer:

  • As implementações de método estático GetSchema devem ser public.

  • Os métodos de instância que implementam a interface IXmlSerializable devem ser public.

Usando o WCF do código de plataforma totalmente confiável que permite chamadas de chamadores parcialmente confiáveis

O modelo de segurança de confiança parcial do WCF pressupõe que qualquer chamador de um método ou propriedade pública do WCF esteja em execução no contexto de segurança de acesso do código (CAS) do aplicativo de hospedagem. O WCF também pressupõe que exista apenas um contexto de segurança de aplicativo para cada AppDomain e que esse contexto seja estabelecido no momento da criação de AppDomain por um host confiável (por exemplo, por uma chamada para CreateDomain ou pelo Gerenciador de Aplicativos do ASP.NET).

Observação

O CAS (Segurança de Acesso do Código) foi preterido em todas as versões do .NET Framework e do .NET. As versões recentes do .NET não aceitam anotações de CAS e produzem erros caso as APIs relacionadas ao CAS sejam usadas. Os desenvolvedores devem buscar meios alternativos de realizar tarefas de segurança.

Esse modelo de segurança se aplica a aplicativos escritos pelo usuário que não podem afirmar permissões adicionais de CAS, como código de usuário em execução em um aplicativo do ASP.NET de confiança média. No entanto, o código de plataforma totalmente confiável (por exemplo, um assembly de terceiros instalado no cache de assembly global e que aceita chamadas de código parcialmente confiável) deve ter cuidado explícito ao chamar o WCF em nome de um aplicativo parcialmente confiável para evitar a introdução de vulnerabilidades de segurança no aplicativo.

O código de confiança total deve evitar alterar o conjunto de permissões de CAS do thread atual (chamando Assert, PermitOnly ou Deny) antes de chamar APIs do WCF em nome do código parcialmente confiável. Afirmar, negar ou criar um contexto de permissão específico do thread que seja independente do contexto de segurança do aplicativo pode resultar em um comportamento inesperado. Dependendo do aplicativo, esse comportamento pode resultar em vulnerabilidades de segurança no aplicativo.

O código que chama o WCF usando um contexto de permissão específico do thread deve estar preparado para lidar com as seguintes situações:

  • O contexto de segurança específico do thread pode não ser mantido durante a operação, o que resulta em possíveis exceções de segurança.

  • O código interno do WCF e quaisquer retornos de chamada fornecidos pelo usuário podem ser executados em um contexto de segurança diferente do contexto em que a chamada foi iniciada originalmente. Esses contextos incluem:

    • O contexto de permissão do aplicativo.

    • Qualquer contexto de permissão específico do thread criado anteriormente por outros threads de usuário usados para chamar o WCF durante o tempo de vida do AppDomain atualmente em execução.

O WCF garante que o código parcialmente confiável não obtenha permissões de confiança total, a menos que essas permissões sejam declaradas por um componente totalmente confiável, antes de chamar as APIs públicas do WCF. No entanto, isso não garante que os efeitos da declaração de confiança total sejam isolados em um determinado thread, operação ou ação do usuário.

Como melhor prática, evite criar um contexto de permissão específico do thread chamando Assert, PermitOnly ou Deny. Em vez disso, conceda ou negue o privilégio ao próprio aplicativo, para que não haja necessidade de Assert, Deny ou PermitOnly.

Confira também