Como: criar uma WSFederationHttpBinding

No WCF (Windows Communication Foundation), a WSFederationHttpBinding classe (<wsFederationHttpBinding> na configuração) fornece um mecanismo para expor um serviço federado. Ou seja, um serviço que exige que os clientes se autentiquem usando um token de segurança emitido por um serviço de token de segurança. Este tópico mostra como configurar um WSFederationHttpBinding em um código e na configuração. Depois que a associação for criada, você poderá configurar um ponto de extremidade para usar essa associação.

As etapas básicas são descritas a seguir:

  1. Selecione uma função de segurança. O WSFederationHttpBinding é compatibilidade com Message, que oferece segurança de ponta a ponta no nível da mensagem, mesmo em vários saltos, e TransportWithMessageCredential, que fornece melhor desempenho em casos em que o cliente e o serviço podem fazer uma conexão direta por HTTPS.

    Observação

    O WSFederationHttpBinding também é compatibilidade com None como um modo de segurança. Esse modo não é seguro e é fornecido apenas para fins de depuração. Se um ponto de extremidade de serviço for implantado com um WSFederationHttpBinding e o modo de segurança definido como None, a associação de cliente resultante (gerada pela Ferramenta de Utilitário de Metadados do ServiceModel (Svcutil.exe)) será um WSHttpBinding com modo de segurança de None.

    Ao contrário de outras associações fornecidas pelo sistema, não é necessário selecionar um tipo de credencial de cliente ao usar o WSFederationHttpBinding. Isso ocorre porque o tipo de credencial do cliente é sempre um token emitido. O WCF adquire um token de um emissor especificado e apresenta esse token ao serviço para autenticar o cliente.

  2. Em clientes federados, defina a propriedade IssuerAddress como a URL do serviço de token de segurança. Defina o IssuerBinding para a associação a ser usada para se comunicar com o serviço de token de segurança.

  3. Opcional. Defina a propriedade IssuedTokenType como o URI (Uniform Resource Identifier) de um tipo de token. Em serviços federados, especifique o tipo de token esperado pelo serviço. Em clientes federados, especifique o tipo de token que o cliente solicita do serviço de token de segurança.

    Se nenhum tipo de token for especificado, os clientes gerarão RSTs (Tokens de Segurança de Solicitação) WS-Trust em um URI de tipo de token e os serviços esperam a autenticação do cliente usando um token SAML (Security Assertions Markup Language) 1.1 por padrão.

    O URI de um token SAML 1.1 é http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1.

  4. Opcional. Em serviços federados, defina a propriedade IssuerMetadataAddress como a URL de metadados de um serviço de token de segurança. O ponto de extremidade de metadados permite que os clientes do serviço selecionem um par de associação/ponto de extremidade apropriado, se o serviço estiver configurado para publicar metadados. Para obter mais informações sobre como publicar metadados, consulte Metadados de publicação.

Você também pode definir outras propriedades, como o tipo de chave de prova no token emitido, o conjunto de algoritmos a ser usado entre o cliente e o serviço, seja para negociar ou especificar explicitamente a credencial de serviço, declarações específicas que o serviço espera que o token emitido contenha e elementos XML adicionais que precisem ser adicionados à solicitação que o cliente envia ao serviço de token de segurança.

Observação

A propriedade NegotiateServiceCredential é pertinente apenas quando SecurityMode é definido como Message. Se SecurityMode for definido como TransportWithMessageCredential, então a propriedade NegotiateServiceCredential é ignorada.

