Práticas recomendadas de confiança parcial
Este artigo descreve as práticas recomendadas ao executar o Windows Communication Foundation (WCF) em um ambiente de confiança parcial.
Serialização
Aplique essas práticas ao usar o DataContractSerializer em um aplicativo parcialmente confiável.
Todos os tipos serializáveis devem ser explicitamente marcados com o [DataContract]
atributo. As seguintes técnicas não são suportadas em um ambiente de confiança parcial:
- Marcando classes a serem serializadas com o SerializableAttribute.
- Implementando a ISerializable interface para permitir que uma classe controle seu processo de serialização.
Usando DataContractSerializer
Todos os tipos marcados com o
[DataContract]
atributo devem ser públicos. Tipos não públicos não podem ser serializados em um ambiente de confiança parcial.Todos os
[DataContract]
membros em um tipo serializável[DataContract]
devem ser públicos. Um tipo com um não-público[DataMember]
não pode ser serializado em um ambiente de confiança parcial.Os métodos que manipulam eventos de serialização (como
OnSerializing
,OnSerialized
,OnDeserializing
eOnDeserialized
) devem ser declarados como públicos. No entanto, ambas as implementações explícitas e implícitas de são suportadas OnDeserialization(Object) .[DataContract]
tipos implementados em assemblies marcados com o AllowPartiallyTrustedCallersAttribute não devem executar ações relacionadas à segurança no construtor type, como o DataContractSerializer não chama o construtor do objeto recém-instanciado durante a desserialização. Especificamente, as seguintes técnicas de segurança comuns devem ser evitadas para[DataContract]
os tipos:Tentando restringir o acesso de confiança parcial tornando o construtor do tipo interno ou privado.
Restringindo o acesso ao tipo adicionando a
[LinkDemand]
ao construtor do tipo.Supondo que, como o objeto foi instanciado com êxito, todas as verificações de validação impostas pelo construtor passaram com êxito.
Usando IXmlSerializable
As seguintes práticas recomendadas se aplicam a tipos que implementam IXmlSerializable e são serializados usando o DataContractSerializer:
As GetSchema implementações do método estático devem ser
public
.Os métodos de instância que implementam a IXmlSerializable interface devem ser
public
.
Usando WCF de 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 sendo executado no contexto CAS (segurança de acesso ao código) do aplicativo de hospedagem. O WCF também pressupõe que existe apenas um contexto de segurança de aplicativo para cada AppDomaine que esse contexto é estabelecido no momento da AppDomain criação por um host confiável (por exemplo, por uma chamada para CreateDomain ou pelo ASP.NET Application Manager).
Nota
O CAS (Code Access Security) foi preterido em todas as versões do .NET Framework e do .NET. As versões recentes do .NET não respeitam as anotações do CAS e produzem erros se as APIs relacionadas ao CAS forem usadas. Os desenvolvedores devem procurar 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 reivindicar permissões CAS adicionais, como código de usuário em execução em um aplicativo de 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 aceita chamadas de código parcialmente confiável) deve ter cuidado explícito ao chamar para o WCF em nome de um aplicativo parcialmente confiável para evitar a introdução de vulnerabilidades de segurança no nível do aplicativo.
O código de confiança total deve evitar alterar o conjunto de permissões CAS do thread atual (chamando Assert, PermitOnlyou Deny) antes de chamar APIs WCF em nome de código parcialmente confiável. Afirmar, negar ou criar de outra forma um contexto de permissão específico do thread que seja independente do contexto de segurança no nível do aplicativo pode resultar em um comportamento inesperado. Dependendo do aplicativo, esse comportamento pode resultar em vulnerabilidades de segurança no nível do aplicativo.
O código que chama o WCF usando um contexto de permissão específico do thread deve ser preparado para lidar com as seguintes situações que podem surgir:
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 daquele sob o qual a chamada foi originalmente iniciada. Estes contextos incluem:
O contexto de permissão do aplicativo.
Qualquer contexto de permissão específico de thread criado anteriormente por outros threads de usuário usado para chamar o WCF durante o tempo de vida do AppDomain.
O WCF garante que o código parcialmente confiável não pode obter permissões de confiança total, a menos que essas permissões sejam afirmadas por um componente totalmente confiável antes de chamar APIs públicas do WCF. No entanto, ele não garante que os efeitos da afirmação de confiança total sejam isolados para um thread, operação ou ação do usuário em particular.
Como prática recomendada, evite criar contexto de permissão específico do thread chamando Assert, PermitOnlyou Deny. Em vez disso, conceda ou negue o privilégio ao próprio aplicativo, de modo que nenhum Assert, Denyou PermitOnly seja necessário.