Postupy: Vytvoření WSFederationHttpBinding

Ve Windows Communication Foundation (WCF) WSFederationHttpBinding třída (<wsFederationHttpBinding> v konfiguraci) poskytuje mechanismus pro zveřejnění federované služby. To znamená, že služba, která vyžaduje, aby se klienti ověřili pomocí tokenu zabezpečení vydaného službou tokenů zabezpečení. Toto téma ukazuje, jak nastavit WSFederationHttpBinding v kódu a konfiguraci. Po vytvoření vazby můžete nastavit koncový bod pro použití této vazby.

Základní kroky jsou popsány takto:

  1. Vyberte režim zabezpečení. Tento prvek podporuje WSFederationHttpBindingMessage, který poskytuje end-to-end zabezpečení na úrovni zprávy, a to i přes více zprostředkujících uzlů, a TransportWithMessageCredential, který umožňuje lepší výkon v případech, kdy klient a služba mohou vytvořit přímé připojení přes protokol HTTPS.

    Poznámka:

    Také podporuje WSFederationHttpBinding jako režim zabezpečení s None. Tento režim není zabezpečený a je k dispozici pouze pro účely ladění. Pokud je koncový bod služby nasazen s WSFederationHttpBinding režimem zabezpečení nastaveným na None, výsledná klientská vazba (vygenerovaná nástrojem ServiceModel Metadata Utility Tool (Svcutil.exe)) je WSHttpBinding s režimem Nonezabezpečení .

    Na rozdíl od jiných systémových vazeb není nutné při použití příkazu WSFederationHttpBindingvybrat typ přihlašovacích údajů klienta . Důvodem je, že typ přihlašovacích údajů klienta je vždy vydaný token. WCF získá token od zadaného vystavitele a tento token předá službě k ověření klienta.

  2. Na federovaných klientech nastavte IssuerAddress vlastnost na adresu URL služby tokenů zabezpečení. Nastavte IssuerBinding na vazbu, která se má použít ke komunikaci se službou tokenů zabezpečení.

  3. Nepovinné. Nastavte vlastnost IssuedTokenType na identifikátor URI (identifikátor URI, Uniform Resource Identifier) typu tokenu. U federovaných služeb zadejte typ tokenu, který služba očekává. U federovaných klientů zadejte typ tokenu, který klient požaduje ze služby tokenů zabezpečení.

    Pokud není zadán žádný typ tokenu, klienti ve výchozím nastavení generují tokeny zabezpečení žádosti WS-Trust (RST) bez identifikátoru URI typu tokenu a služby očekávají ověření klienta pomocí tokenu SAML (Security Assertions Markup Language) 1.1.

    Identifikátor URI tokenu SAML 1.1 je http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1.

  4. Nepovinné. U federovaných služeb nastavte IssuerMetadataAddress vlastnost na adresu URL metadat služby tokenů zabezpečení. Koncový bod metadat umožňuje klientům služby vybrat odpovídající dvojici vazeb nebo koncových bodů, pokud je služba nakonfigurovaná tak, aby publikovala metadata. Další informace o publikování metadat viz Publishing Metadata.

Můžete také nastavit další vlastnosti, včetně typu klíče použitého jako ověřovací klíč v vydaném tokenu, sady algoritmů, která se má použít mezi klientem a službou, ať už chcete vyjednat nebo explicitně zadat přihlašovací údaje služby, jakékoli konkrétní deklarace identity, které služba očekává, že vystavený token bude obsahovat, a všechny další elementy XML, které musí být přidány do požadavku, klient odešle do služby tokenů zabezpečení.

Poznámka:

Vlastnost NegotiateServiceCredential je relevantní pouze v případech, když je SecurityMode nastavena na Message hodnotu. Pokud SecurityMode je nastavena na TransportWithMessageCredential, pak NegotiateServiceCredential je vlastnost ignorována.

