Vorgehensweise: Erstellen einer WSFederationHttpBinding

In Windows Communication Foundation (WCF) stellt die WSFederationHttpBinding-Klasse (<wsFederationHttpBinding> in der Konfiguration) einen Mechanismus bereit, um einen Verbunddienst verfügbar zu machen. 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. Wird ein Dienstendpunkt mit einer WSFederationHttpBinding bereitgestellt, deren Sicherheitsmodus auf None festgelegt ist, ergibt sich für die Clientbindung (die vom ServiceModel Metadata Utility-Tool (Svcutil.exe) generiert wird) eine <xref:System.ServiceModel.WsHttpBinding> mit dem Sicherheitsmodus 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. Dies ist 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 lautet "http:\/\/docs.oasis-open.org\/wss\/oasis-wss SAML #SAMLV1.1".

  4. Dies ist 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 finden Sie unter 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 Algorithmussuite, 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 von WSFederationHttpBinding.

  2. Legen Sie die Mode-Eigenschaft gemäß Ihren Anforderungen auf WSFederationHttpSecurityMode oder WSFederationHttpSecurityMode 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 die IssuedKeyType-Eigenschaft gemäß Ihren Anforderungen auf SecurityKeyType SymmetricKey oder .AsymmetricKey fest.

  5. Legen Sie die IssuedTokenType-Eigenschaft auf einen geeigneten Wert fest. Ist kein Wert festgelegt, wird für WCF standardmäßig "http:\/\/docs.oasis-open.org\/wss\/oasis-wss-saml-token-profile-1.1#SAMLV1.1" verwendet. Diese Einstellung steht für SAML 1.1-Tokens.

  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 ein <wsFederationHttpBinding> als untergeordnetes Element des <Bindungen>-Elements in der Anwendungskonfigurationsdatei.

  2. Erstellen Sie ein <Bindung>-Element als untergeordnetes Element von <wsFederationHttpBinding>, und legen Sie das name-Attribut auf einen geeigneten Wert fest.

  3. Erstellen Sie ein <security>-Element als untergeordnetes Element des <Bindung>-Elements.

  4. Legen Sie das mode-Attribut des <security>``Message-Elements gemäß Ihren Anforderungen auf TransportWithMessageCredential oder fest.

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

  6. Dies ist optional. Legen Sie das algorithmSuite-Attribut des <message>-Elements auf einen geeigneten Wert fest. Die Standardeinstellung ist Basic256.

  7. Dies ist optional. Ist ein asymmetrischer Prüfschlüssel erforderlich, legen Sie das issuedKeyType-Attribut des <message>``AsymmetricKey-Elements auf fest. Die Standardeinstellung 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. Dies ist 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 im Bindungsbereich ein <Bindung>-Element, das für die Kommunikation mit dem Sicherheitstokendienst verwendet werden kann. Weitere Informationen finden Sie unter zum Erstellen einer Bindung finden Sie unter Vorgehensweise: Angeben einer Dienstbindung in einer 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;
}

Siehe auch

Verbund
Verbundbeispiel
Vorgehensweise: Deaktivieren sicherer Sitzungen auf einer WSFederationHttpBinding