Cómo: Crear un WSFederationHttpBinding

En Windows Communication Foundation (WCF), la clase WSFederationHttpBinding proporciona un mecanismo para exponer un servicio federado, (wsFederationHttpBinding element en configuración). 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 extremo 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.

    Aa347982.note(es-es,VS.100).gifNota:
    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 extremo de servicio se implementa con un WSFederationHttpBinding, con su modo de seguridad establecido en None, el enlace de cliente resultante (generado por 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 se debe a que el tipo de credencial de cliente siempre es un token emitido. WCF adquiere un token de un emisor especificado y se lo ofrece al servicio para autenticar el 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 que publique los metadatos, vea 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.

Aa347982.note(es-es,VS.100).gifNota:
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. Cree una instancia de WSFederationHttpBinding.

  2. Establezca la propiedad Mode como Message o TransportWithMessageCredential, 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 como SecurityKeyType SymmetricKey o .AsymmetricKey, según se requiera.

  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 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 extremo federado en la configuración

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

  2. Cree binding como elemento secundario de wsFederationHttpBinding element, y establezca el atributo name con un valor adecuado.

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

  4. Establezca el atributo mode del elemento <security>Message con un valor de TransportWithMessageCredential o , como se requiera.

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

  6. Opcional. Establezca el atributo algorithmSuite del elemento <message> con un valor adecuado. El valor predeterminado es Basic256.

  7. Opcional. Si se requiere una clave de prueba asimétrica, establezca el atributo issuedKeyType del elemento <message>AsymmetricKey como . El valor predeterminado 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 <issuer><message> como elemento secundario del elemento .

  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, vea Identidad del servicio y autenticación.

  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 puede utilizarse para comunicar con el servicio de token de seguridad. Para obtener más información sobre cómo crear un enlace, vea Cómo: Especificar un enlace de servicio en la configuración.

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

  15. No se utiliza en el cliente; opcional en el servicio. Cree <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 <claimTypeRequirements><message> como elemento secundario del elemento . Especifique las notificaciones obligatorias y opcionales en las que se basa el servicio agregando los elementos <add> of <claimTypeRequirements><claimTypeRequirements>claimType al elemento , y definiendo el tipo de notificación con el atributo . 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("https://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("https://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;
}

Vea también

Tareas

Ejemplo de federación
Cómo deshabilitar sesiones seguras en WSFederationHttpBinding

Conceptos

Federación