Descripción de los niveles de protecciónUnderstanding Protection Level

La propiedad ProtectionLevel se encuentra en muchas clases diferentes, como las clases ServiceContractAttribute y OperationContractAttribute.The ProtectionLevel property is found on many different classes, such as the ServiceContractAttribute and the OperationContractAttribute classes. La propiedad controla cómo se protege una parte de un mensaje (o todo entero).The property controls how a part (or whole) of a message is protected. En este tema se explica la característica Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) y cómo funciona.This topic explains the Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) feature and how it works.

Para obtener instrucciones acerca de cómo establecer el nivel de protección, consulte Cómo: establecer la propiedad ProtectionLevel.For instructions on setting the protection level, see How to: Set the ProtectionLevel Property.

Nota

Los niveles de protección solo se pueden establecer en el código, no en la configuración.Protection levels can be set only in code, not in configuration.

FundamentosBasics

Para entender la característica de nivel de protección, se aplican las instrucciones básicas siguientes:To understand the protection level feature, the following basic statements apply:

  • Existen tres niveles básicos de protección para cualquier parte de un mensaje.Three basic levels of protection exist for any part of a message. La propiedad (dondequiera que se produzca) está establecida como uno de los valores de la enumeración ProtectionLevel.The property (wherever it occurs) is set to one of the ProtectionLevel enumeration values. En orden ascendente de protección, incluyen:In ascending order of protection, they include:

    • None.None.

    • Sign.Sign. La parte protegida está firmada digitalmente.The protected part is digitally signed. De esta manera se garantiza la detección de cualquier modificación en la parte protegida del mensaje.This ensures detection of any tampering with the protected message part.

    • EncryptAndSign.EncryptAndSign. La parte del mensaje se cifra para garantizar la confidencialidad antes de firmarse.The message part is encrypted to ensure confidentiality before it is signed.

  • Puede establecer los requisitos de protección para datos de la aplicación con esta característica.You can set protection requirements only for application data with this feature. Por ejemplo, los encabezados de WS-Addressing son los datos de la infraestructura y, por consiguiente, no se verán afectados por ProtectionLevel.For example, WS-Addressing headers are infrastructure data and, therefore, are not affected by the ProtectionLevel.

  • Cuando el modo de seguridad está establecido como Transport, el mecanismo de transporte protege el mensaje completo.When the security mode is set to Transport, the entire message is protected by the transport mechanism. Por consiguiente, establecer un nivel de protección independiente para las distintas partes de un mensaje no tendrá ningún efecto.Therefore, setting a separate protection level for different parts of a message has no effect.

  • El ProtectionLevel es una manera para que el programador establezca el nivel mínimo que debe cumplir un enlace.The ProtectionLevel is a way for the developer to set the minimum level that a binding must comply with. Cuando se implementa un servicio, el enlace real especificado en la configuración puede admitir o no el nivel mínimo.When a service is deployed, the actual binding specified in configuration may or may not support the minimum level. Por ejemplo, de forma predeterminada, la clase BasicHttpBinding no proporciona seguridad (aunque puede estar habilitada).For example, by default, the BasicHttpBinding class does not supply security (although it can be enabled). Por consiguiente, utilizarlo con un contrato que tiene un valor distinto de None producirá una excepción.Therefore, using it with a contract that has any setting other than None will cause an exception to be thrown.

  • Si el servicio requiere que el valor mínimo de ProtectionLevel para todos los mensajes sea Sign, un cliente (quizás creado por una tecnología que no sea de WCFWCF ) puede cifrar y firmar todos los mensajes (que es más que el mínimo requerido).If the service requires that the minimum ProtectionLevel for all messages is Sign, a client (perhaps created by a non-WCFWCF technology) can encrypt and sign all messages (which is more than the minimum required). En este caso, WCFWCF no producirá una excepción porque el cliente ha hecho más que el mínimo.In this case, WCFWCF will not throw an exception because the client has done more than the minimum. Tenga en cuenta, sin embargo, que las aplicaciones WCFWCF (servicios o clientes) no sobreprotegerán una parte del mensaje si es posible, sino que cumplirán con el nivel mínimo.Note, however, that WCFWCF applications (services or clients) will not over-secure a message part if possible but will comply with the minimum level. Además, tenga en cuenta que al utilizar Transport como modo de seguridad, el transporte puede sobreproteger la secuencia de mensajes porque no puede proteger en un nivel más específico.Also note that when using Transport as the security mode, the transport may over-secure the message stream because it is inherently unable to secure at a more granular level.

  • Si establece ProtectionLevel como Sign o EncryptAndSign, deberá usar un enlace con la seguridad habilitada o se producirá una excepción.If you set the ProtectionLevel explicitly to either Sign or EncryptAndSign, then you must use a binding with security enabled or an exception will be thrown.

  • Si selecciona un enlace que habilita la seguridad y no establece la propiedad ProtectionLevel en cualquier parte del contrato, se cifrarán y firmarán todos los datos de la aplicación.If you select a binding that enables security and you do not set the ProtectionLevel property anywhere on the contract, all application data will be encrypted and signed.

  • Si selecciona un enlace que no tiene la seguridad habilitada (por ejemplo, la clase BasicHttpBinding tiene la seguridad deshabilitada de forma predeterminada) y no se establece ProtectionLevel explícitamente, no se protegerá ninguno de los datos de la aplicación.If you select a binding that does not have security enabled (for example, the BasicHttpBinding class has security disabled by default), and the ProtectionLevel is not explicitly set, then none of the application data will be protected.

  • Si está utilizando un enlace que aplica la seguridad en el nivel de transporte, todos los datos de la aplicación se protegerán según las capacidades del transporte.If you are using a binding that applies security at the transport level, all application data will be secured according to the capabilities of the transport.

  • Si utiliza un enlace que aplica la seguridad en el nivel de mensaje, a continuación, los datos de la aplicación se protegerán según los niveles de protección establecidos en el contrato.If you use a binding that applies security at the message level, then application data will be secured according to the protection levels set on the contract. Si no especifica un nivel de protección, a continuación, se cifrarán y firmarán todos los datos de la aplicación en los mensajes.If you do not specify a protection level, then all application data in the messages will be encrypted and signed.

  • Se puede establecer ProtectionLevel en distintos niveles de ámbito.The ProtectionLevel can be set at different scoping levels. Hay una jerarquía asociada con el ámbito, que se explicará en la sección siguiente.There is a hierarchy associated with scoping, which is explained in the next section.

