Creación de Credenciales para Servicios WCF

La implementación de servicios de comunicación eficientes y escalables en el entorno tecnológico actual presenta desafíos crecientes. Windows Communication Foundation (WCF) y Windows Workflow Foundation (WF) han introducido mejoras significativas para abordar la complejidad inherente a la comunicación entre servicios. Este documento explora cómo crear y gestionar credenciales para servicios WCF, garantizando la seguridad y la correcta autenticación de los clientes.

Fundamentos de la Seguridad en WCF

La seguridad de un servicio WCF se compone principalmente de dos requisitos: la seguridad de transferencia y la autorización. La seguridad de transferencia abarca la autenticación (verificación de la identidad del cliente y del servicio), la confidencialidad (cifrado de mensajes) y la integridad (firma digital para prevenir alteraciones). La autorización, por otro lado, controla el acceso a los recursos, permitiendo que solo usuarios autorizados accedan a ellos.

Con la excepción de la clase BasicHttpBinding, la seguridad de transferencia está habilitada por defecto para todos los enlaces predefinidos en WCF. La seguridad se fundamenta en las credenciales, que son pruebas que demuestran la identidad de una entidad (una persona, un proceso o una organización).

Mecanismos de Autenticación y Autorización

En un dominio de Windows, la autenticación se gestiona a través de la infraestructura de Windows, a menudo mediante el controlador Kerberos, que utiliza un esquema basado en la concesión de tickets. Para entornos fuera de un dominio de Windows, como grupos de trabajo, se puede emplear el mecanismo NTLM, aunque es menos seguro.

La autorización en sistemas Windows se implementa asignando usuarios a roles y grupos. Por ejemplo, existen roles como "administrador" y "usuario", cada uno con diferentes niveles de permisos. Las carpetas y archivos también pueden protegerse mediante listas de control de acceso (ACL), que definen quién puede acceder a ellos y qué operaciones puede realizar.

Diagrama de flujo de autenticación Kerberos en un dominio de Windows.

Gestión de Credenciales en WCF

