Udostępnij za pośrednictwem


Instrukcje: tworzenie elementu WSFederationHttpBinding

W programie Windows Communication Foundation (WCF) WSFederationHttpBinding klasa (<wsFederationHttpBinding w konfiguracji) udostępnia mechanizm uwidaczniania> usługi federacyjnej. Oznacza to, że usługa, która wymaga od klientów uwierzytelniania przy użyciu tokenu zabezpieczającego wystawionego przez usługę tokenu zabezpieczającego. W tym temacie pokazano, jak skonfigurować WSFederationHttpBinding element w kodzie i konfiguracji. Po utworzeniu powiązania można skonfigurować punkt końcowy do korzystania z tego powiązania.

Podstawowe kroki zostały opisane w następujący sposób:

  1. Wybierz tryb zabezpieczeń. Obsługuje WSFederationHttpBinding element Message, który zapewnia kompleksowe zabezpieczenia na poziomie komunikatów, nawet w wielu przeskokach i TransportWithMessageCredential, co zapewnia lepszą wydajność w przypadkach, gdy klient i usługa mogą nawiązać bezpośrednie połączenie za pośrednictwem protokołu HTTPS.

    Uwaga

    Element WSFederationHttpBinding obsługuje None również tryb zabezpieczeń. Ten tryb nie jest bezpieczny i jest udostępniany tylko do celów debugowania. Jeśli punkt końcowy usługi jest wdrażany z WSFederationHttpBinding ustawionym trybem Nonezabezpieczeń na , wynikowe powiązanie klienta (generowane przez narzędzie ServiceModel Metadata Tool (Svcutil.exe)) jest WSHttpBinding elementem z trybem Nonezabezpieczeń .

    W przeciwieństwie do innych powiązań dostarczonych przez system nie jest konieczne wybranie typu poświadczeń klienta w przypadku korzystania z elementu WSFederationHttpBinding. Jest to spowodowane tym, że typ poświadczeń klienta jest zawsze wystawionym tokenem. Program WCF uzyskuje token od określonego wystawcy i przedstawia ten token usłudze w celu uwierzytelnienia klienta.

  2. Na klientach federacyjnych ustaw IssuerAddress właściwość na adres URL usługi tokenu zabezpieczającego. IssuerBinding Ustaw wartość na powiązanie, które ma być używane do komunikowania się z usługą tokenu zabezpieczającego.

  3. Opcjonalny. IssuedTokenType Ustaw właściwość na identyfikator URI (Uniform Resource Identifier) typu tokenu. W usługach federacyjnych określ typ tokenu oczekiwany przez usługę. Na klientach federacyjnych określ typ tokenu żądania klienta z usługi tokenu zabezpieczającego.

    Jeśli nie określono żadnego typu tokenu, klienci generują tokeny zabezpieczające żądania zaufania WS(RST) bez identyfikatora URI typu tokenu, a usługi oczekują uwierzytelniania klienta przy użyciu tokenu SAML (Security Assertions Markup Language) 1.1 domyślnie.

    Identyfikator URI tokenu SAML 1.1 to http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1.

  4. Opcjonalny. W usługach federacyjnych ustaw IssuerMetadataAddress właściwość na adres URL metadanych usługi tokenu zabezpieczającego. Punkt końcowy metadanych umożliwia klientom usługi wybranie odpowiedniej pary powiązania/punktu końcowego, jeśli usługa jest skonfigurowana do publikowania metadanych. Aby uzyskać więcej informacji na temat publikowania metadanych, zobacz Publikowanie metadanych.

Można również ustawić inne właściwości, w tym typ klucza używanego jako klucz dowodowy w wystawionym tokenie, zestaw algorytmów do użycia między klientem a usługą, niezależnie od tego, czy negocjować, czy jawnie określić poświadczenia usługi, wszelkie określone oświadczenia, które usługa oczekuje, że wystawiony token ma zawierać, oraz wszelkie dodatkowe elementy XML, które muszą zostać dodane do żądania, które klient wysyła do usługi tokenu zabezpieczającego.

Uwaga

Właściwość NegotiateServiceCredential jest istotna tylko wtedy, gdy właściwość jest ustawiona SecurityMode na Messagewartość . Jeśli SecurityMode jest ustawiona TransportWithMessageCredentialwartość NegotiateServiceCredential , właściwość jest ignorowana.

