Procedimientos recomendados de confianza parcial
En este artículo se describen los procedimientos recomendados al ejecutar Windows Communication Foundation (WCF) en un entorno de confianza parcial.
Serialización
Aplique estos procedimientos al utilizar DataContractSerializer en una aplicación de confianza parcial.
Se ha de marcar a todos los tipos serializables mediante el atributo [DataContract]
. Las siguientes técnicas no se admiten en un entorno de confianza parcial:
- Marcado de clases que se van a serializar con el SerializableAttribute.
- Implementación de la interfaz ISerializable para permitir que una clase controle su proceso de serialización.
Uso de DataContractSerializer
Todos los tipos marcados con el atributo
[DataContract]
deben ser públicos. Los tipos no públicos no se pueden serializar en un entorno de confianza parcial.Todos los miembros de
[DataContract]
de un tipo de[DataContract]
serializable deben ser públicos. Un tipo con un[DataMember]
no público no se puede serializar en un entorno de confianza parcial.Los métodos que administran eventos de serialización (como
OnSerializing
,OnSerialized
,OnDeserializing
yOnDeserialized
) se deben declarar como públicos. Sin embargo, se admiten las implementaciones explícitas e implícitas de OnDeserialization(Object).Los tipos
[DataContract]
implementados en ensamblados marcados con el AllowPartiallyTrustedCallersAttribute no deben realizar acciones relacionadas con la seguridad en el constructor de tipos, puesto que el DataContractSerializer no llama durante la deserialización al constructor del objeto del que se ha creado recientemente una instancia. Particularmente, se han de evitar las siguientes técnicas de seguridad comunes en los tipos de[DataContract]
:Intentar restringir el acceso de confianza parcial haciendo interno o privado el constructor del tipo.
Restringir el acceso al tipo agregando una
[LinkDemand]
al constructor del tipo.Suponer que, como se ha creado una instancia del objeto correctamente, todas las comprobaciones de validación requeridas por el constructor se han superado con éxito.
Utilizar IXmlSerializable
Los siguientes procedimientos recomendados se aplican a tipos que implementan IXmlSerializable y se serializan mediante DataContractSerializer.
Las implementaciones del método estático GetSchema deben ser
public
.Los métodos de instancia que implementan la interfaz IXmlSerializable deben ser
public
.
Utilizar WCF a partir de código de la plataforma de plena confianza que permite llamadas desde llamadores de confianza parcial
El modelo de seguridad de confianza parcial de WCF supone que cualquier autor de llama de un método o una propiedad pública de WCF se ejecuta en el contexto de seguridad de acceso del código (CAS) de la aplicación de hospedaje. WCF también supone que solo existe un contexto de seguridad de la aplicación para cada AppDomain y que este contexto lo establece en la hora de creación de AppDomain un host de confianza (por ejemplo, mediante una llamada a CreateDomain o por parte del Administrador de aplicaciones de ASP.NET).
Nota
La seguridad de acceso del código (CAS) ha quedado en desuso en todas las versiones de .NET Framework y .NET. Las versiones recientes de .NET no respetan las anotaciones de CAS y generan errores si se usan API relacionadas con CAS. Los desarrolladores deben buscar medios alternativos para realizar tareas de seguridad.
Este modelo de seguridad se aplica a las aplicaciones escritas por usuarios que no pueden validar permisos CAS adicionales, como, por ejemplo, el código de usuario que se ejecuta en una aplicación ASP.NET de nivel de confianza medio. Sin embargo, el código de plataforma de plena confianza (por ejemplo, un ensamblado de otro fabricante que se instala en la caché global de ensamblados y acepta llamadas de código de confianza parcial) debe tener un cuidado explícito al realizar llamadas en WCF en nombre de una aplicación de confianza parcial, para evitar introducir vulnerabilidades de seguridad en el nivel de aplicación.
El código de plena confianza debería evitar modificar el conjunto de permisos CAS del subproceso actual (llamando al método Assert, PermitOnly o Deny) antes de llamar a la API de WCF en nombre de código de confianza parcial. Validar, denegar o crear un contexto de permiso para subprocesos que sea independiente del contexto de seguridad de aplicaciones puede provocar un comportamiento inesperado. En función de la aplicación, este comportamiento puede producir vulnerabilidades de seguridad en aplicaciones.
El código que llama en WCF utilizando un contexto de permiso para subprocesos debe estar preparado para afrontar las siguientes situaciones que se podrían presentar:
El contexto de seguridad específico para subprocesos no se puede mantener durante toda la operación, lo que produce excepciones de seguridad potenciales.
El código de WCF interno junto con cualquier devolución de llamada proporcionada por el usuario pueden ejecutarse en un contexto de seguridad diferente que aquel bajo el que se inició la llamada originariamente. Entre estos contextos se incluyen:
El contexto del permiso de aplicación.
Cualquier contexto de permiso para subprocesos creado previamente por otros subprocesos de usuarios utilizados para llamar en WCF mientras dure el AppDomain que se está ejecutando actualmente.
WCF garantiza que el código de confianza parcial no puede obtener permisos de plena confianza a menos que un componente de plena confianza valide tales permisos antes de llamar en las API públicas de WCF. Sin embargo, no garantiza que los efectos de validar la plena confianza se aíslen a un determinado subproceso, operación o acción del usuario.
A modo de procedimiento recomendado, evite crear un contexto de permiso para subprocesos llamando al método Assert, PermitOnly o Deny. En su lugar, conceda o deniegue el privilegio a la propia aplicación, para que no se requiera Assert, Deny o PermitOnly.