Překonfigurovat WSFederationHttpBinding v kódu

  1. Vytvořte instanci WSFederationHttpBinding.

  2. Mode Nastavte vlastnost na WSFederationHttpSecurityMode nebo Message podle potřeby. Pokud je požadována jiná sada algoritmů než Basic256, nastavte vlastnost AlgorithmSuite na hodnotu převzatou z SecurityAlgorithmSuite.

  3. Podle potřeby nastavte NegotiateServiceCredential vlastnost.

  4. Nastavte vlastnost IssuedKeyType na SecurityKeyTypeSymmetricKey nebo hodnotu. AsymmetricKey podle potřeby.

  5. IssuedTokenType Nastavte vlastnost na odpovídající hodnotu. Pokud není nastavena žádná hodnota, WCF použije výchozí nastavení http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1, což označuje tokeny SAML 1.1.

  6. Vyžaduje se na klientovi, pokud není zadán žádný místní vydavatel; volitelné na službě. Vytvořte objekt EndpointAddress obsahující informace o adrese a identitě služby tokenu zabezpečení a přiřaďte EndpointAddress instanci vlastnosti IssuerAddress .

  7. Je vyžadováno u klienta, pokud není zadán žádný místní vystavitel; nepoužívá se na službě. Vytvořte Binding pro SecurityTokenService a přiřaďte instanci Binding k vlastnosti IssuerBinding.

  8. Nepoužívá se na klientovi; volitelné ve službě. Vytvořte EndpointAddress instanci pro metadata služby tokenů zabezpečení a přiřaďte ji k IssuerMetadataAddress vlastnosti.

  9. Volitelné na klientské straně i na straně služby. Vytvořte a přidejte jednu nebo více ClaimTypeRequirement instancí do kolekce, kterou vrací vlastnost ClaimTypeRequirements.

  10. Volitelné na klientské straně i na straně služby. Vytvořte a přidejte jednu nebo více XmlElement instancí do kolekce, kterou vrací vlastnost TokenRequestParameters.

Vytvoření federovaného koncového bodu v konfiguraci

  1. Vytvořte <wsFederationHttpBinding> jako podřízený prvek elementu <bindings> v konfiguračním souboru aplikace.

  2. Vytvořte <prvek binding> jako podřízený prvek <wsFederationHttpBinding> a nastavte atribut name na odpovídající hodnotu.

  3. Vytvořte prvek <security> jako podřízený prvek elementu <vazby>.

  4. mode Nastavte atribut prvku <security> na hodnotu Message nebo TransportWithMessageCredential, podle potřeby.

  5. Vytvoření elementu <message> jako podřízeného <security> prvku

  6. Nepovinné. algorithmSuite Nastavte atribut prvku <message> s odpovídající hodnotou. Výchozí hodnota je Basic256.

  7. Nepovinné. Pokud je vyžadován asymetrický ověřovací klíč, nastavte issuedKeyType atribut <message> prvku na AsymmetricKey. Výchozí hodnota je SymmetricKey.

  8. Nepovinné. issuedTokenType Nastavte atribut prvku<message>.

  9. Vyžaduje se na klientovi, pokud není zadán žádný místní vydavatel; volitelné na službě. Vytvoření elementu <issuer> jako podřízeného <message> prvku

  10. address Nastavte atribut na <issuer> element a zadejte adresu, na které služba tokenu zabezpečení přijímá žádosti o tokeny.

  11. Nepovinné. Přidejte podřízený <identity> element a určete identitu služby tokenů zabezpečení

  12. Další informace najdete v tématu Identita služby a ověřování.

  13. Je vyžadováno u klienta, pokud není zadán žádný místní vystavitel; nepoužívá se na službě. V části vazby vytvořte <prvek vazby>, který lze použít ke komunikaci s bezpečnostním tokenovým serverem. Další informace o vytvoření vazby naleznete v tématu Postupy: Určení vazby služby v konfiguraci.

  14. Zadejte vazbu vytvořenou v předchozím kroku nastavením atributů binding a bindingConfiguration elementu <issuer>.

  15. Nepoužívá se na klientovi; volitelné ve službě. Vytvoření elementu <issuerMetadata> jako podřízeného <message> prvku Potom v address atributu prvku <issuerMetadata> zadejte adresu, na které má služba tokenu zabezpečení publikovat metadata. Volitelně můžete přidat <identity> podřízený prvek a zadat identitu služby tokenu zabezpečení.

  16. Volitelné na klientské straně i na straně služby. Přidání elementu <claimTypeRequirements> jako podřízeného <message> prvku Zadejte povinné a volitelné nároky, na které se služba spoléhá, tím, že do elementu < přidáte > a určíte typ nároku pomocí atributu . Určete, zda je daný nárok povinný, nebo nepovinný nastavením atributu isOptional.

Příklad

Následující ukázka kódu demonstruje, jak nastavit WSFederationHttpBinding imperativně.

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

Viz také