Procedimiento para crear una credencial de apoyo
Es posible tener un esquema de seguridad personalizado que requiera más de una credencial. Por ejemplo, un servicio puede solicitar del cliente un nombre de usuario y contraseña, pero también una credencial que demuestre que el cliente tiene más de 18 años. La segunda credencial es una credencial auxiliar. En este tema se explica cómo implementar dichas credenciales en un cliente Windows Communication Foundation (WCF).
Nota
La especificación para admitir las credenciales forma parte de la especificación WS-SecurityPolicy. Para obtener más información, consulte Especificaciones de seguridad de servicios web.
Tokens auxiliares
En resumen, al usar la seguridad de mensajes, una credencial primaria siempre se usa para proteger el mensaje (por ejemplo, un certificado X.509 o un vale Kerberos).
Como ha definido la especificación, un enlace de seguridad usa tokens para proteger el intercambio de mensajes. Un token es una representación de una credencial de seguridad.
El enlace de seguridad utiliza un token primario identificado en la directiva de enlace de seguridad para crear una firma. Esta firma se conoce como la firma del mensaje.
Los tokens adicionales se pueden especificar para aumentar las notificaciones proporcionadas por el token asociado a la firma del mensaje.
Endosar, firmar y cifrar
Una credencial auxiliar produce como resultado un token de apoyo que se transmite en el mensaje. La especificación de WS-SecurityPolicy define cuatro maneras de adjuntar un token de aprobación al mensaje, tal y como se describe en la tabla siguiente.
Propósito | Descripción |
---|---|
Firmado | El token de aprobación está incluido en el encabezado de seguridad y es firmado por la firma del mensaje. |
Endosar | Un token endosado firma la firma del mensaje. |
Firmar y endosar | Los tokens firmados y endosados firman el elemento ds:Signature completo generado a partir de la firma del mensaje y están firmados por esa firma del mensaje; es decir, ambos tokens (el token utilizado para la firma del mensaje y el token endosado y firmado) se firman entre sí. |
Firmar y cifrar | Los tokens de aprobación firmados y cifrados son tokens de aprobación firmados que también se cifran cuando aparecen en wsse:SecurityHeader . |
Programar credenciales de aprobación
Para crear un servicio que use los tokens auxiliares, debe crear un <customBinding>. (Para obtener más información, consulte Procedimiento para crear un enlace personalizado mediante SecurityBindingElement.)
El primer paso cuando se crea un enlace personalizado es crear un elemento de enlace de seguridad, que puede ser uno de tres tipos:
Todas las clases heredan del SecurityBindingElement, que incluye cuatro propiedades pertinentes:
Ámbitos
Existen dos ámbitos para admitir las credenciales:
Los tokens compatibles con el punto de conexión admiten todas las operaciones de un punto de conexión. Es decir, se puede utilizar la credencial que el token de aprobación representa siempre que se invoca una operación de punto de conexión.
Los tokens compatibles con la operación admiten solo una operación de punto de conexión específica.
Tal y como han indicado los nombres de la propiedad, se puede requerir las credenciales de aprobación o estas pueden ser opcionales. Es decir, si la credencial de aprobación se utiliza si está presente, aunque no es necesario, pero no se producirá un error en la autenticación si no está presente.
Procedimientos
Para crear un enlace personalizado que incluye credenciales de aprobación
Crear un elemento de enlace de seguridad. El ejemplo siguiente crea SymmetricSecurityBindingElement con el modo de autenticación
UserNameForCertificate
. Use el método CreateUserNameForCertificateBindingElement.Agregue el parámetro de aprobación a la colección de tipos devuelta por la propiedad adecuada (
Endorsing
,Signed
,SignedEncrypted
oSignedEndorsed
). Los tipos en el espacio de nombres System.ServiceModel.Security.Tokens incluyen tipos utilizados normalmente, como X509SecurityTokenParameters.
Ejemplo
Descripción
En el ejemplo siguiente se crea una instancia deSymmetricSecurityBindingElement y agrega una instancia de la clase KerberosSecurityTokenParameters a la colección que ha devuelto la propiedad endosada.
Código
public static Binding CreateMultiFactorAuthenticationBinding()
{
HttpTransportBindingElement httpTransport = new HttpTransportBindingElement();
// The message security binding element will be configured to require 2 tokens:
// 1) A user name/password encrypted with the service token.
// 2) A client certificate used to sign the message.
// Instantiate a binding element that will require the user name/password token
// in the message (encrypted with the server certificate).
SymmetricSecurityBindingElement messageSecurity = SecurityBindingElement.CreateUserNameForCertificateBindingElement();
// Create supporting token parameters for the client X.509 certificate.
X509SecurityTokenParameters clientX509SupportingTokenParameters = new X509SecurityTokenParameters();
// Specify that the supporting token is passed in the message send by the client to the service.
clientX509SupportingTokenParameters.InclusionMode = SecurityTokenInclusionMode.AlwaysToRecipient;
// Turn off derived keys.
clientX509SupportingTokenParameters.RequireDerivedKeys = false;
// Augment the binding element to require the client's X.509 certificate as an
// endorsing token in the message.
messageSecurity.EndpointSupportingTokenParameters.Endorsing.Add(clientX509SupportingTokenParameters);
// Create a CustomBinding based on the constructed security binding element.
return new CustomBinding(messageSecurity, httpTransport);
}