Compartir a través de


Programación de la seguridad de WCF

Este tema describe las tareas de programación fundamentales utilizadas para crear una aplicación de Windows Communication Foundation (WCF) segura. Este tema sólo cubre la autenticación, confidencialidad e integridad, conocido colectivamente como seguridad de transferencia. En este tema no se cubre la autorización (el control de acceso a recursos o servicios); para obtener información sobre la autorización, vea Autorización.

Nota

Dispone de una valiosa introducción a los conceptos de seguridad, sobre todo con respecto a WCF en el conjunto de tutoriales sobre patrones y procedimientos de MSDN, en Scenarios, Patterns, and Implementation Guidance for Web Services Enhancements (WSE) 3.0.

La programación de la seguridad de WCF se basa en tres pasos que establecen lo siguiente: el modo de seguridad, un tipo de credencial de cliente y los valores de credenciales. Puede realizar estos pasos mediante código o configuración.

Establecimiento del modo de seguridad

Lo siguiente explica los pasos generales para programar con el modo de seguridad en WCF:

  1. Seleccione uno de los enlaces predefinidos adecuado a sus requisitos de aplicación. Para obtener una lista de opciones de enlaces, vea Enlaces proporcionados por el sistema. De forma predeterminada, prácticamente todos los enlaces tienen la seguridad habilitada. La única excepción es la clase BasicHttpBinding (utilizando configuración, el basicHttpBinding Element).
    El enlace que seleccione determina el transporte. Por ejemplo, WSHttpBinding utiliza HTTP como el transporte; NetTcpBinding utiliza TCP.
  2. Seleccione uno de los modos de seguridad para el enlace. Tenga en cuenta que el enlace que seleccione determinará las opciones de modo disponibles. Por ejemplo, WSDualHttpBinding no permite la seguridad de transporte (no es una opción). De igual forma, ni MsmqIntegrationBinding ni NetNamedPipeBinding permiten el modo de seguridad.
    Dispone de tres opciones:
    1. Transport
      La seguridad de transporte depende del mecanismo que utilice el enlace que ha seleccionado. Por ejemplo, si utiliza WSHttpBinding, el mecanismo de seguridad es Secure Sockets Layer (SSL) (también es el mecanismo para el protocolo HTTPS). Generalmente hablando, la principal ventaja de la seguridad de transporte es que proporciona un buen rendimiento independientemente del transporte que esté utilizando. No obstante, tiene dos limitaciones: la primera es que el mecanismo de transporte dicta el tipo de credencial utilizado para autenticar a un usuario. Ésta es una desventaja sólo si un servicio necesita interoperar con otros servicios que exigen tipos diferentes de credenciales. La segunda es que, puesto que la seguridad no se aplica en el nivel de mensaje, la seguridad se implementa salto por salto en lugar de de extremo a extremo. Esta última limitación sólo es un problema si la ruta de acceso del mensaje entre el cliente y el servicio incluye intermediarios. Para obtener más información acerca de qué transporte utilizar, vea Elección del transporte. Para obtener más información acerca de uso de seguridad de transporte, vea Información general de la seguridad del transporte.
    2. Message
      El modo de seguridad significa que cada mensaje incluye los encabezados y datos necesarios para mantener el mensaje protegido. Dado que la composición de los encabezados varía, puede incluir cualquier número de credenciales. Este es un factor a tener en cuenta si está interoperando con otros servicios que exigen un tipo de credencial concreto que un mecanismo de transporte no puede proporcionar o si el mensaje se debe utilizar con más de un servicio, donde cada servicio exige un tipo de credencial diferente.
      Para obtener más información, consulte Seguridad de los mensajes en WCF.
    3. TransportWithMessageCredential
      Esta opción utiliza el nivel de transporte para proteger la transferencia del mensaje, mientras que cada mensaje incluye las credenciales enriquecidas que otros servicios necesitan. Esto combina la ventaja de rendimiento de la seguridad de transporte con la ventaja de las credenciales enriquecidas de la seguridad de mensaje. Esto está disponible con los siguientes enlaces: BasicHttpBinding, WSFederationHttpBinding, NetPeerTcpBinding y WSHttpBinding.
  3. Si decide utilizar la seguridad de transporte para HTTP (en otras palabras, HTTPS), debe configurar también el host con un certificado SSL y habilitar SSL en un puerto. Para obtener más información, consulte Seguridad de transporte HTTP.
  4. Si está utilizando el WSHttpBinding y no necesita establecer una sesión segura, establezca la propiedad EstablishSecurityContext en false.
    Una sesión segura se produce cuando un cliente y servicio crean un canal mediante una clave simétrica (tanto el cliente como el servidor usan la misma clave durante la duración de una conversación, hasta que se cierre el diálogo).

Establecimiento del tipo de credencial de cliente

Seleccione según corresponda un tipo de credencial de cliente. Para obtener más información, consulte Selección de tipos de credenciales. Los siguientes tipos de credencial de cliente están disponibles:

  • Windows
  • Certificate
  • Digest
  • Basic
  • UserName
  • NTLM
  • IssuedToken

Dependiendo de cómo establezca el modo, deberá establecer el tipo de credencial. Por ejemplo, si ha seleccionado el wsHttpBinding, y ha establecido el modo en "Mensaje", también puede establecer el atributo clientCredentialType del elemento Message en uno de los valores siguientes: None, Windows, UserName, Certificate y IssuedToken, como se muestra en el ejemplo de configuración siguiente.

<system.serviceModel>
<bindings>
  <wsHttpBinding>
    <binding name="myBinding">
      <security mode="Message"/>
      <message clientCredentialType="Windows"/>
    </binding>
</bindings>
</system.serviceModel>

O bien, en el código:

Establecimiento de valores de credenciales de servicio

Cuando selecciona un tipo de credencial de cliente, debe establecer las credenciales reales que el servicio y el cliente han de utilizar. En el servicio, las credenciales se establecen utilizando la clase ServiceCredentials y se devuelven mediante la propiedad Credentials de la clase ServiceHostBase. El enlace en uso implica el tipo de credencial de servicio, el modo de seguridad elegido y el tipo de la credencial de cliente. El código siguiente establece un certificado para una credencial de servicio.

Establecimiento de los valores de credencial de cliente

En el cliente, establezca valores de credencial de cliente mediante la clase ClientCredentials y devueltos por la propiedad ClientCredentials de la clase ClientBase. El código siguiente establece un certificado como una credencial en un cliente utilizando el protocolo TCP.

Consulte también

Otros recursos

Programación básica de WCF
Escenarios de seguridad comunes