Procedimiento para configurar las credenciales en un servicio de federación

En Windows Communication Foundation (WCF), la creación de un servicio federado consta de los siguientes procedimientos principales:

  1. Configurar un WSFederationHttpBinding o un enlace personalizado similar. Para obtener más información sobre cómo crear un enlace adecuado, consulte Procedimiento para crear un WSFederationHttpBinding.

  2. Configurar el IssuedTokenServiceCredential que controla cómo se autentican los tokens emitidos que se presentan al servicio.

Este tema proporciona detalles sobre el segundo paso. Para obtener más información sobre cómo funciona un servicio federado, consulte Federación.

Para establecer las propiedades de IssuedTokenServiceCredential en el código

  1. Utilice la propiedad IssuedTokenAuthentication de la clase ServiceCredentials para devolver una referencia a una instancia IssuedTokenServiceCredential. Se obtiene acceso a la propiedad desde la propiedad Credentials de la clase ServiceHostBase.

  2. Establezca la propiedad AllowUntrustedRsaIssuers en true si los tokens emitidos automáticamente, como las tarjetas CardSpace, deben autenticarse. El valor predeterminado es false.

  3. Rellene la colección devuelta por la propiedad KnownCertificates con instancias de la clase X509Certificate2. Cada instancia representa un emisor desde el que el servicio autenticará los tokens.

    Nota

    A diferencia de la colección del lado del cliente devuelta por la propiedad ScopedCertificates, la colección de certificados conocida no es una colección con clave. El servicio acepta los tokens que los certificados especificados emiten sin tener en cuenta la dirección del cliente que envió el mensaje con el token emitido (sujeto a las restricciones siguientes, que se describirán más adelante).

  4. Establezca la propiedad CertificateValidationMode en uno de los valores de enumeración X509CertificateValidationMode. Esto solo se puede hacer en código. El valor predeterminado es ChainTrust.

  5. Si la propiedad CertificateValidationMode está establecida en Custom, asigne a continuación una instancia de la clase personalizada X509CertificateValidator a la propiedad CustomCertificateValidator.

  6. Si CertificateValidationMode está definido en ChainTrust o PeerOrChainTrust, defina la propiedad RevocationMode en un valor apropiado de la enumeración X509RevocationMode. Tenga en cuenta que el modo de revocación no se utiliza en PeerTrust ni en los modos de validación Custom.

  7. Si es necesario, asigne una instancia de una clase SamlSerializer personalizada a la propiedad SamlSerializer. Se necesita un serializador del Lenguaje de marcado de aserción de seguridad (SAML) personalizado, por ejemplo, para analizar las aserciones de SAML personalizadas.

Para establecer las propiedades de IssuedTokenServiceCredential en la configuración

  1. Cree un elemento <issuedTokenAuthentication> como secundario del elemento <serviceCredentials>.

  2. Establezca el atributo allowUntrustedRsaIssuers del elemento <issuedTokenAuthentication> en true si se va a autenticar un token emitido automáticamente, como una tarjeta CardSpace.

  3. Cree un elemento <knownCertificates> como elemento secundario del elemento de <issuedTokenAuthentication>.

  4. Cree cero o más elementos <add><knownCertificates>storeLocationstoreName y .

  5. Si es necesario, establezca el atributo samlSerializer del elemento <issuedTokenAuthentication> en el nombre del tipo de la clase SamlSerializer personalizada.

Ejemplo

El siguiente ejemplo define las propiedades de un IssuedTokenServiceCredential en el código.

