Compartir por


Descripción del nivel de protección

La ProtectionLevel propiedad se encuentra en muchas clases diferentes, como las ServiceContractAttribute clases y OperationContractAttribute . La propiedad controla cómo se protege una parte (o completa) de un mensaje. En este tema se explica la característica Windows Communication Foundation (WCF) y cómo funciona.

Para obtener instrucciones sobre cómo establecer el nivel de protección, vea Cómo: Establecer la propiedad ProtectionLevel.

Nota:

Los niveles de protección solo se pueden establecer en el código, no en la configuración.

Aspectos básicos

Para comprender la característica de nivel de protección, se aplican las siguientes instrucciones básicas:

  • Existen tres niveles básicos de protección para cualquier parte de un mensaje. La propiedad (dondequiera que se produzca) está establecida como uno de los valores de la enumeración ProtectionLevel. En orden ascendente de protección, incluyen:

    • None.

    • Sign. La parte protegida está firmada digitalmente. Esto garantiza la detección de cualquier manipulación con la parte del mensaje protegido.

    • EncryptAndSign. La parte del mensaje se cifra para garantizar la confidencialidad antes de que se firme.

  • Solo puede establecer los requisitos de protección para los datos de la aplicación con esta característica. Por ejemplo, los encabezados WS-Addressing son datos de infraestructura y, por lo tanto, no se ven afectados por el ProtectionLevel.

  • Cuando el modo de seguridad se establece en Transport, todo el mensaje está protegido por el mecanismo de transporte. Por lo tanto, establecer un nivel de protección independiente para diferentes partes de un mensaje no tiene ningún efecto.

  • ProtectionLevel es una manera de que el desarrollador establezca el nivel mínimo con el que debe cumplir un enlace. Cuando se implementa un servicio, el enlace real especificado en la configuración puede admitir o no el nivel mínimo. Por ejemplo, de forma predeterminada, la BasicHttpBinding clase no proporciona seguridad (aunque se puede habilitar). Por lo tanto, usarlo con un contrato que tenga cualquier configuración distinta de None provocará que se lance una excepción.

  • Si el servicio requiere que el mínimo ProtectionLevel para todos los mensajes sea Sign, un cliente (quizá creado por una tecnología que no sea WCF) puede cifrar y firmar todos los mensajes (que es más que el mínimo necesario). En este caso, WCF no lanzará una excepción porque el cliente ha hecho más que el mínimo. Sin embargo, tenga en cuenta que las aplicaciones WCF (servicios o clientes) no protegerán excesivamente un elemento de mensaje si es posible, pero cumplirán con el nivel mínimo. Tenga en cuenta también que, cuando se usa Transport como modo de seguridad, el transporte puede sobre proteger la secuencia de mensajes porque es inherentemente incapaz de proteger en un nivel más pormenorizado.

  • Si establece ProtectionLevel como Sign o EncryptAndSign, deberá usar un enlace con la seguridad habilitada o se producirá una excepción.

  • Si selecciona un enlace que habilita la seguridad y no establece la ProtectionLevel propiedad en ningún lugar del contrato, todos los datos de la aplicación se cifrarán y firmarán.

  • Si selecciona un enlace que no tiene habilitada la seguridad (por ejemplo, la BasicHttpBinding clase tiene la seguridad deshabilitada de forma predeterminada) y ProtectionLevel no se establece explícitamente, no se protegerá ninguno de los datos de la aplicación.

  • Si usa un enlace que aplica seguridad en el nivel de transporte, todos los datos de la aplicación se protegerán según las funcionalidades del transporte.

  • Si usa un enlace que aplica seguridad en el nivel de mensaje, los datos de la aplicación se protegerán según los niveles de protección establecidos en el contrato. Si no especifica un nivel de protección, entonces todos los datos de la aplicación en los mensajes se cifrarán y firmarán.

  • Se puede establecer ProtectionLevel en distintos niveles de ámbito. Hay una jerarquía asociada con el alcance, que se explica en la siguiente sección.

Ámbito

Al configurar ProtectionLevel en la API más alta, se establece el nivel de todos los niveles inferiores. ProtectionLevel Si se establece en un valor diferente en un nivel inferior, todas las API por debajo de ese nivel en la jerarquía se restablecerán ahora al nuevo nivel (las API por encima de ella, sin embargo, seguirán afectadas por el nivel superior). La jerarquía es la siguiente. Los atributos en el mismo nivel son del mismo nivel.

