Procedimiento para crear un WSFederationHttpBinding

En Windows Communication Foundation (WCF), la clase WSFederationHttpBinding (<wsFederationHttpBinding> en la configuración) proporciona un mecanismo para exponer un servicio federado. Es decir, un servicio que exige a los clientes su autenticación mediante un token de seguridad emitido por un servicio de token de seguridad. Este tema muestra cómo configurar un WSFederationHttpBinding tanto en el código y como en la configuración. Una vez creado el enlace, puede configurar un punto de conexión para que utilice dicho enlace.

A continuación se describen los pasos básicos:

  1. Seleccione un modo de seguridad. WSFederationHttpBinding admite Message, que proporciona seguridad global en el nivel de mensaje, incluso a través de múltiples saltos, y TransportWithMessageCredential, que ofrece el mejor rendimiento para los casos en los que el cliente y el servicio pueden realizar una conexión directa sobre HTTPS.

    Nota

    WSFederationHttpBinding también admite None como modo de seguridad. Este modo no es seguro y se ofrece solo para fines de depuración. Si un punto de conexión de servicio se implementa con un WSFederationHttpBinding, con su modo de seguridad establecido en None, el enlace de cliente resultante (generado por la Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe)) es WSHttpBinding con un modo de seguridad de None.

    A diferencia de otros enlaces proporcionados por el sistema, no es necesario seleccionar un tipo de credencial de cliente cuando se utiliza WSFederationHttpBinding. Esto es porque el tipo de credenciales de cliente siempre es un token emitido. WCF adquiere un token de un emisor especificado y lo presenta al servicio para autenticar al cliente.

  2. En clientes federados, se establece la propiedad IssuerAddress para la dirección URL del servicio de token de seguridad. Establezca IssuerBinding como el enlace utilizado para comunicar con el servicio de token de seguridad.

  3. Opcional. Establezca la propiedad IssuedTokenType en el Identificador uniforme de recursos (URI) de un tipo de token. En servicios federados, especifique el tipo de token que el servicio espera. En clientes federados, especifique el tipo de token que el cliente solicita al servicio de token de seguridad.

    Si no se especifica ningún tipo de token, los clientes generan las solicitudes de tokens de seguridad (RST) de WS-Trust sin un URI del tipo de token, y los servicios asumen que la autenticación del cliente se realiza utilizando, de manera predeterminada, un token de Lenguaje de marcado de aserción de seguridad (SAML) 1.1.

    El URI para un token de SAML 1.1 es http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1.

  4. Opcional. En servicios federados, establezca la propiedad IssuerMetadataAddress como la dirección URL de los metadatos de un servicio de token de seguridad. Si el servicio está configurado para publicar metadatos, el extremo de los metadatos permite a los clientes del servicio seleccionar un par enlace/extremo adecuado. Para obtener más información sobre la publicación de metadatos, consulte Publicación de metadatos.

También pueden establecerse otras propiedades, incluidos el tipo de clave utilizado como clave de prueba en el token emitido, el conjunto de algoritmos utilizado entre el cliente y el servicio, si negociar o especificar explícitamente la credencial del servicio, cualquier demanda concreta que el servicio espera que este contenido en el token emitido, y cualquier elemento XML adicional que deba agregarse a la solicitud que el cliente envía al servicio de token de seguridad.

Nota

La propiedad NegotiateServiceCredential es relevante únicamente cuando SecurityMode se establece como Message. Si SecurityMode se establece como TransportWithMessageCredential, se omite la propiedad NegotiateServiceCredential.

Para configurar un WSFederationHttpBinding en código

  1. Creación de una instancia de WSFederationHttpBinding.

  2. Establezca la propiedad Mode como WSFederationHttpSecurityMode o Message, según se requiera. Si se requiere un conjunto de algoritmos distinto de Basic256, establezca la propiedad AlgorithmSuite con un valor tomado de SecurityAlgorithmSuite.

  3. Establezca la propiedad NegotiateServiceCredential según corresponda.

  4. Establezca la propiedad IssuedKeyType en SecurityKeyTypeSymmetricKey o .AsymmetricKey según sea necesario.

  5. Establezca un valor adecuado para la propiedad IssuedTokenType. Si no se establece ningún valor, WCF toma el valor predeterminado http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1, lo que indica tokens de SAML 1.1.

  6. Obligatorio en el cliente si no se especifica ningún emisor local; opcional en el servicio. Cree EndpointAddress que contenga la dirección e información de identidad del servicio de token de seguridad, y asigne la instancia EndpointAddress a la propiedad IssuerAddress.

  7. Obligatorio en el cliente si no se especifica ningún emisor local; no se utiliza en el servicio. Cree Binding para SecurityTokenService y asigne la instancia de Binding a la propiedad IssuerBinding.

  8. No se utiliza en el cliente; opcional en el servicio. Cree una instancia EndpointAddress para los metadatos del servicio de token de seguridad, y asígnelo a la propiedad IssuerMetadataAddress.

  9. Opcional en el cliente y el servicio. Cree y agregue una o más instancias ClaimTypeRequirement a la colección devuelta por la propiedad ClaimTypeRequirements.

  10. Opcional en el cliente y el servicio. Cree y agregue una o más instancias XmlElement a la colección devuelta por la propiedad TokenRequestParameters.

