Dela via


Anvisningar: Skapa en WSFederationHttpBinding

I Windows Communication Foundation (WCF) WSFederationHttpBinding tillhandahåller klassen (<wsFederationHttpBinding> i konfigurationen) en mekanism för att exponera en federerad tjänst. Det vill: en tjänst som kräver att klienter autentiserar med hjälp av en säkerhetstoken som utfärdats av en säkerhetstokentjänst. Det här avsnittet visar hur du konfigurerar en WSFederationHttpBinding i både kod och konfiguration. När bindningen har skapats kan du konfigurera en slutpunkt för att använda bindningen.

De grundläggande stegen beskrivs på följande sätt:

  1. Välj ett säkerhetsläge. WSFederationHttpBinding Stöder Message, som ger säkerhet från slutpunkt till slutpunkt på meddelandenivå, även över flera hopp, och TransportWithMessageCredential, vilket ger bättre prestanda i fall där klienten och tjänsten kan upprätta en direkt anslutning via HTTPS.

    Kommentar

    Stöder WSFederationHttpBinding även None som säkerhetsläge. Det här läget är inte säkert och tillhandahålls endast i felsökningssyfte. Om en tjänstslutpunkt distribueras med en WSFederationHttpBinding med dess säkerhetsläge inställt på None, är den resulterande klientbindningen (genererad av ServiceModel Metadata Utility Tool (Svcutil.exe)) en WSHttpBinding med säkerhetsläget None.

    Till skillnad från andra bindningar som tillhandahålls av systemet är det inte nödvändigt att välja en klientautentiseringstyp när du använder WSFederationHttpBinding. Det beror på att klientautentiseringstypen alltid är en utfärdad token. WCF hämtar en token från en angiven utfärdare och presenterar den token för tjänsten för att autentisera klienten.

  2. På federerade klienter anger du IssuerAddress egenskapen till URL:en för säkerhetstokentjänsten. Ange till bindningen IssuerBinding som ska användas för att kommunicera med säkerhetstokentjänsten.

  3. Valfritt. IssuedTokenType Ange egenskapen till URI (Uniform Resource Identifier) för en tokentyp. På federerade tjänster anger du den tokentyp som tjänsten förväntar sig. På federerade klienter anger du tokentypen klientbegäranden från säkerhetstokentjänsten.

    Om ingen tokentyp anges genererar klienterna säkerhetstoken för WS-Trust Request (RST) utan en tokentyps-URI, och tjänster förväntar sig klientautentisering med hjälp av en SAML-token (Security Assertions Markup Language) 1.1 som standard.

    URI:n för en SAML 1.1-token är http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1.

  4. Valfritt. På federerade tjänster anger du IssuerMetadataAddress egenskapen till metadata-URL:en för en säkerhetstokentjänst. Med metadataslutpunkten kan tjänstens klienter välja ett lämpligt bindnings-/slutpunktspar, om tjänsten är konfigurerad för att publicera metadata. Mer information om hur du publicerar metadata finns i Publicera metadata.

Du kan också ange andra egenskaper, inklusive den typ av nyckel som används som en bevisnyckel i den utfärdade token, algoritmsviten som ska användas mellan klienten och tjänsten, om du vill förhandla om eller uttryckligen ange tjänstens autentiseringsuppgifter, eventuella specifika anspråk som tjänsten förväntar sig att den utfärdade token ska innehålla och eventuella ytterligare XML-element som måste läggas till i begäran som klienten skickar till säkerhetstokentjänsten.

Kommentar

Egenskapen NegotiateServiceCredential är bara relevant när är inställd på SecurityModeMessage. Om SecurityMode är inställt på TransportWithMessageCredentialNegotiateServiceCredential ignoreras egenskapen.