Aby skonfigurować element WSFederationHttpBinding w kodzie

  1. Utwórz wystąpienie elementu WSFederationHttpBinding.

  2. Ustaw właściwość na WSFederationHttpSecurityMode lub Message zgodnie z Mode potrzebami. Jeśli pakiet algorytmów inny niż Basic256 jest wymagany, ustaw AlgorithmSuite właściwość na wartość pobraną z SecurityAlgorithmSuiteklasy .

  3. NegotiateServiceCredential Ustaw odpowiednią właściwość.

  4. IssuedKeyType Ustaw właściwość na SecurityKeyTypeSymmetricKey lub .AsymmetricKey zgodnie z wymaganiami.

  5. IssuedTokenType Ustaw właściwość na odpowiednią wartość. Jeśli żadna wartość nie jest ustawiona, domyślna http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1wartość WCF to , która wskazuje tokeny SAML 1.1.

  6. Wymagane na kliencie, jeśli nie określono lokalnego wystawcy; opcjonalnie w usłudze. Utwórz obiekt EndpointAddress zawierający informacje o adresie i tożsamości usługi tokenu zabezpieczającego i przypisz EndpointAddress wystąpienie do IssuerAddress właściwości .

  7. Wymagane na kliencie, jeśli nie określono lokalnego wystawcy; nie jest używany w usłudze. Binding Utwórz element dla klasy SecurityTokenService i przypisz Binding wystąpienie do IssuerBinding właściwości .

  8. Nieużywana na kliencie; opcjonalnie w usłudze. EndpointAddress Utwórz wystąpienie dla metadanych usługi tokenu zabezpieczającego i przypisz je do IssuerMetadataAddress właściwości .

  9. Opcjonalnie zarówno na kliencie, jak i w usłudze. Utwórz i dodaj co najmniej jedno ClaimTypeRequirement wystąpienie do kolekcji zwróconej ClaimTypeRequirements przez właściwość .

  10. Opcjonalnie zarówno na kliencie, jak i w usłudze. Utwórz i dodaj co najmniej jedno XmlElement wystąpienie do kolekcji zwróconej TokenRequestParameters przez właściwość .

Aby utworzyć federacyjny punkt końcowy w konfiguracji

  1. Utwórz element <wsFederationHttpBinding> jako element podrzędny< elementu bindings> w pliku konfiguracji aplikacji.

  2. Utwórz element powiązania> jako element podrzędny elementu <wsFederationHttpBinding> i ustaw name atrybut na odpowiednią wartość.<

  3. Utwórz <security> element jako element podrzędny <elementu powiązania> .

  4. mode Ustaw atrybut elementu na <security> wartość Message lub TransportWithMessageCredential, zgodnie z potrzebami.

  5. <message> Utwórz element jako element podrzędny <security> elementu.

  6. Opcjonalny. Ustaw atrybut na elemecie algorithmSuite <message> z odpowiednią wartością. Wartość domyślna to Basic256.

  7. Opcjonalny. Jeśli wymagany jest klucz dowodu asymetrycznego, ustaw issuedKeyType atrybut elementu <message> na AsymmetricKey. Wartość domyślna to SymmetricKey.

  8. Opcjonalny. issuedTokenType Ustaw atrybut w elemecie <message> .

  9. Wymagane na kliencie, jeśli nie określono lokalnego wystawcy; opcjonalnie w usłudze. <issuer> Utwórz element jako element podrzędny <message> elementu.

  10. address Ustaw atrybut na <issuer> element i określ adres, pod którym usługa tokenu zabezpieczającego akceptuje żądania tokenu.

  11. Opcjonalny. Dodawanie elementu podrzędnego <identity> i określanie tożsamości usługi tokenu zabezpieczającego

  12. Aby uzyskać więcej informacji, zobacz Service Identity and Authentication (Tożsamość usługi i uwierzytelnianie).

  13. Wymagane na kliencie, jeśli nie określono lokalnego wystawcy; nie jest używany w usłudze. <Utwórz element powiązania> w sekcji powiązania, który może służyć do komunikowania się z usługą tokenu zabezpieczającego. Aby uzyskać więcej informacji na temat tworzenia powiązania, zobacz How to: Specify a Service Binding in Configuration (Instrukcje: określanie powiązania usługi w konfiguracji).

  14. Określ powiązanie utworzone w poprzednim kroku, ustawiając binding atrybuty i bindingConfiguration elementu <issuer> .

  15. Nieużywana na kliencie; opcjonalnie w usłudze. <issuerMetadata> Utwórz element jako element podrzędny <message> elementu. Następnie w atrybucie address elementu określ adres, pod którym usługa tokenu zabezpieczającego <issuerMetadata> ma opublikować swoje metadane. Opcjonalnie dodaj element podrzędny <identity> i określ tożsamość usługi tokenu zabezpieczającego.

  16. Opcjonalnie zarówno na kliencie, jak i w usłudze. <claimTypeRequirements> Dodaj element jako element podrzędny <message> elementu. Określ wymagane i opcjonalne oświadczenia, na których polega usługa, dodając <>elementy do <claimTypeRequirements> elementu i określając typ oświadczenia za pomocą atrybutu .claimType Określ, czy dane oświadczenie jest wymagane, czy opcjonalne, ustawiając isOptional atrybut.

Przykład

Poniższy przykładowy kod przedstawia kod umożliwiający skonfigurowanie elementu imperatywnego WSFederationHttpBinding .

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

Zobacz też