ÁmbitoScoping

Establecer ProtectionLevel en la API de nivel superior define el nivel para todos los niveles debajo de ella.Setting the ProtectionLevel on the topmost API sets the level for all levels below it. Si ProtectionLevel está establecido con un valor diferente en un nivel más bajo, todas las API debajo de ese nivel en la jerarquía se restablecerán ahora en el nuevo nivel (sin embargo, las API por encima de él se seguirán viendo afectadas por el nivel superior).If the ProtectionLevel is set to a different value at a lower level, all APIs below that level in the hierarchy will now be reset to the new level (APIs above it, however, will still be affected by the topmost level). La jerarquía es la siguiente.The hierarchy is as follows. Los atributos en el mismo nivel son del mismo nivel.Attributes at the same level are peers.

ServiceContractAttribute

OperationContractAttribute

FaultContractAttribute

MessageContractAttribute

MessageHeaderAttribute

MessageBodyMemberAttribute

Programación de ProtectionLevelProgramming ProtectionLevel

Para programar ProtectionLevel en cualquier punto de la jerarquía, basta con establecer la propiedad con un valor adecuado cuando se aplique el atributo.To program the ProtectionLevel at any point in the hierarchy, simply set the property to an appropriate value when applying the attribute. Para obtener ejemplos, vea Cómo: establecer la propiedad ProtectionLevel.For examples, see How to: Set the ProtectionLevel Property.

Nota

Establecer la propiedad en errores y contratos de mensaje exige conocer cómo funcionan esas características.Setting the property on faults and message contracts requires understanding how those features work. Para obtener más información, consulteFor more information, seeCómo: establecer la propiedad ProtectionLevel y usar contratos de mensaje. How to: Set the ProtectionLevel Property and Using Message Contracts.

Dependencia de WS-AddressingWS-Addressing Dependency