// This method configures the IssuedTokenAuthentication property of a ServiceHost.
public static void ConfigureIssuedTokenServiceCredentials(
    ServiceHost sh, bool allowCardspaceTokens, IList<X509Certificate2> knownissuers,
    X509CertificateValidationMode certMode, X509RevocationMode revocationMode, SamlSerializer ser )
{
  // Allow CardSpace tokens.
  sh.Credentials.IssuedTokenAuthentication.AllowUntrustedRsaIssuers = allowCardspaceTokens;

  // Set up known issuer certificates.
  foreach(X509Certificate2 cert in knownissuers)
    sh.Credentials.IssuedTokenAuthentication.KnownCertificates.Add ( cert );

  // Set issuer certificate validation and revocation checking modes.
  sh.Credentials.IssuedTokenAuthentication.CertificateValidationMode =
      X509CertificateValidationMode.PeerOrChainTrust;
  sh.Credentials.IssuedTokenAuthentication.RevocationMode = X509RevocationMode.Online;
  sh.Credentials.IssuedTokenAuthentication.TrustedStoreLocation = StoreLocation.LocalMachine;

  // Set the SamlSerializer, if one is specified.
  if ( ser != null )
    sh.Credentials.IssuedTokenAuthentication.SamlSerializer = ser;
}
' This method configures the IssuedTokenAuthentication property of a ServiceHost.
Public Shared Sub ConfigureIssuedTokenServiceCredentials( _
    ByVal sh As ServiceHost, _
    ByVal allowCardspaceTokens As Boolean, _
    ByVal knownissuers As IList(Of X509Certificate2), _
    ByVal certMode As X509CertificateValidationMode, _
    ByVal revocationMode As X509RevocationMode, _
    ByVal ser As SamlSerializer _
    )
    ' Allow CardSpace tokens.
    sh.Credentials.IssuedTokenAuthentication.AllowUntrustedRsaIssuers = _
    allowCardspaceTokens

    ' Set up known issuer certificates.
    Dim cert As X509Certificate2
    For Each cert In knownissuers
        sh.Credentials.IssuedTokenAuthentication.KnownCertificates.Add(cert)
    Next cert
    ' Set issuer certificate validation and revocation checking modes.
    sh.Credentials.IssuedTokenAuthentication.CertificateValidationMode = _
        X509CertificateValidationMode.PeerOrChainTrust
    sh.Credentials.IssuedTokenAuthentication.RevocationMode = _
    X509RevocationMode.Online

    ' Set the SamlSerializer, if one is specified.
    If Not (ser Is Nothing) Then
        sh.Credentials.IssuedTokenAuthentication.SamlSerializer = ser
    End If
End Sub

Para que un servicio federado autentique un cliente, debe cumplirse lo siguiente sobre el token emitido:

  • Cuando la firma digital del token emitido utiliza un identificador de clave de seguridad de RSA, la propiedad AllowUntrustedRsaIssuers debe ser true.

  • Cuando la firma del token emitido utiliza un número de serie de emisor de X.509, un identificador de clave de sujeto (SKI) de X.509 o un identificador de seguridad de huella digital de X.509, un certificado debe firmar el token emitido en la colección devuelta por la propiedad KnownCertificates de la clase IssuedTokenServiceCredential.

  • Cuando se firma el token emitido utilizando un certificado X.509, el certificado debe validarse por la semántica especificada por el valor de la propiedad CertificateValidationMode, sin tener en cuenta si el certificado se envió al usuario de confianza como X509RawDataKeyIdentifierClause o se obtuvo de la propiedad KnownCertificates. Para obtener más información acerca de los certificados digitales X.509, consulte Trabajar con certificados.

Por ejemplo, establecer CertificateValidationMode en PeerTrust autenticaría cualquier token emitido cuyo certificado de firma esté en el almacén de certificados TrustedPeople. En ese caso, defina la propiedad TrustedStoreLocation en CurrentUser o LocalMachine. Puede seleccionar otros modos, incluidos Custom. Cuando Custom está seleccionado, debe asignar una instancia de la clase X509CertificateValidator a la propiedad CustomCertificateValidator. El validador personalizado puede validar los certificados utilizando cualquier criterio que le guste. Para obtener más información, consulte Procedimiento para crear un servicio que emplee un validador de certificado personalizado.

Consulte también