Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Este tema muestra cómo crear un token de seguridad personalizado mediante la clase SecurityToken y cómo integrarlo en un autenticador y en un proveedor de token de seguridad personalizado.
Un token de seguridad es esencialmente un elemento XML que utiliza el marco de seguridad de Windows Communication Foundation (WCF) para representar demandas sobre un remitente dentro del mensaje SOAP. La seguridad de WCF proporciona varios tokens para los modos de autenticación proporcionados por sistema. En los ejemplos se incluye un token de seguridad de certificado X.509 representado por la clase X509SecurityToken o un token de seguridad Username representado por la clase UserNameSecurityToken.
A veces los tipos proporcionados no admiten un modo de autenticación o credencial. En ese caso, es necesario para crear un token de seguridad personalizado para proporcionar una representación XML de la credencial personalizada dentro del mensaje SOAP.
Los siguientes procedimientos muestran cómo crear un token de seguridad personalizado y cómo integrarlo en la infraestructura de seguridad de WCF. En este tema se crea un token de tarjeta de crédito que se utiliza para pasar información sobre la tarjeta de crédito del cliente al servidor.
Para obtener más información acerca de las credenciales personalizadas y el administrador de tokens de seguridad, vea Cómo: Crear credenciales de cliente y servicio personalizadas.
Vea el espacio de nombres System.IdentityModel.Tokens para obtener más clases que representen tokens de seguridad.
Para obtener más información acerca de las credenciales, el administrador de tokens de seguridad y las clases de proveedor y de autenticador, vea Arquitectura de seguridad.
Procedimientos
Es necesario proporcionar a una aplicación cliente una manera de especificar información de la tarjeta de crédito para la infraestructura de seguridad. Una clase de credenciales de cliente personalizada pone esta información a disposición de la aplicación. El primer paso es crear una clase para que represente la información de la tarjeta de crédito para las credenciales de cliente personalizadas.
Para crear una clase que represente información de la tarjeta de crédito dentro de las credenciales de cliente
Defina una nueva clase que represente la información de la tarjeta de crédito para la aplicación. En el siguiente ejemplo se nombra la clase
CreditCardInfo.Agregue las propiedades adecuadas a la clase para permitir que una aplicación establezca la información necesaria para el token personalizado. En este ejemplo, la clase tiene tres propiedades:
CardNumber,CardIssueryExpirationDate.
A continuación, se ha de crear una clase que represente el token de seguridad personalizado. El proveedor de tokens de seguridad, el autenticador y las clases del serializador usan esta clase para pasar información sobre el token de seguridad a y desde la infraestructura de seguridad de WCF.
Para crear una clase de token de seguridad personalizada
Defina una clase nueva derivada de la clase SecurityToken. En este ejemplo se crea una clase denominada
CreditCardToken.Invalide la propiedad Id. Esta propiedad se utiliza para obtener el identificador local del token de seguridad que se utiliza para señalar a la representación XML del token de seguridad desde otros elementos dentro del mensaje SOAP. En este ejemplo, se le puede pasar un identificador de token como parámetro de constructor o se puede generar uno nuevo aleatorio cada vez que se cree una instancia de token de seguridad.
Implemente la propiedad SecurityKeys. Esta propiedad devuelve una colección de claves de seguridad que representa la instancia del token de seguridad. WCF puede utilizar este tipo de claves para firmar o cifrar partes del mensaje SOAP. En este ejemplo, el token de seguridad de la tarjeta de crédito no puede contener ninguna clave de seguridad; por consiguiente, la implementación siempre devuelve una colección vacía.
Invalide las propiedades ValidFrom y ValidTo. WCF utiliza estas propiedades para determinar la validez de la instancia del token de seguridad. En este ejemplo, el token de seguridad de la tarjeta de crédito sólo tiene una fecha de expiración, por lo que la propiedad
ValidFromdevuelve DateTime que representa la fecha y hora de creación de la instancia.
Cuando se crea un nuevo tipo de token de seguridad, requiere una implementación de la clase SecurityTokenParameters. La implementación se utiliza en la configuración del elemento de enlace de seguridad para representar el nuevo tipo de token. La clase de los parámetros de token de seguridad sirve como plantilla que se emplea para igualar a la instancia del token de seguridad real cuando se procesa un mensaje. La plantilla proporciona propiedades adicionales que una aplicación puede utilizar para especificar los criterios a los que debe ajustarse el token de seguridad para que pueda usarse o autenticarse. En el siguiente ejemplo no se agrega ninguna propiedad, de modo que sólo se busca la coincidencia del tipo de token de seguridad cuando la infraestructura de WCF busca una instancia del token de seguridad que debe utilizar o validar.
Para crear una clase de parámetros de token de seguridad personalizada
Defina una clase nueva derivada de la clase SecurityTokenParameters.
Implemente el método CloneCore. Copie todos los campos internos definidos en su clase, si hubiese alguno. Este ejemplo no define ningún campo adicional.
Implemente la propiedad de sólo lectura SupportsClientAuthentication. Esta propiedad devuelve
truesi el tipo de token de seguridad representado por esta clase se puede utilizar para autenticar un cliente a un servicio. En este ejemplo, el token de seguridad de la tarjeta de crédito se puede utilizar para autenticar un cliente a un servicio.Implemente la propiedad de sólo lectura SupportsServerAuthentication. Esta propiedad devuelve
truesi el tipo de token de seguridad representado por esta clase se puede utilizar para autenticar un servicio a un cliente. En este ejemplo, el token de seguridad de la tarjeta de crédito no se puede utilizar para autenticar un servicio a un cliente.Implemente la propiedad de sólo lectura SupportsClientWindowsIdentity. Esta propiedad devuelve
truesi el tipo de token de seguridad representado por esta clase puede asignarse a una cuenta de Windows. En ese caso, el resultado de la autenticación se representa mediante una instancia de la clase WindowsIdentity. En este ejemplo, el token no se puede asignar a una cuenta de Windows.Implemente el método CreateKeyIdentifierClause. El marco de seguridad de WCF llama a este método cuando requiere una referencia a la instancia del token de seguridad representada por esta clase de parámetros de tokens de seguridad. Tanto la instancia del token de seguridad real como el SecurityTokenReferenceStyle que especifica el tipo de la referencia que se solicita se pasan a este método como argumentos. En este ejemplo el token de seguridad de la tarjeta de crédito sólo admite referencias internas. La clase SecurityToken tiene funcionalidad para crear referencias internas, por lo que la implementación no precisa código adicional.
Implemente el método InitializeSecurityTokenRequirement. WCF llama a este método para convertir la instancia de la clase de parámetros de tokens de seguridad en una instancia de la clase SecurityTokenRequirement. Los proveedores de tokens de seguridad utilizan el resultado para crear la instancia del token de seguridad adecuada.
Los tokens de seguridad se transmiten dentro de los mensajes SOAP, lo que requiere un mecanismo de traducción entre la representación del token de seguridad en memoria y la representación en tránsito. WCF utiliza un serializador de tokens de seguridad para realizar esta tarea. Todos los tokens personalizados deben estar acompañados de un serializador de tokens de seguridad personalizado que pueda serializar y deserializar el token de seguridad personalizado del mensaje SOAP.
Nota
Las claves derivadas están habilitadas de forma predeterminada. Si crea un token de seguridad personalizado y lo utiliza como token primario, WCF deriva una clave a partir de éste. En este proceso, llama al serializador del token de seguridad personalizado para escribir la SecurityKeyIdentifierClause para el testigo de seguridad personalizado durante la serialización de DerivedKeyToken en la conexión. En el extremo receptor, al deserializar el token fuera de la conexión, el serializador DerivedKeyToken espera un elemento SecurityTokenReference como elemento secundario de nivel superior bajo sí mismo. Si el serializador del testigo de seguridad personalizado no agregó un elemento SecurityTokenReference durante la serialización de su tipo de cláusula, se produce una excepción.
Para crear un serializador de tokens de seguridad personalizado
Defina una clase nueva derivada de la clase WSSecurityTokenSerializer.
Invalide el método CanReadTokenCore, que se basa en un XmlReader para leer la secuencia XML. El método devuelve
truesi la implementación del serializador puede deserializar el token de seguridad dado su elemento actual. En este ejemplo, este método comprueba si el elemento XML actual del lector XML tiene el nombre de elemento y espacio de nombres correctos. Si no es así, llama a la implementación de la clase base de este método para controlar el elemento XML.Invalide el método ReadTokenCore. Este método lee el contenido XML del token de seguridad y construye la representación en memoria adecuada para el mismo. Si no reconoce el elemento XML sobre el que se alza el lector XML pasado, llama a la implementación de la clase base para procesar los tipos de token proporcionados por el sistema.
Invalide el método CanWriteTokenCore. Este método devuelve
truesi puede convertir la representación del token en memoria (pasado como argumento) en la representación XML. Si no puede convertirlo, llama a la implementación de la clase base.Invalide el método WriteTokenCore. Este método convierte una representación de tokens de seguridad en memoria en una representación XML. Si el método no puede convertirlo, llama a la implementación de la clase base.
Después de completar los cuatro procedimientos anteriores, integre el token de seguridad personalizado con el proveedor de tokens de seguridad, autenticador, administrador y credenciales de cliente y servicio.
Para integrar el token de seguridad personalizado con un proveedor de tokens de seguridad
- El proveedor de tokens de seguridad crea, modifica (si es necesario) y devuelve una instancia del token. Para crear un proveedor personalizado para el token de seguridad personalizado, cree una clase que herede de la clase SecurityTokenProvider. En el ejemplo siguiente se invalida el método GetTokenCore para devolver una instancia de
CreditCardToken. Para obtener más información acerca de los proveedores de testigos de seguridad personalizados, vea Cómo crear un proveedor de tokens de seguridad personalizado.
Para integrar el token de seguridad personalizado con un autenticador de tokens de seguridad
- El autenticador de tokens de seguridad valida el contenido del token de seguridad cuando se extrae del mensaje. Para crear un autenticador personalizado para el token de seguridad personalizado, cree una clase que herede de la clase SecurityTokenAuthenticator. En el ejemplo siguiente se invalida el método ValidateTokenCore. Para obtener más información acerca de los autenticadores de testigos de seguridad personalizados, vea Cómo: Crear un autenticador de tokens de seguridad personalizado.
Para integrar el token de seguridad personalizado con un administrador de tokens de seguridad
- El administrador de tokens de seguridad crea el proveedor de tokens, el autenticador de seguridad y las instancias del serializador de tokens adecuados. Para crear un administrador de tokens personalizado, cree una clase que herede de la clase ClientCredentialsSecurityTokenManager. Los métodos principales de la clase utilizan SecurityTokenRequirement para crear el proveedor y las credenciales de cliente o servicio adecuados. Para obtener más información acerca de los administradores de tokens de seguridad personalizados, consulte Cómo: Crear credenciales de cliente y servicio personalizadas.
Para integrar el token de seguridad personalizado con credenciales de cliente y servicio personalizadas
- Es necesario agregar credenciales de cliente y servicio personalizadas para proporcionar una API de manera que la aplicación permita especificar la información de tokens personalizados que utiliza la infraestructura de tokens de seguridad personalizados antes creada para proporcionar y autenticar el contenido del token de seguridad personalizado. En los ejemplos siguientes se muestra cómo se puede conseguir. Para obtener más información acerca de las credenciales de servicio y cliente personalizadas, vea Cómo: Crear credenciales de cliente y servicio personalizadas.
La clase de parámetros de tokens de seguridad personalizados creada anteriormente se utiliza para indicar al marco de seguridad de WCF que se ha de utilizar un token de seguridad personalizado al comunicarse con un servicio. En el siguiente procedimiento se muestra cómo hacerlo:
Para integrar el token de seguridad personalizado con el enlace
- La clase de parámetros de tokens de seguridad personalizados ha de especificarse en una de las colecciones de parámetros de tokens que se exponen en la clase SecurityBindingElement. El siguiente ejemplo usa la colección devuelta por SignedEncrypted. El código agrega el token personalizado de la tarjeta de crédito a cada mensaje enviado desde el cliente al servicio con su contenido firmado y cifrado automáticamente.
Consulte también
Tareas
Cómo crear un proveedor de tokens de seguridad personalizado
Referencia
SecurityToken
SecurityTokenParameters
WSSecurityTokenSerializer
SecurityTokenProvider
SecurityTokenAuthenticator
IAuthorizationPolicy
SecurityTokenRequirement
SecurityTokenManager
ClientCredentials
ServiceCredentials
SecurityBindingElement
Conceptos
Cómo: Crear credenciales de cliente y servicio personalizadas
Cómo: Crear un autenticador de tokens de seguridad personalizado
Arquitectura de seguridad