En la mayoría de los casos, con el la herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) generar un cliente se asegura de que los contratos de servicio y cliente sean idénticos.In most cases, using the ServiceModel Metadata Utility Tool (Svcutil.exe) to generate a client ensures that the client and service contracts are identical. Sin embargo, los contratos aparentemente idénticos pueden hacer que el cliente produzca una excepción.However, seemingly identical contracts can cause the client to throw an exception. Esto ocurre siempre que un enlace no admita la especificación de WS-Addressing y se especifiquen varios niveles de protección en el contrato.This occurs whenever a binding does not support the WS-Addressing specification and multiple levels of protection are specified on the contract. Por ejemplo, la clase BasicHttpBinding no admite la especificación o si crea un enlace personalizado que no admite WS-Addressing.For example, the BasicHttpBinding class does not support the specification, or if you create a custom binding that does not support WS-Addressing. La característica ProtectionLevel confía en la especificación de WS-Addressing para habilitar los niveles de protección diferentes en un contrato único.The ProtectionLevel feature relies on the WS-Addressing specification to enable different protection levels on a single contract. Si el enlace no admite la especificación de WS-Addressing, todos los niveles estarán establecidos en el mismo nivel de protección.If the binding does not support the WS-Addressing specification, all levels will be set to the same protection level. El nivel de protección eficaz para todos los ámbitos del contrato estará establecido en el nivel de protección más alto utilizado en el contrato.The effective protection level for all scopes on the contract will be set to the strongest protection level used on the contract.

Esto puede producir un problema que será difícil depurar a primera vista.This may cause a problem that is hard to debug at first glance. Es posible crear un contrato de cliente (una interfaz) que incluya los métodos para más de un servicio.It is possible to create a client contract (an interface) that includes methods for more than one service. Es decir, la misma interfaz se utiliza para crear un cliente que comunica con muchos servicios y la interfaz contiene los métodos para todos los servicios.That is, the same interface is used to create a client that communicates with many services, and the single interface contains methods for all services. El desarrollador debe tener cuidado en este escenario atípico para invocar solo aquellos métodos que son aplicables para cada servicio determinado.The developer must take care in this rare scenario to invoke only those methods that are applicable for each particular service. Si el enlace es la clase BasicHttpBinding, no se pueden admitir varios niveles de protección.If the binding is the BasicHttpBinding class, multiple protection levels cannot be supported. Sin embargo, un servicio que responde al cliente podría responder a un cliente con un nivel de protección más bajo que el necesario.However, a service replying to the client might respond to a client with a lower protection level than required. En este caso, el cliente producirá una excepción porque espera un nivel más alto.In this case, the client will throw an exception because it expects a higher protection level.

El siguiente ejemplo del código muestra este problema.An example of the code illustrates this problem. El ejemplo siguiente muestra un contrato de servicio y uno de cliente.The following example shows a service and a client contract. Suponga que el enlace es el <basicHttpBinding > elemento.Assume that the binding is the <basicHttpBinding> element. Por consiguiente, todas las operaciones en un contrato tienen el mismo nivel de protección.Therefore, all operations on a contract have the same protection level. Este nivel de protección uniforme se determina como el nivel de protección máximo en todas las operaciones.This uniform protection level is determined as the maximum protection level across all operations.

El contrato de servicios es:The service contract is:

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

En el siguiente ejemplo de código se muestra una interfaz de contrato de cliente.The following code shows the client contract interface. Observe que incluye un método Tax que se utilizará con un servicio diferente:Note that it includes a Tax method that is intended to be used with a different service:

[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 método Price, produce una excepción cuando recibe una respuesta del servicio.When the client calls the Price method, it throws an exception when it receives a reply from the service. Esto se produce porque el cliente no especifica un ProtectionLevel en ServiceContractAttribute y, por consiguiente, el cliente utiliza el valor predeterminado (EncryptAndSign) para todos los métodos, incluido el método Price.This occurs because the client does not specify a ProtectionLevel on the ServiceContractAttribute, and therefore the client uses the default (EncryptAndSign) for all methods, including the Price method. Sin embargo, el servicio devuelve el valor mediante el nivel Sign porque el contrato de servicios define un método único que tiene el nivel de protección definido en Sign.However, the service returns the value using the Sign level because the service contract defines a single method that has its protection level set to Sign. En este caso, se producirá un error en el cliente al validar la respuesta del servicio.In this case, the client will throw an error when validating the response from the service.

Vea tambiénSee Also

ServiceContractAttribute
OperationContractAttribute
FaultContractAttribute
MessageContractAttribute
MessageHeaderAttribute
MessageBodyMemberAttribute
ProtectionLevel
Seguridad de serviciosSecuring Services
Cómo establecerla propiedad ProtectionLevel PropertyHow to: Set the ProtectionLevel Property
Especificación y gestión de errores en contratos y serviciosSpecifying and Handling Faults in Contracts and Services
Uso de contratos de mensajeUsing Message Contracts