Cómo: Crear credenciales de cliente y servicio personalizadas
En este tema se muestra cómo implementar credenciales de cliente y servicio personalizadas y cómo utilizar las credenciales personalizadas desde el código de la aplicación.
Clases de extensibilidad de credenciales
Las clases ClientCredentials y ServiceCredentials son los puntos de entrada principales a la extensibilidad de seguridad de Windows Communication Foundation (WCF). Estas clases de credenciales proporcionan las API que permiten al código de la aplicación establecer información de las credenciales y convertir los tipos de credenciales en tokens de seguridad. ((Los tokens de seguridad son la forma utilizada para transmitir información de credenciales dentro de los mensajes SOAP.) Las responsabilidades de estas clases de credenciales pueden dividirse en dos áreas:
- Proporcione las API para que las aplicaciones establezcan la información de las credenciales.
- Haga las funciones de un generador para las implementaciones de SecurityTokenManager.
Las clases ClientCredentials y ServiceCredentials heredan de la clase SecurityCredentialsManager abstracta que define el contrato para la devolución del SecurityTokenManager.
Para obtener más información sobre las clases de credenciales y cuál es su papel en la arquitectura de seguridad de WCF, vea Arquitectura de seguridad.
Las implementaciones predeterminadas proporcionadas en WCF admiten los tipos de credenciales proporcionados por el sistema y crean un administrador de tokens de seguridad que es capaz de administrar esos tipos de credenciales.
Razones para personalizar
Hay varias razones para personalizar las clases de credenciales de cliente o servicio. Principalmente está la necesidad de cambiar el comportamiento de seguridad predeterminado de WCF con respecto a la administración de los tipos de credenciales proporcionados por el sistema, sobre todo por estas razones:
- Una necesidad de realizar cambios que no son posibles mediante otros puntos de extensibilidad.
- Una necesidad de agregar nuevos tipos de credenciales.
- Una necesidad de agregar nuevos tipos de tokens de seguridad personalizados.
En este tema se describe cómo implementar credenciales de cliente y servicio personalizadas y cómo utilizarlas desde el código de la aplicación.
Primero en una serie
Crear una clase de credenciales personalizadas sólo es el primer paso, porque la razón para personalizar las credenciales es cambiar el comportamiento de WCF con respecto al suministro de credenciales, serialización de tokens de seguridad o autenticación. Otros temas en esta sección describen cómo crear serializadores y autenticadores personalizados. En este aspecto, crear la clase de credenciales personalizada es el primer tema de la serie. Las acciones subsiguientes (crear serializadores y autenticadores personalizados) sólo se pueden hacer después de crear las credenciales personalizadas. Entre los temas adicionales que se generan a partir de este tema se incluyen:
- Cómo crear un proveedor de tokens de seguridad personalizado
- Cómo: Crear un autenticador de tokens de seguridad personalizado
- Cómo: Crear un token personalizado.
Procedimientos
Implementación de credenciales de cliente personalizadas
Defina una clase nueva derivada de la clase ClientCredentials.
Opcional. Agregue nuevas propiedades para proporcionar métodos o propiedades para los nuevos tipos de credenciales. Si no agrega nuevos tipos de credencial, no realice este paso. El siguiente ejemplo agrega una propiedad
CreditCardNumber
.Invalide el método CreateSecurityTokenManager. La infraestructura de seguridad de WCF llamará automáticamente a este método cuando se utilice la credencial de cliente personalizada. Este método es responsable de crear y devolver una instancia de una implementación de la clase SecurityTokenManager. El siguiente procedimiento describe cómo se puede crear este tipo de implementación.
Invalide el método CloneCore.
Implementación del administrador de tokens de seguridad de cliente personalizados
Defina una clase nueva derivada a partir de ClientCredentialsSecurityTokenManager.
Opcional. Invalide el método CreateSecurityTokenProvider si se necesita crear una implementación SecurityTokenProvider personalizada. Para obtener más información acerca de proveedores de tokens de seguridad personalizados, consulte Cómo crear un proveedor de tokens de seguridad personalizado.
Opcional. Invalide el método CreateSecurityTokenAuthenticator si se necesita crear una implementación SecurityTokenAuthenticator personalizada. Para obtener más información acerca de autenticadores de tokens de seguridad personalizados, consulte Cómo: Crear un autenticador de tokens de seguridad personalizado.
Opcional. Invalide el método CreateSecurityTokenSerializer si es neecsario crear un SecurityTokenSerializer personalizado. Para obtener más información acerca de los tokens de seguridad personalizados y los serializadores de tokens de seguridad personalizados, vea Cómo: Crear un token personalizado.
Uso de credenciales de cliente personalizadas a partir del código de la aplicación
Cree una instancia del cliente generado que representa la interfaz de servicio, o cree una instancia del ChannelFactory que señala a un servicio con el que desee comunicarse.
Elimine el comportamiento de credenciales de cliente proporcionadas por el sistema de la colección Behaviors, a la que se puede tener acceso mediante la propiedad Endpoint.
Cree una nueva instancia de una clase de credenciales de cliente personalizada y agréguela a la colección Behaviors, a la que se puede tener acceso mediante la propiedad Endpoint.
El procedimiento anterior muestra cómo utilizar las credenciales de cliente a partir del código de la aplicación. Las credenciales de WCF también se pueden configurar utilizando el archivo de configuración de la aplicación. A menudo, es preferible utilizar la configuración de la aplicación en lugar de emplear codificación de forma rígida, porque permite modificar los parámetros de la aplicación sin tener que modificar la fuente, recompilar y reimplementar.
El siguiente procedimiento describe cómo proporcionar compatibilidad para la configuración de credenciales personalizadas.
Creación de un controlador de configuración para las credenciales de cliente personalizadas
Defina una clase nueva derivada a partir de ClientCredentialsElement.
Opcional. Agregue propiedades para todos los parámetros de configuración adicionales que desee exponer a través de la configuración de la aplicación. El siguiente ejemplo agrega una propiedad denominada
CreditCardNumber
.Invalide la propiedad BehaviorType para devolver el tipo de la clase de credenciales de cliente personalizadas creado con el elemento de configuración.
Invalide el método CreateBehavior. El método es responsable de crear y devolver una instancia de la clase de credenciales personalizadas basándose en los ajustes cargados desde el archivo de configuración. Llame al método ApplyConfiguration base desde este método para recuperar los ajustes de credenciales proporcionados por el sistema cargados en su instancia de credenciales de cliente personalizadas.
Opcional. Si agregó propiedades adicionales en el paso 2, ha de invalidar la propiedad Properties para registrar su configuración adicional para que el marco de configuración las reconozca. Combine sus propiedades con las propiedades de clase base para permitir que los ajustes proporcionados por el sistema se configuren a través de este elemento de configuración de credenciales de cliente personalizadas.
Una vez que tenga tiene la clase del controlador de configuración, puede integrarse en el marco de configuración de WCF. Eso permite que las credenciales de cliente personalizadas se usen en los elementos de comportamiento de extremo de cliente, tal y como se muestra en el siguiente procedimiento.
Registro y uso de un controlador de configuración de credenciales de cliente personalizadas en la configuración de la aplicación
Agregue un elemento <extensions> y un elemento <behaviorExtensions> al archivo de configuración.
Agregue un elemento <add> al elemento <behaviorExtensions> y establezca el atributo name en un valor apropiado.
Establezca el atributo type en el nombre de tipo completo. Incluya también el nombre de ensamblado y otros atributos de ensamblado.
<system.serviceModel> <extensions> <behaviorExtensions> <add name="myClientCredentials" type="Microsoft.ServiceModel.Samples.MyClientCredentialsConfigHandler, CustomCredentials, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> </behaviorExtensions> </extensions> <system.serviceModel>
Después de registrar su controlador de configuración, el elemento de credenciales personalizadas se puede utilizar dentro del mismo archivo de configuración en lugar del elemento <clientCredentials> proporcionado por el sistema. Puede utilizar las propiedades proporcionadas por el sistema y cualquier propiedad nueva que haya agregado a su implementación del controlador de configuración. El siguiente ejemplo establece el valor de una propiedad personalizada mediante el atributo creditCardNumber.
<behaviors> <endpointBehaviors> <behavior name="myClientCredentialsBehavior"> <myClientCredentials creditCardNumber="123-123-123"/> </behavior> </endpointBehaviors> </behaviors>
Implementación de las credenciales de servicio personalizadas
Defina una clase nueva derivada a partir de ServiceCredentials.
Opcional. Agregue nuevas propiedades para proporcionar API para los nuevos valores de credenciales que se están agregando. Si no agrega nuevos valores de credenciales, no realice este paso. En el siguiente ejemplo se agrega una propiedad
AdditionalCertificate
.Invalide el método CreateSecurityTokenManager. La infraestructura de WCF llama automáticamente a este método cuando se utiliza la credencial de cliente personalizada. El método es responsable de crear y devolver una instancia de una implementación de la clase SecurityTokenManager(descrita en el siguiente procedimiento).
Opcional. Invalide el método CloneCore. Esto sólo se requiere si se agregan nuevas propiedades o campos internos a la implementación de credenciales de cliente personalizadas.
Implementación de un administrador de tokens de seguridad de servicio personalizados
Defina una clase nueva derivada de la clase ServiceCredentialsSecurityTokenManager.
Opcional. Invalide el método CreateSecurityTokenProvider si se necesita crear una implementación SecurityTokenProvider personalizada. Para obtener más información acerca de proveedores de tokens de seguridad personalizados, consulte Cómo crear un proveedor de tokens de seguridad personalizado.
Opcional. Invalide el método CreateSecurityTokenAuthenticator si se necesita crear una implementación SecurityTokenAuthenticator personalizada. Para obtener más información acerca de autenticadores de tokens de seguridad personalizados, consulte el tema Cómo: Crear un autenticador de tokens de seguridad personalizado.
Opcional. Invalide el método CreateSecurityTokenSerializer si es neecsario crear un SecurityTokenSerializer personalizado. Para obtener más información acerca de los tokens de seguridad personalizados y los serializadores de tokens de seguridad personalizados, vea Cómo: Crear un token personalizado.
Uso de credenciales de servicio personalizadas a partir del código de la aplicación
Cree una instancia de ServiceHost.
Elimine el comportamiento de las credenciales de servicio proporcionadas por el sistema desde la colección Behaviors.
Cree una nueva instancia de la clase de credenciales de servicio personalizadas y agréguela a la colección Behaviors.
Agregue compatibilidad para la configuración mediante los pasos descritos anteriormente en los procedimientos "Creating a configuration handler for custom client credentials" y "Registering and using a custom client credentials configuration handler in the application configuration". La única diferencia es que se ha de utilizar la clase ServiceCredentialsElement en lugar de la clase ClientCredentialsElement como una clase base para el controlador de configuración. El elemento de credencial de servicio personalizado puede utilizarse después dondequiera que se utilice el elemento <serviceCredentials>
proporcionado por el sistema.
Consulte también
Tareas
Cómo crear un proveedor de tokens de seguridad personalizado
Referencia
ClientCredentials
ServiceCredentials
SecurityCredentialsManager
SecurityTokenManager
ClientCredentialsElement
ServiceCredentialsElement
Conceptos
Cómo: Crear un autenticador de tokens de seguridad personalizado
Cómo: Crear un token personalizado