Como: Criar um WSFederationHttpBinding

No Windows Communication Foundation (WCF), 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 no 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 da seguinte forma:

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

    Nota

    O WSFederationHttpBinding também suporta None como um modo de segurança. Este 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 com seu modo de segurança definido como None, a associação de cliente resultante (gerada pela ServiceModel Metadata Utility Tool (Svcutil.exe)) será com WSHttpBinding um 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 IssuerAddress propriedade 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 IssuedTokenType propriedade como o URI (Uniform Resource Identifier) de um tipo de token. Em serviços federados, especifique o tipo de token que o serviço espera. 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 (WS-Trust Request Security Tokens) sem um URI do tipo de token e os serviços esperam 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 IssuerMetadataAddress propriedade 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 vinculação/ponto de extremidade apropriado, se o serviço estiver configurado para publicar metadados. Para obter mais informações sobre como publicar metadados, consulte Publicando metadados.

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

Nota

A NegotiateServiceCredential propriedade só é relevante quando o SecurityMode está definido como Message. Se SecurityMode estiver definido como TransportWithMessageCredential, a NegotiateServiceCredential propriedade será ignorada.

Para configurar um WSFederationHttpBinding no código

  1. Crie uma instância de WSFederationHttpBinding.

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

  3. Defina a NegotiateServiceCredential propriedade conforme apropriado.

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

  5. Defina a IssuedTokenType propriedade com o valor apropriado. Se nenhum valor for definido, o padrão WCF será , o http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1que 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 o endereço e as informações de identidade do serviço de token de segurança e atribua a EndpointAddress instância à IssuerAddress propriedade.

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

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

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

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

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 binding> como filho de< wsFederationHttpBinding> e defina o name atributo como um valor apropriado.

  3. Crie um <security> elemento como filho do <elemento de ligação> .

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

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

  6. Opcional. Defina o algorithmSuite <message> atributo no elemento com um valor apropriado. A predefinição é Basic256.

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

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

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

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

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

  12. Para obter mais informações, consulte Identidade e autenticação do serviço.

  13. Obrigatório no cliente se nenhum emissor local for especificado; não utilizado no serviço. Crie um <elemento binding> na seção bindings que possa 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 binding atributos e bindingConfiguration do <issuer> elemento .

  15. Não utilizado no cliente; opcional no serviço. Crie um <issuerMetadata> elemento como filho do <message> elemento. Em seguida, em um address atributo no <issuerMetadata> elemento , especifique o endereço no qual o serviço de token de segurança publicará seus metadados. Opcionalmente, adicione um <identity> elemento filho e especifique a identidade do serviço de token de segurança.

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

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

Consulte também