Teilen über


Vorgehensweise: Erstellen einer WSFederationHttpBinding

In Windows Communication Foundation (WCF) bietet die WSFederationHttpBinding-Klasse (<wsFederationHttpBinding> in der Konfiguration) einen Mechanismus zur Darstellung eines Verbunddienstes. Hierbei handelt es sich um einen Dienst, der eine Clientauthentifizierung mithilfe eines von einem Sicherheitstokendienst ausgestellten Sicherheitstokens erfordert. In diesem Thema wird erläutert, wie WSFederationHttpBinding sowohl im Code als auch in der Konfiguration eingerichtet werden kann. Nach dem Erstellen der Bindung können Sie einen Endpunkt einrichten, von dem diese Bindung verwendet wird.

Die folgenden grundlegenden Schritte sind erforderlich:

  1. Wählen Sie einen Sicherheitsmodus aus. Von WSFederationHttpBinding wird Message unterstützt, wodurch sogar über mehrere Hops hinweg eine End-to-End-Sicherheit auf Nachrichtenebene erzielt wird. Zudem wird TransportWithMessageCredential unterstützt, um bei einer direkten HTTPS-Verbindung zwischen Client und Dienst eine höhere Leistung zu erzielen.

    Hinweis

    Von WSFederationHttpBinding wird als Sicherheitsmodus auch None unterstützt. Dieser Modus ist nicht sicher und wird nur zu Debuggingzwecken bereitgestellt. Wenn ein Dienstendpunkt mit einem WSFederationHttpBinding bereitgestellt wird, dessen Sicherheitsmodus auf None eingestellt ist, ist die resultierende Clientbindung (die vom ServiceModel Metadata Utility Tool (Svcutil.exe) generiert wird) eine WSHttpBinding mit einem Sicherheitsmodus von None.

    Im Gegensatz zu anderen vom System bereitgestellten Bindungen muss bei Verwendung von WSFederationHttpBinding kein Typ für die Clientanmeldeinformationen ausgewählt werden, da für die Anmeldeinformationen immer ein ausgestelltes Token verwendet wird. Der Grund: Für die Clientanmeldeinformationen wird immer ein ausgestelltes Token verwendet. Von WCF wird ein Token von einem angegebenen Aussteller abgerufen und dem Dienst zur Authentifizierung des Clients vorgelegt.

  2. Legen Sie auf Verbundclients die IssuerAddress-Eigenschaft auf die URL des Sicherheitstokendiensts fest. Legen Sie IssuerBinding auf die Bindung fest, die für die Kommunikation mit dem Sicherheitstokendienst verwendet werden soll.

  3. Optional. Legen Sie die IssuedTokenType-Eigenschaft auf den Uniform Resource Identifier (URI) eines Tokentyps fest. Geben Sie bei Verbunddiensten den Tokentyp an, der vom Dienst erwartet wird. Geben Sie bei Verbundclients den Tokentyp an, der durch den Client vom Sicherheitstokendienst angefordert wird.

    Ist kein Tokentyp angegeben, werden von den Clients WS-Trust Request Security-Tokens (RSTs) ohne Tokentyp-URI generiert, und von den Diensten wird standardmäßig eine Clientauthentifizierung mithilfe eines SAML 1.1-Tokens (Security Assertions Markup Language) erwartet.

    Der URI für ein SAML 1.1-Token ist http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1.

  4. Optional. Legen Sie bei Verbunddiensten die IssuerMetadataAddress-Eigenschaft auf die Metadaten-URL eines Sicherheitstokendiensts fest. Der Metadatenendpunkt ermöglicht den Clients des Diensts das Auswählen eines geeigneten Bindungs-/Endpunktpaars, sofern der Dienst zum Veröffentlichen von Metadaten konfiguriert ist. Weitere Informationen zum Veröffentlichen von Metadaten finden Sie unter Veröffentlichen von Metadaten.

Auch andere Eigenschaften können festgelegt werden. Dazu zählen unter anderem der Schlüsseltyp, der im ausgestellten Token als Prüfschlüssel verwendet wird, die zwischen Client und Dienst verwendete Algorithmussammlung, die Einstellung, ob die Dienstanmeldeinformationen ausgehandelt oder explizit angegeben werden, bestimmte Ansprüche, die vom Dienst im ausgestellten Token erwartet werden, sowie sämtliche zusätzliche XML-Elemente, die der vom Client an den Sicherheitstokendienst gesendeten Anforderung hinzugefügt werden müssen.

Hinweis

Die NegotiateServiceCredential-Eigenschaft ist nur relevant, wenn SecurityMode auf Message festgelegt ist. Ist SecurityMode auf TransportWithMessageCredential festgelegt, wird die NegotiateServiceCredential-Eigenschaft ignoriert.

