Procedura: creare una classe WSFederationHttpBinding

In Windows Communication Foundation (WCF), la classe WSFederationHttpBinding (<wsFederationHttpBinding> nella configurazione) fornisce un meccanismo per esporre un servizio federato. ovvero un servizio che richiede ai client di autenticarsi usando un token di sicurezza rilasciato da un servizio token di sicurezza. In questo argomento viene illustrato come impostare una classe WSFederationHttpBinding nel codice e nella configurazione. Una volta creata l'associazione, è possibile impostare un endpoint per usarla.

I passaggi di base sono elencati di seguito:

  1. Selezionare una modalità di sicurezza. La classe WSFederationHttpBinding supporta Message, che assicura protezione end-to-end a livello di messaggio, anche su più hop, e TransportWithMessageCredential, che offre prestazioni migliori nei casi in cui il client e il servizio possono stabilire una connessione diretta su HTTPS.

    Nota

    La classe WSFederationHttpBinding supporta anche None come modalità di sicurezza. Questa modalità non è protetta e viene fornita solo a scopo di debug. Se un endpoint di servizio viene distribuito con WSFederationHttpBinding con la relativa modalità di sicurezza impostata su None, il binding client risultante (generato dallo strumento ServiceModel Metadata Utility (Svcutil.exe)) è WSHttpBinding con una modalità di sicurezza di None.

    Diversamente da altre associazioni fornite dal sistema, non è necessario selezionare un tipo di credenziale client quando si usa WSFederationHttpBinding, poiché il tipo di credenziale client è sempre un token rilasciato. WCF acquisisce un token da un'emittente specificato e lo presenta al servizio per autenticare il client.

  2. Sui client federati, impostare la proprietà IssuerAddress sull'URL del servizio token di sicurezza. Impostare la proprietà IssuerBinding sull'associazione da usare per comunicare con il servizio token di sicurezza.

  3. Facoltativo. Impostare la proprietà IssuedTokenType sull'URI (Uniform Resource Identifier) di un tipo di token. Nei servizi federati, specificare il tipo di token previsto dal servizio. Sui client federati, specificare il tipo di token richiesto dal client al servizio token di sicurezza.

    Se non viene specificato alcun tipo di token, i client generano token RST (Request Security Token) WS-Trust senza un URI del tipo di token e i servizi prevedono che l'autenticazione client venga eseguita, per impostazione predefinita, usando un token SAML (Security Assertions Markup Language) 1.1.

    L'URI per un token SAML 1.1 è http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1.

  4. Facoltativo. Sui servizi federati, impostare la proprietà IssuerMetadataAddress sull'URL dei metadati di un servizio token di sicurezza. L'endpoint dei metadati consente ai client del servizio di selezionare una coppia associazione/endpoint appropriata, se il servizio è configurato per pubblicare metadati. Per altre informazioni sulla pubblicazione dei metadati, vedere Pubblicazione di metadati.

È inoltre possibile impostare altre proprietà, inclusi tipo di chiave usato come chiave di prova nel token rilasciato, gruppo di algoritmi da usare tra il client e il servizio, indicazione circa la necessità di negoziare o specificare esplicitamente la credenziale del servizio, tutte le attestazioni specifiche che il servizio prevede che il token rilasciato contenga e qualsiasi elemento XML aggiuntivo da aggiungere alla richiesta inviata dal client al servizio token di sicurezza.

Nota

La proprietà NegotiateServiceCredential è rilevante solo quando SecurityMode è impostata su Message. Se SecurityMode è impostata su TransportWithMessageCredential, la proprietà NegotiateServiceCredential viene ignorata.