Så här konfigurerar du en WSFederationHttpBinding i kod

  1. Skapa en instans av WSFederationHttpBinding.

  2. Ange egenskapen Mode till WSFederationHttpSecurityMode eller Message efter behov. Om en annan algoritmsvit än Basic256 krävs anger du AlgorithmSuite egenskapen till ett värde som hämtats från SecurityAlgorithmSuite.

  3. Ange egenskapen NegotiateServiceCredential efter behov.

  4. Ange egenskapen IssuedKeyType till SecurityKeyTypeSymmetricKey eller .AsymmetricKey efter behov.

  5. IssuedTokenType Ange egenskapen till lämpligt värde. Om inget värde har angetts är WCF standardvärdet http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1, vilket anger SAML 1.1-token.

  6. Krävs på klienten om ingen lokal utfärdare har angetts. valfritt för tjänsten. Skapa en EndpointAddress som innehåller adress- och identitetsinformation för säkerhetstokentjänsten och tilldela instansen EndpointAddressIssuerAddress till egenskapen.

  7. Krävs på klienten om ingen lokal utfärdare har angetts. används inte i tjänsten. Skapa en Binding för SecurityTokenService och tilldela instansen Binding till egenskapen IssuerBinding .

  8. Används inte på klienten. valfritt för tjänsten. Skapa en EndpointAddress instans för metadata för säkerhetstokentjänsten och tilldela den till IssuerMetadataAddress egenskapen.

  9. Valfritt för både klienten och tjänsten. Skapa och lägg till en eller flera ClaimTypeRequirement instanser i samlingen som returneras av ClaimTypeRequirements egenskapen.

  10. Valfritt för både klienten och tjänsten. Skapa och lägg till en eller flera XmlElement instanser i samlingen som returneras av TokenRequestParameters egenskapen.

Skapa en federerad slutpunkt i konfigurationen

  1. Skapa en wsFederationHttpBinding> som underordnad <bindningselementet i programkonfigurationsfilen>.<

  2. Skapa ett <bindningselement> som underordnat< wsFederationHttpBinding> och ange name attributet till ett lämpligt värde.

  3. Skapa ett <security> element som underordnat bindningselement<>.

  4. mode Ange attributet för elementet <security> till värdet Message eller TransportWithMessageCredential, efter behov.

  5. Skapa ett <message> element som underordnat element.<security>

  6. Valfritt. algorithmSuite Ange attributet för elementet <message> med ett lämpligt värde. Standardvärdet är Basic256.

  7. Valfritt. Om en asymmetrisk bevisnyckel krävs anger du issuedKeyType -attributet för elementet <message> till AsymmetricKey. Standardvärdet är SymmetricKey.

  8. Valfritt. issuedTokenType Ange attributet för elementet<message>.

  9. Krävs på klienten om ingen lokal utfärdare har angetts. valfritt för tjänsten. Skapa ett <issuer> element som underordnat element.<message>

  10. address Ange attributet till elementet <issuer> och ange adressen där tjänsten för säkerhetstoken accepterar tokenbegäranden.

  11. Valfritt. Lägg till ett underordnat <identity> element och ange identiteten för säkerhetstokentjänsten

  12. Mer information finns i Tjänstidentitet och autentisering.

  13. Krävs på klienten om ingen lokal utfärdare har angetts. används inte i tjänsten. Skapa ett <bindningselement> i avsnittet bindningar som kan användas för att kommunicera med säkerhetstokentjänsten. Mer information om hur du skapar en bindning finns i Så här anger du en tjänstbindning i konfigurationen.

  14. Ange bindningen som skapades i föregående steg genom att ange elementets binding<issuer> attribut och bindingConfiguration .

  15. Används inte på klienten. valfritt för tjänsten. Skapa ett <issuerMetadata> element som underordnat element.<message> I ett address attribut i -elementet <issuerMetadata> anger du sedan adressen där säkerhetstokentjänsten ska publicera sina metadata. Du kan också lägga till ett <identity> underordnat element och ange identiteten för säkerhetstokentjänsten.

  16. Valfritt för både klienten och tjänsten. Lägg till ett <claimTypeRequirements> element som underordnat element.<message> Ange obligatoriska och valfria anspråk som tjänsten förlitar sig på genom att lägga till <>element i elementet <claimTypeRequirements> och ange anspråkstypen med claimType attributet. Ange om ett visst anspråk krävs eller är valfritt genom att ange attributet isOptional .

Exempel

Följande kodexempel visar kod för att konfigurera en WSFederationHttpBinding imperativt.

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

Se även