WCF - Seguridad
Un servicio WCF se jacta de un sistema de seguridad robusto con dos modos o niveles de seguridad para que solo un cliente previsto pueda acceder a los servicios. Las amenazas de seguridad que son comunes en una transacción distribuida son moderadas en gran medida por WCF.
Funciones de seguridad clave
El servicio WCF tiene cuatro características de seguridad clave, como se muestra en la figura siguiente.
Authentication - Aquí, la autenticación no se limita a identificar al remitente del mensaje, sino que es mutua, es decir, se requiere la autenticación del receptor del mensaje para descartar la posibilidad de cualquier tipo de ataque de intermediarios.
Authorization- Este es el siguiente paso que da un servicio WCF para garantizar la seguridad y aquí se determina si el servicio debe autorizar a la persona que llama a continuar o no. Aunque la autorización no depende de la autenticación, normalmente sigue a la autenticación.
Confidentiality- El intercambio de información entre una persona que llama y un servicio se mantiene confidencial para restringir su interpretación por parte de otras personas para quienes el mensaje no está destinado. Para que esto sea posible, se utiliza el cifrado junto con una amplia variedad de otros mecanismos.
Integrity - El concepto clave final es mantener la integridad, es decir, ofrecer la seguridad de que el mensaje no ha sido manipulado por nadie en su recorrido desde el remitente hasta el receptor.
Modo de seguridad de transferencia
WCF ofrece los siguientes modos de seguridad de transferencia para garantizar una comunicación segura entre un cliente y un servidor. Los diversos modos de seguridad de transferencia se mencionan a continuación.
None- Este modo no garantiza ningún tipo de seguridad en los mensajes y el servicio no obtiene ninguna credencial sobre el cliente. Este modo es muy arriesgado, ya que puede permitir la manipulación de mensajes y, por lo tanto, no se recomienda.
<wsHttpBinding>
<binding name = "WCFSecurityExample">
<security mode = "None"/>
</binding>
</wsHttpBinding>
Transport- Este modo es la forma más sencilla de lograr una transferencia segura de mensajes mediante el uso de protocolos de comunicación como TCP, IPC, Https y MSMQ. Este modo es más eficaz cuando la transferencia es de punto a punto y se utiliza principalmente en un entorno controlado, es decir, aplicaciones de intranet.
<wsHttpBinding>
<binding name = "WCFSecurityExample">
<security mode = "Transport"/>
</binding>
</wsHttpBinding>
Message- El modo de seguridad permite la autenticación mutua y ofrece privacidad en gran medida ya que los mensajes están encriptados y pueden ser transportados a través de http, que no se considera un protocolo seguro. Aquí, la seguridad se proporciona de un extremo a otro sin considerar cuántos intermediarios están involucrados en una transferencia de mensajes y si hay un transporte seguro o no. El modo lo utilizan normalmente las aplicaciones de Internet.
<wsHttpBinding>
<binding name = "WCFSecurityExample">
<security mode = "Message"/>
</binding>
</wsHttpBinding>
Mixed - Este modo de seguridad no se usa con frecuencia y la autenticación de cliente se ofrece solo a nivel de cliente.
<wsHttpBinding>
<binding name = "WCFSecurityExample">
<security mode = "TransportWithMessageCredential"/>
</binding>
</wsHttpBinding>
Both- Este modo de seguridad comprende tanto la seguridad del transporte como la seguridad de los mensajes para ofrecer una cobertura de seguridad sólida, pero a menudo resulta en una sobrecarga del rendimiento general. Este solo es compatible con MSMQ.
<netMsmqBinding>
<binding name = "WCFSecurityExample">
<security mode = "Both"/>
</binding>
</netMsmqBinding>
Todos los enlaces WCF, excepto BasicHttpBinding, tienen cierto grado de seguridad de transferencia de forma predeterminada.
Nivel de seguridad de mensajes
La seguridad a nivel de mensaje no depende de los protocolos WCF. Se emplea con los datos de los mensajes en sí mismos cifrando los datos mediante un algoritmo estándar. Hay varias credenciales de cliente disponibles para diferentes enlaces para el nivel de seguridad de los mensajes, que se describen a continuación.
Client credentials for message level security in WCF
None- Aquí, el cifrado se utiliza para proteger el mensaje, mientras que no se realiza la autenticación del cliente, lo que significa que un cliente anónimo puede acceder al servicio. A excepción de BasicHttpBinding, todos los enlaces WCF admiten esta credencial de cliente. Sin embargo, debe tenerse en cuenta que para NetNamedPipeBinding, esta credencial de cliente no está disponible en absoluto.
Windows- Aquí, tanto el cifrado de mensajes como la autenticación del cliente tienen lugar para un usuario que ha iniciado sesión en tiempo real. También en este caso, a diferencia de todos los demás enlaces WCF, NetNamedPipeBinding no está disponible y BasicHttpBinding no ofrece su apoyo.
UserName- Aquí, los mensajes se cifran y se protegen al ofrecer un nombre de usuario, y los clientes se autentican cuando necesitan ofrecer una contraseña. BasicHttpBinding, al igual que las dos credenciales de cliente anteriores, no admite UserName y no está disponible para NetNamedPipeBinding.
Certificate- Junto con el cifrado de mensajes, tanto el cliente como el servicio obtienen una autenticación con certificado. Esta credencial de cliente está disponible y es compatible con todos los enlaces WCF excepto NetNamedPipeBinding.
IssuedToken- Los tokens emitidos por una autoridad como Cardspace se utilizan para autenticar los mensajes. El cifrado de mensajes también se realiza aquí.
El siguiente código muestra cómo se configuran las credenciales de cliente en el nivel / modo de seguridad de mensajes WCF.
<netTcpBinding>
<binding name = "WCFMessageSecurityExample">
<security mode = "Message">
<message clientCredentialType = "None"/>
</security>
</binding>
</netTcpBinding>
<netMsmqBinding>...</netMsmqBinding>
</bindings>
<behaviors>...</behaviors>
Aquí, debe tenerse en cuenta que el modo de seguridad de transporte tiene una ventaja sobre el nivel de seguridad del mensaje, ya que el primero es más rápido. No requiere ninguna codificación adicional y ofrece compatibilidad con la interoperabilidad, por lo que no reduce el rendimiento general.
Sin embargo, desde el punto de vista de la seguridad, el modo de seguridad de mensajes es más robusto e independiente de los protocolos y ofrece seguridad de extremo a extremo.