Per configurare una classe WSFederationHttpBinding nel codice

  1. Creare un'istanza di WSFederationHttpBinding.

  2. Impostare la proprietà Mode su WSFederationHttpSecurityMode o Message in base alle necessità. Se è necessario un gruppo di algoritmi diverso da Basic256, impostare la proprietà AlgorithmSuite su un valore ricavato da SecurityAlgorithmSuite.

  3. Impostare la proprietà NegotiateServiceCredential in base alle necessità.

  4. Impostare la proprietà IssuedKeyType su SecurityKeyType o SymmetricKey.AsymmetricKey in base alle esigenze.

  5. Impostare la proprietà IssuedTokenType sul valore appropriato. Se non è impostato alcun valore, WCF viene impostato per impostazione predefinita su http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1, che indica i token SAML 1.1.

  6. Obbligatorio sul client se non viene specificata alcuna emittente locale; facoltativo sul servizio. Creare una classe EndpointAddress che contenga le informazioni sull'indirizzo e l'identità del servizio token di sicurezza e assegnare l'istanza di EndpointAddress alla proprietà IssuerAddress.

  7. Obbligatorio sul client se non viene specificata alcuna emittente locale; non usato sul servizio. Creare un Binding per SecurityTokenService e assegnare l'istanza Binding alla proprietà IssuerBinding.

  8. Non usato sul client; facoltativo sul servizio. Creare un'istanza di EndpointAddress per i metadati del servizio token di sicurezza e assegnarla alla proprietà IssuerMetadataAddress.

  9. Facoltativo sul client e sul servizio. Creare e aggiungere una o più istanze di ClaimTypeRequirement alla raccolta restituita dalla proprietà ClaimTypeRequirements.

  10. Facoltativo sul client e sul servizio. Creare e aggiungere una o più istanze di XmlElement alla raccolta restituita dalla proprietà TokenRequestParameters.

Per creare un endpoint federato nella configurazione

  1. Creare un <wsFederationHttpBinding> come elemento figlio dell'<elemento di binding> nel file di configurazione dell'applicazione.

  2. Creare un elemento <binding> come elemento figlio di <wsFederationHttpBinding> e impostare l'attributo name su un valore appropriato.

  3. Creare un elemento <security> come elemento figlio dell'<elemento di binding>.

  4. Impostare l'attributo mode nell'elemento <security>TransportWithMessageCredential su un valore di Message o , in base alle necessità.

  5. Creare un elemento <message> come figlio dell'elemento <security>.

  6. Facoltativo. Impostare l'attributo algorithmSuite sull'elemento <message> con un valore appropriato. Il valore predefinito è Basic256.

  7. Facoltativo. Se è necessaria una chiave di prova asimmetrica, impostare l'attributo issuedKeyType dell'elemento <message>AsymmetricKey suAsymmetricKey. Il valore predefinito è SymmetricKey.

  8. Facoltativo. Impostare l'attributo issuedTokenType sull'elemento <message>.

  9. Obbligatorio sul client se non viene specificata alcuna emittente locale; facoltativo sul servizio. Creare un elemento <issuer> come figlio dell'elemento <message>.

  10. Impostare l'attributo address sull'elemento <issuer> e specificare l'indirizzo in cui il servizio token di sicurezza accetta richieste del token.

  11. Facoltativo. Aggiungere un elemento <identity> figlio e specificare l'identità del servizio token di sicurezza

  12. Per altre informazioni, vedere Identità del servizio e autenticazione.

  13. Obbligatorio sul client se non viene specificata alcuna emittente locale; non usato sul servizio. Creare un <elemento di binding> nella sezione binding che può essere usato per comunicare con il servizio token di sicurezza. Per altre informazioni sulla creazione di un elemento di binding, vedere Procedura: Specificare un binding di servizio nella configurazione.

  14. Specificare l'associazione creata nel passaggio precedente impostando gli attributi binding e bindingConfiguration dell'elemento <issuer>.

  15. Non usato sul client; facoltativo sul servizio. Creare un elemento <issuerMetadata> come figlio dell'elemento <message>. Quindi, in un attributo address sull'elemento <issuerMetadata>, specificare l'indirizzo in cui il servizio token di sicurezza deve pubblicare i propri metadati. Facoltativamente, aggiungere un elemento <identity> figlio e specificare l'identità del servizio token di sicurezza

  16. Facoltativo sul client e sul servizio. Aggiungere un elemento <claimTypeRequirements> come figlio dell'elemento <message>. Specificare le attestazioni obbligatorie e facoltative su cui si basa il servizio aggiungendo elementi <add> all'elemento <claimTypeRequirements> e specificando il tipo di attestazione con l'attributo claimType. Specificare se una determinata attestazione è obbligatoria o facoltativa impostando l'attributo isOptional.

Esempio

Nell'esempio seguente viene illustrato il codice per l'impostazione di una classe WSFederationHttpBinding in modo imperativo.

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

Vedi anche