Para configurar um WSFederationHttpBinding no código

  1. Crie uma instância de WSFederationHttpBinding.

  2. Defina a propriedade Mode como WSFederationHttpSecurityMode ou Message conforme necessário. Se um conjunto de algoritmos diferente de Basic256 for necessário, defina a propriedade AlgorithmSuite como um valor obtido de SecurityAlgorithmSuite.

  3. Defina a propriedade NegotiateServiceCredential conforme apropriado.

  4. Defina a propriedade IssuedKeyType como SecurityKeyType ou SymmetricKey.AsymmetricKey conforme necessário.

  5. Defina a propriedade IssuedTokenType com o valor apropriado. Se nenhum valor for definido, o WCF terá o valor padrão de http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1, o que indica tokens SAML 1.1.

  6. Obrigatório no cliente se nenhum emissor local for especificado. Opcional no serviço. Crie um EndpointAddress que contenha as informações de endereço e identidade do serviço de token de segurança e atribua a instância EndpointAddress à propriedade IssuerAddress.

  7. Obrigatório no cliente se nenhum emissor local for especificado. Não usado no serviço. Crie um Binding para o SecurityTokenService e atribua a instância Binding à propriedade IssuerBinding.

  8. Não usado no cliente; opcional no serviço. Crie uma instância EndpointAddress para os metadados do serviço de token de segurança e atribua-a à propriedade IssuerMetadataAddress.

  9. Opcional no cliente e no serviço. Crie e adicione uma ou mais instâncias ClaimTypeRequirement à coleção retornada pela propriedade ClaimTypeRequirements.

  10. Opcional no cliente e no serviço. Crie e adicione uma ou mais instâncias XmlElement à coleção retornada pela propriedade TokenRequestParameters.

Para criar um ponto de extremidade federado na configuração

  1. Crie um <wsFederationHttpBinding> como filho do elemento <bindings> no arquivo de configuração do aplicativo.

  2. Crie um elemento de <associação> como um filho de <wsFederationHttpBinding> e defina o atributo name com um valor apropriado.

  3. Crie um elemento <security> como filho do elemento <binding>.

  4. Defina o atributo mode no elemento <security> como um valor de Message ou TransportWithMessageCredential, conforme necessário.

  5. Crie um elemento <message> como filho do elemento <security>.

  6. Opcional. Defina o atributo algorithmSuite no elemento <message> com o valor apropriado. O padrão é Basic256.

  7. Opcional. Se uma chave de prova assimétrica for necessária, defina o atributo issuedKeyType do elemento <message> como AsymmetricKey. O padrão é SymmetricKey.

  8. Opcional. Defina o atributo issuedTokenType no elemento <message>.

  9. Obrigatório no cliente se nenhum emissor local for especificado. Opcional no serviço. Crie um elemento <issuer> como um filho do elemento <message>.

  10. Defina o atributo address como o elemento <issuer> e especifique o endereço no qual o serviço de token de segurança aceita solicitações de token.

  11. Opcional. Adicionar um elemento filho <identity> e especificar a identidade do serviço de token de segurança

  12. Para saber mais, confira Identidade de serviço e autenticação.

  13. Obrigatório no cliente se nenhum emissor local for especificado. Não usado no serviço. Crie um <elemento de associação> na seção da associações que pode ser usado para se comunicar com o serviço de token de segurança. Para obter mais informações sobre como criar uma associação, consulte Como especificar uma associação de serviço na configuração.

  14. Especifique a associação criada na etapa anterior definindo os atributos binding e bindingConfiguration do elemento <issuer>.

  15. Não usado no cliente; opcional no serviço. Crie um elemento <issuerMetadata> como um filho do elemento <message>. Em seguida, em um atributo address no elemento <issuerMetadata>, especifique o endereço no qual o serviço de token de segurança deve publicar seus metadados. Você também pode adicionar um elemento filho <identity> e especificar a identidade do serviço de token de segurança.

  16. Opcional no cliente e no serviço. Adicione um elemento <claimTypeRequirements> como filho do elemento <message>. Especifique as declarações necessárias e opcionais das quais o serviço depende adicionando elementos <add> ao elemento <claimTypeRequirements> e especificando o tipo de declaração com o atributo claimType. Especifique se uma determinada declaração é necessária ou opcional definindo o atributo isOptional.

Exemplo

O exemplo de código a seguir mostra o código para configurar um WSFederationHttpBinding imperativamente.

// 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

Confira também