Para crear un punto de conexión federado en la configuración

  1. Cree un <wsFederationHttpBinding> como elemento secundario del elemento <bindings> en el archivo de configuración de la aplicación.

  2. Cree un elemento <binding> como elemento secundario de <wsFederationHttpBinding> y establezca el atributo name en un valor adecuado.

  3. Cree un elemento <security> como elemento secundario del elemento <binding>.

  4. Establezca el atributo del elemento con un valor de o , como se requiera.

  5. Cree un elemento <message> como elemento secundario del elemento de <security>.

  6. Opcional. Establezca el atributo algorithmSuite del elemento <message> con un valor adecuado. De manera predeterminada, es Basic256.

  7. Opcional. Si se requiere una clave de prueba asimétrica, establezca el atributo issuedKeyType del elemento <message>. De manera predeterminada, es SymmetricKey.

  8. Opcional. Establezca el atributo issuedTokenType en el elemento <message>.

  9. Obligatorio en el cliente si no se especifica ningún emisor local; opcional en el servicio. Cree un elemento <issuer> como elemento secundario del elemento <message>.

  10. Establezca el atributo address como el elemento <issuer>, y especifique la dirección en la que el servicio de token de seguridad acepta las solicitudes de token.

  11. Opcional. Agregue un elemento secundario <identity> y especifique la identidad del servicio de token de seguridad

  12. Para obtener más información, consulte Identidad y autenticación de servicio.

  13. Obligatorio en el cliente si no se especifica ningún emisor local; no se utiliza en el servicio. Cree un elemento <binding> en la sección de enlaces que pueda usarse para comunicar con el servicio de token de seguridad. Para obtener más información sobre cómo crear un enlace, consulte Procedimiento para especificar un enlace de servicio en la configuración.

  14. Especifique el enlace creado en el paso anterior estableciendo los atributos binding y bindingConfiguration del elemento <issuer>.

  15. No se utiliza en el cliente; opcional en el servicio. Cree un elemento <issuerMetadata> como elemento secundario del elemento <message>. A continuación, en un atributo address del elemento <issuerMetadata>, especifique la dirección en la que el servicio de token de seguridad publicará sus metadatos. De manera opcional, agregue un elemento secundario <identity> y especifique la identidad del servicio de token de seguridad

  16. Opcional en el cliente y el servicio. Agregue un elemento como elemento secundario del elemento . Especifique las notificaciones obligatorias y opcionales en las que se basa el servicio agregando los elementos <add> al elemento <claimTypeRequirements>, y definiendo el tipo de notificación con el atributo claimType. Especifique si una notificación determinada es obligatoria u opcional estableciendo el atributo isOptional.

Ejemplo

El ejemplo de código siguiente muestra el código para configurar WSFederationHttpBinding de manera imperativa.