WCF permite que un servicio especifique cómo se autentica un cliente. Para ello, es necesario recuperar los metadatos del punto de conexión del servicio. Estos metadatos suelen incluir el código del cliente en el lenguaje de programación deseado (por defecto, Visual C#) y un archivo de configuración XML.

Recuperación de Metadatos y Configuración del Cliente

Una forma común de obtener estos metadatos es utilizando la herramienta Svcutil.exe. Esta herramienta genera el código del cliente y la configuración necesaria. Una vez obtenido el archivo de configuración XML, se debe examinar el elemento secundario que coincide con el valor del modo de seguridad para identificar el atributo clientCredentialType.

Configuración de Credenciales en Código

En la clase cliente, la propiedad ClientCredentials de la clase ClientBase<TChannel> se configura con un valor adecuado. Esto puede implicar el uso de enumeraciones de la clase X509FindType, especialmente cuando se trabaja con certificados X.509. Es recomendable utilizar el nombre del firmante para permitir cambios futuros en el certificado, como la expiración.

Configuración de Credenciales en Archivo XML

Al configurar el cliente mediante un archivo XML, se añade un elemento <clientCredentials> dentro del elemento <behaviors>. Se configuran atributos como storeLocation, storeName, x509FindType y findValue. Además, se especifica el comportamiento en el elemento <endpoint> mediante el atributo behaviorConfiguration, y se define la configuración de enlace con el atributo bindingConfiguration.

<client> <endpoint address="http://example.com/myservice" binding="wsHttpBinding" behaviorConfiguration="MyClientBehavior" bindingConfiguration="MyBinding" /></client><behaviors> <endpointBehaviors> <behavior name="MyClientBehavior"> <clientCredentials> <clientCertificate storeLocation="CurrentUser" storeName="My" x509FindType="FindBySubjectName" findValue="MyServiceCertificate" /> </clientCredentials> </behavior> </endpointBehaviors></behaviors>

Modos de Seguridad en WCF

La programación de la seguridad en WCF implica la elección de un modo de seguridad, que determina cómo se protegen los mensajes. Cada modo presenta sus propias ventajas y desventajas:

  • Modo de Transporte: La seguridad se integra a un nivel inferior, aprovechando los mecanismos de seguridad del protocolo de transporte subyacente (como SSL/TLS para HTTP). Es más eficiente ya que la seguridad se aplica una vez a nivel de transporte.
  • Modo de Mensaje: La seguridad se aplica incluyendo datos de seguridad (credenciales, cifrado, firmas) como parte de cada mensaje SOAP. Esto proporciona mayor flexibilidad, ya que el transporte no dicta los requisitos de seguridad, pero puede afectar el rendimiento debido al procesamiento de cada mensaje individualmente.
  • Modo de Mensaje y Transporte Combinado: Utiliza la seguridad de transporte para la confidencialidad e integridad de los mensajes, y al mismo tiempo incluye datos de credenciales en cada mensaje para la autenticación.
Ilustración comparativa de los modos de seguridad de transporte y mensaje en WCF.

Tipos de Credenciales de Cliente

Tras seleccionar un modo de seguridad, es necesario especificar el tipo de credencial del cliente. Las opciones comunes incluyen:

  • None: El cliente no necesita presentar credenciales.
  • Basic: Autenticación básica (nombre de usuario y contraseña).
  • Digest: Autenticación implícita.
  • Ntlm: Autenticación NTLM (utilizada cuando Kerberos no es aplicable).
  • Windows: Autenticación de Windows, donde el usuario debe proporcionar un nombre de usuario y una contraseña.
  • UserName: Permite al servicio requerir que el cliente se autentique con un nombre de usuario. No realiza operaciones criptográficas.
  • Custom: Un tipo de token configurado según una directiva de seguridad, como SAML (Security Assertion Markup Language).

La tabla siguiente resume los tipos de credenciales de cliente disponibles para la seguridad en modo de transporte:

Tipo de Credencial Descripción
None No se requieren credenciales.
Basic Autenticación básica.
Digest Autenticación implícita.
Ntlm Autenticación NTLM.
Windows Autenticación de Windows.

Para la seguridad en modo de mensaje, los tipos de credenciales de cliente son:

Tipo de Credencial Descripción
None No se requieren credenciales.
UserName Autenticación con nombre de usuario.
IssuedToken Token personalizado (por defecto SAML) emitido por un servicio de token seguro.

Identidad del Servicio y Autenticación del Cliente

En WCF, el concepto de identidad difiere entre el servicio y el cliente. Para el servicio, la identidad se asigna al contexto de seguridad después de la autenticación, y se puede acceder a través de las propiedades WindowsIdentity y PrimaryIdentity de la clase ServiceSecurityContext. Para el cliente, la identidad se utiliza para validar el servicio. En tiempo de diseño, el desarrollador cliente puede configurar el elemento <identity> con un valor obtenido del servicio (como un UPN o SPN). En tiempo de ejecución, el cliente verifica que este valor coincida con la identidad real del servicio; de lo contrario, la comunicación se interrumpe.

Diagrama que ilustra la identidad del servicio y la validación de la identidad del cliente.

Configuración Avanzada y Personalización de la Seguridad

WCF ofrece la posibilidad de configurar enlaces y comportamientos de seguridad de manera avanzada, incluyendo el uso de certificados X.509 para la autenticación. La clase ServiceCredentials y ClientCredentials son los puntos de entrada principales para la personalización de la seguridad.

Uso de Certificados X.509

Cuando se trabaja con certificados X.509, es crucial configurar correctamente los almacenes de certificados y los criterios de búsqueda. Esto se realiza mediante atributos como storeLocation, storeName, x509FindType y findValue.

Negociación de Credenciales

La negociación es el proceso iterativo entre cliente y servicio para establecer confianza mediante el intercambio de credenciales. Por defecto, los enlaces proporcionados por el sistema en WCF negocian automáticamente la credencial del servicio, excepto en el caso de BasicHttpBinding. Si se deshabilita la negociación automática, las credenciales del servicio deben ser aprovisionadas en el cliente de forma externa (fuera de banda).

Personalización de Credenciales

Para escenarios de seguridad más complejos, es posible crear credenciales personalizadas. Esto implica extender las clases ClientCredentials y ServiceCredentials, crear un administrador de tokens de seguridad personalizado y, opcionalmente, un proveedor de tokens de seguridad y un autenticador personalizado. Estas personalizaciones permiten definir nuevos tipos de credenciales y controlar su serialización y autenticación.

La creación de un controlador de configuración personalizado permite integrar estas credenciales personalizadas en el archivo de configuración de la aplicación, utilizando un elemento de credenciales personalizado en lugar del elemento <clientCredentials> estándar.

Propiedad ProtectionLevel

La propiedad ProtectionLevel, presente en atributos como ServiceContractAttribute y OperationContractAttribute, especifica si los mensajes deben ser firmados, cifrados, o ambos, o enviados sin protección. Esto permite definir el nivel de seguridad granularmente para operaciones específicas.

Credenciales Auxiliares y Tokens de Aprobación

En algunos casos, un servicio puede requerir más de una credencial, como un nombre de usuario y contraseña, además de una credencial que demuestre una característica adicional (por ejemplo, ser mayor de 18 años). Estas se conocen como credenciales auxiliares y producen tokens de apoyo que se transmiten en el mensaje. La creación de servicios que utilizan tokens auxiliares generalmente requiere un <customBinding>.

tags: #como #crear #la #credencial #de #deteccion