So konfigurieren Sie WSFederationHttpBinding im Code

  1. Erstellen Sie eine Instanz der WSFederationHttpBinding.

  2. Legen Sie die Mode-Eigenschaft gemäß Ihren Anforderungen auf WSFederationHttpSecurityMode oder Message fest. Ist anstelle von Basic256 eine andere Algorithmussuite erforderlich, legen Sie die AlgorithmSuite-Eigenschaft auf ein Werttoken von SecurityAlgorithmSuite fest.

  3. Legen Sie die NegotiateServiceCredential-Eigenschaft auf einen geeigneten Wert fest.

  4. Legen Sie für die IssuedKeyType-Eigenschaft SecurityKeyType oder SymmetricKey fest.AsymmetricKey je nach Bedarf.

  5. Legen Sie die IssuedTokenType-Eigenschaft auf einen geeigneten Wert fest. Wenn kein Wert festgelegt wird, verwendet WCF standardmäßig http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1, was SAML 1.1-Tokens anzeigt.

  6. Ist erforderlich für den Client, wenn kein lokaler Aussteller angegeben ist. Optional für den Dienst. Erstellen Sie eine EndpointAddress mit der Adresse und den Identitätsinformationen des Sicherheitstokendiensts, und weisen Sie die EndpointAddress-Instanz der IssuerAddress-Eigenschaft zu.

  7. Erforderlich für den Client, wenn kein lokaler Aussteller angegeben ist. Wird nicht für den Dienst verwendet. Erstellen Sie eine Binding für SecurityTokenService, und weisen Sie die Binding-Instanz der IssuerBinding-Eigenschaft zu.

  8. Wird nicht für den Client verwendet. Optional für den Dienst. Erstellen Sie eine EndpointAddress-Instanz für die Metadaten des Sicherheitstokendiensts, und weisen Sie sie der IssuerMetadataAddress-Eigenschaft zu.

  9. Optional für Client und Dienst. Erstellen Sie mindestens eine ClaimTypeRequirement-Instanz, und fügen Sie sie der von der ClaimTypeRequirements-Eigenschaft zurückgegebenen Auflistung hinzu.

  10. Optional für Client und Dienst. Erstellen Sie mindestens eine XmlElement-Instanz, und fügen Sie sie der von der TokenRequestParameters-Eigenschaft zurückgegebenen Auflistung hinzu.

So erstellen Sie einen Verbundendpunkt in der Konfiguration

  1. Erstellen Sie eine <wsFederationHttpBinding> als untergeordnetes Element des <Bindungs>elements in der Anwendungskonfigurationsdatei.

  2. Erstellen Sie ein <Bindungs>element als untergeordnetes Element von <wsFederationHttpBinding> und setzen Sie das name-Attribut auf einen geeigneten Wert.

  3. Erstellen Sie ein <security>-Element als untergeordnetes Element des <Bindungs>elements.

  4. Legen Sie das -Attribut des -Elements gemäß Ihren Anforderungen auf oder fest.

  5. Erstellen Sie ein <message>-Element als untergeordnetes Element des <security>-Elements.

  6. Optional. Legen Sie das algorithmSuite-Attribut des <message>-Elements auf einen geeigneten Wert fest. Der Standardwert ist Basic256.

  7. Dies ist optional. Ist ein asymmetrischer Prüfschlüssel erforderlich, legen Sie das issuedKeyType-Attribut des <message> fest. Der Standardwert ist SymmetricKey.

  8. Dies ist optional. Legen Sie das issuedTokenType-Attribut des <message>-Elements fest.

  9. Ist erforderlich für den Client, wenn kein lokaler Aussteller angegeben ist. Optional für den Dienst. Erstellen Sie ein <issuer>-Element als untergeordnetes Element des <message>-Elements.

  10. Legen Sie das address-Attribut auf das <issuer>-Element fest, und geben Sie die Adresse an, unter der vom Sicherheitstokendienst Tokenanforderungen angenommen werden.

  11. Optional. Fügen Sie ein untergeordnetes <identity>-Element hinzu, und geben Sie die Identität des Sicherheitstokendiensts an.

  12. Weitere Informationen finden Sie unter Dienstidentität und -authentifizierung.

  13. Erforderlich für den Client, wenn kein lokaler Aussteller angegeben ist. Wird nicht für den Dienst verwendet. Erstellen Sie ein <Bindungs>element im Bindungsbereich, das verwendet werden kann. Weitere Informationen über das Erstellen einer Bindung finden Sie unter Vorgehensweise: Angeben einer Dienstbindung in der Konfiguration .

  14. Geben Sie die im vorangegangenen Schritt erstellte Bindung an, indem Sie das binding-Attribut und das bindingConfiguration-Attribut des <issuer>-Elements festlegen.

  15. Wird nicht für den Client verwendet. Optional für den Dienst. Erstellen Sie ein <issuerMetadata>-Element als untergeordnetes Element des <message>-Elements. Geben Sie anschließend in einem address-Attribut des <issuerMetadata>-Elements die Adresse an, unter der die Metadaten des Sicherheitstokendiensts veröffentlicht werden. Optional können Sie ein untergeordnetes <identity>-Element hinzufügen und die Identität des Sicherheitstokendiensts angeben.

  16. Optional für Client und Dienst. Fügen Sie ein <claimTypeRequirements>-Element als untergeordnetes Element des <message>-Elements hinzu. Geben Sie erforderliche und optionale Ansprüche an, auf denen der Dienst beruht, indem Sie dem <claimTypeRequirements>-Element <add>-Elemente hinzufügen und den Anspruchstyp mithilfe des claimType-Attributs angeben. Geben Sie an, ob ein bestimmter Anspruch erforderlich oder optional ist, indem Sie das isOptional-Attribut festlegen.

Beispiel

Das folgende Codebeispiel zeigt einen Code zum imperativen Einrichten einer 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

Siehe auch