// This method creates a WSFederationHttpBinding.
public static WSFederationHttpBinding
    CreateWSFederationHttpBinding(bool isClient)
{
  // Create an instance of the WSFederationHttpBinding.
  WSFederationHttpBinding b = new WSFederationHttpBinding();

  // Set the security mode to Message.
  b.Security.Mode = WSFederationHttpSecurityMode.Message;

  // Set the Algorithm Suite to Basic256Rsa15.
  b.Security.Message.AlgorithmSuite = SecurityAlgorithmSuite.Basic256Rsa15;

  // Set NegotiateServiceCredential to true.
  b.Security.Message.NegotiateServiceCredential = true;

  // Set IssuedKeyType to Symmetric.
  b.Security.Message.IssuedKeyType = SecurityKeyType.SymmetricKey;

  // Set IssuedTokenType to SAML 1.1
  b.Security.Message.IssuedTokenType =
      "http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#samlv1.1";
    
  // Extract the STS certificate from the certificate store.
  X509Store store = new X509Store(StoreName.TrustedPeople, StoreLocation.CurrentUser);
  store.Open(OpenFlags.ReadOnly);
  X509Certificate2Collection certs = store.Certificates.Find(
      X509FindType.FindByThumbprint, "0000000000000000000000000000000000000000", false);
  store.Close();

  // Create an EndpointIdentity from the STS certificate.
  EndpointIdentity identity = EndpointIdentity.CreateX509CertificateIdentity ( certs[0] );

  // Set the IssuerAddress using the address of the STS and the previously created
  // EndpointIdentity.
  b.Security.Message.IssuerAddress =
      new EndpointAddress(new Uri("http://localhost:8000/sts/x509"), identity);

  // Set the IssuerBinding to a WSHttpBinding loaded from configuration.
  // The IssuerBinding is only used on federated clients.
  if (isClient)
  {
      b.Security.Message.IssuerBinding = new WSHttpBinding("Issuer");
  }

  // Set the IssuerMetadataAddress using the metadata address of the STS and the
  // previously created EndpointIdentity. The IssuerMetadataAddress is only used
  // on federated services.
  else
  {
      b.Security.Message.IssuerMetadataAddress =
          new EndpointAddress(new Uri("http://localhost:8001/sts/mex"), identity);
  }
  // Create a ClaimTypeRequirement.
  ClaimTypeRequirement ctr = new ClaimTypeRequirement
      ("http://example.org/claim/c1", false);

  // Add the ClaimTypeRequirement to ClaimTypeRequirements
  b.Security.Message.ClaimTypeRequirements.Add(ctr);

  // Return the created binding
  return b;
}
' This method creates a WSFederationHttpBinding.
Public Shared Function CreateWSFederationHttpBinding(ByVal isClient As Boolean) As WSFederationHttpBinding
    ' Create an instance of the WSFederationHttpBinding.
    Dim b As New WSFederationHttpBinding()
    With b.Security
        ' Set the security mode to Message.
        .Mode = WSFederationHttpSecurityMode.Message

        With .Message
            ' Set the Algorithm Suite to Basic256Rsa15.
            .AlgorithmSuite = SecurityAlgorithmSuite.Basic256Rsa15

            ' Set NegotiateServiceCredential to true.
            .NegotiateServiceCredential = True

            ' Set IssuedKeyType to Symmetric.
            .IssuedKeyType = SecurityKeyType.SymmetricKey

            ' Set IssuedTokenType to SAML 1.1
            .IssuedTokenType = "http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#samlv1.1"
        End With
    End With

    ' Extract the STS certificate from the certificate store.
    Dim store As New X509Store(StoreName.TrustedPeople, StoreLocation.CurrentUser)
    store.Open(OpenFlags.ReadOnly)
    Dim certs = store.Certificates.Find(X509FindType.FindByThumbprint, _
                                        "0000000000000000000000000000000000000000", _
                                        False)
    store.Close()

    ' Create an EndpointIdentity from the STS certificate.
    Dim identity = EndpointIdentity.CreateX509CertificateIdentity(certs(0))

    ' Set the IssuerAddress using the address of the STS and the previously created 
    ' EndpointIdentity.
    With b.Security.Message
        .IssuerAddress = New EndpointAddress(New Uri("http://localhost:8000/sts/x509"), _
                                                                           identity)

        ' Set the IssuerBinding to a WSHttpBinding loaded from configuration. 
        ' The IssuerBinding is only used on federated clients.
        If isClient Then
            .IssuerBinding = New WSHttpBinding("Issuer")

            ' Set the IssuerMetadataAddress using the metadata address of the STS and the
            ' previously created EndpointIdentity. The IssuerMetadataAddress is only used 
            ' on federated services.
        Else
            .IssuerMetadataAddress = New EndpointAddress(New Uri("http://localhost:8001/sts/mex"), _
                                                                           identity)
        End If
        ' Create a ClaimTypeRequirement.
        Dim ctr As New ClaimTypeRequirement("http://example.org/claim/c1", _
                                            False)

        ' Add the ClaimTypeRequirement to ClaimTypeRequirements
        .ClaimTypeRequirements.Add(ctr)
    End With

    ' Return the created binding
    Return b
End Function

Consulte también