Nivel de protección de programación

Para programar el ProtectionLevel en cualquier lugar de la jerarquía, simplemente establezca la propiedad a un valor adecuado al aplicar el atributo. Para obtener ejemplos, vea Cómo: Establecer la propiedad ProtectionLevel.

Nota:

Establecer la propiedad en errores y contratos de mensaje exige conocer cómo funcionan esas características. Para obtener más información, consulte Procedimiento para establecer la propiedad ProtectionLevel y Usar contratos de mensaje.

Dependencia de WS-Addressing

En la mayoría de los casos, el uso de la herramienta de utilidad de metadatos serviceModel (Svcutil.exe) para generar un cliente garantiza que los contratos de cliente y servicio sean idénticos. Sin embargo, los contratos aparentemente idénticos pueden hacer que el cliente produzca una excepción. Esto ocurre cuando una vinculación no admite la especificación WS-Addressing y se especifican varios niveles de protección en el contrato. Por ejemplo, la BasicHttpBinding clase no admite la especificación o si crea un enlace personalizado que no admite WS-Addressing. La ProtectionLevel característica se basa en la especificación WS-Addressing para habilitar distintos niveles de protección en un único contrato. Si el enlace no admite la especificación de WS-Addressing, todos los niveles se establecerán en el mismo nivel de protección. El nivel de protección efectivo para todos los ámbitos del contrato se establecerá en el nivel de protección más seguro utilizado en el contrato.

Esto puede provocar un problema difícil de depurar a primera vista. Es posible crear un contrato de cliente (una interfaz) que incluya métodos para más de un servicio. Es decir, se usa la misma interfaz para crear un cliente que se comunica con muchos servicios y la interfaz única contiene métodos para todos los servicios. El desarrollador debe tener cuidado en este escenario poco frecuente para invocar solo los métodos que son aplicables para cada servicio determinado. Si el enlace es la BasicHttpBinding clase , no se pueden admitir varios niveles de protección. Sin embargo, un servicio que responde al cliente podría responder a un cliente con un nivel de protección inferior al necesario. En este caso, el cliente producirá una excepción porque espera un nivel de protección superior.

Un ejemplo del código ilustra este problema. En el ejemplo siguiente se muestra un servicio y un contrato de cliente. Supongamos que el enlace es el elemento <basicHttpBinding>. Por lo tanto, todas las operaciones de un contrato tienen el mismo nivel de protección. Este nivel de protección uniforme se determina como el nivel de protección máximo en todas las operaciones.

El contrato de servicio es:

[ServiceContract()]
public interface IPurchaseOrder
{
    [OperationContract(ProtectionLevel = ProtectionLevel.Sign)]
    int Price();
}
<ServiceContract()> _
Public Interface IPurchaseOrder
    <OperationContract(ProtectionLevel:=ProtectionLevel.Sign)> _
    Function Price() As Integer
End Interface

El código siguiente muestra la interfaz de contrato de cliente. Tenga en cuenta que incluye un Tax método que está pensado para usarse con un servicio diferente:

[ServiceContract()]
public interface IPurchaseOrder
{
    [OperationContract()]
    int Tax();

    [OperationContract(ProtectionLevel = ProtectionLevel.Sign)]
    int Price();
}
<ServiceContract()> _
Public Interface IPurchaseOrder
    <OperationContract()> _
    Function Tax() As Integer

    <OperationContract(ProtectionLevel:=ProtectionLevel.Sign)> _
    Function Price() As Integer
End Interface

Cuando el cliente llama al Price método , produce una excepción cuando recibe una respuesta del servicio. Esto ocurre porque el cliente no especifica un ProtectionLevel en ServiceContractAttributey, por tanto, el cliente usa el valor predeterminado (EncryptAndSign) para todos los métodos, incluido el Price método . Sin embargo, el servicio devuelve el valor mediante el Sign nivel porque el contrato de servicio define un único método que tiene su nivel de protección establecido en Sign. En este caso, el cliente producirá un error al validar la respuesta del servicio.

Consulte también