Condividi tramite


Procedura: creare una classe WSFederationHttpBinding

In Windows Communication Foundation (WCF), la classe WSFederationHttpBinding (wsFederationHttpBinding element nella configurazione) fornisce un meccanismo per l'esposizione di un servizio federato, ovvero un servizio che richiede ai client di autenticarsi utilizzando 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 utilizzarla.

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.

    Aa347982.note(it-it,VS.100).gifNota:
    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 una classe WSFederationHttpBinding e la relativa modalità di sicurezza impostata su None, l'associazione client che ne risulta (generata da Strumento ServiceModel Metadata Utility Tool (Svcutil.exe)) è una classe WsHttpBinding con una modalità di sicurezza None.

    Diversamente da altre associazioni fornite dal sistema, non è necessario selezionare un tipo di credenziale client quando si utilizza WSFederationHttpBinding, poiché il tipo di credenziale client è sempre un token rilasciato. WCF acquisisce un token da un'emittente 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 utilizzare 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, utilizzando 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 ulteriori informazioni su sulla pubblicazione di metadati, vedere Pubblicazione di metadati.

È inoltre possibile impostare altre proprietà, inclusi tipo di chiave utilizzato come chiave di prova nel token rilasciato, suite di algoritmi da utilizzare 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.

Aa347982.note(it-it,VS.100).gifNota:
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 Message o TransportWithMessageCredential in base alle necessità. Se è necessaria una suite di algoritmi diversa da Basic256, impostare la proprietà AlgorithmSuite su un valore derivato da SecurityAlgorithmSuite.

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

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

  5. Impostare la proprietà IssuedTokenType sul valore appropriato. Se non viene impostato alcun valore, WCF utilizza per impostazione predefinita , che indica 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 utilizzato sul servizio. Creare una classe Binding per SecurityTokenService e assegnare l'istanza di Binding alla proprietà IssuerBinding.

  8. Non utilizzato 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 element come figlio dell'elemento <bindings> nel file di configurazione dell'applicazione.

  2. Creare un elemento binding come figlio dell'wsFederationHttpBinding element e impostare l'attributo name su un valore appropriato.

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

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

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

  6. Facoltativo. Impostare l'attributo algorithmSuite sull'elemento <message> con un valore appropriato. L'impostazione predefinita è Basic256.

  7. Facoltativo. Se è necessaria una chiave di prova asimmetrica, impostare l'attributo issuedKeyType dell'elemento <message>AsymmetricKey su . L'impostazione predefinita è 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><message> come figlio dell'elemento .

  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 ulteriori informazioni, vedere Identità del servizio e autenticazione.

  13. Obbligatorio sul client se non viene specificata alcuna emittente locale; non utilizzato sul servizio. Creare l'elemento <binding> nella sezione delle associazioni utilizzabile per comunicare con il servizio token di sicurezza. Per ulteriori informazioni su sulla creazione di un'associazione, vedere Procedura: specificare un'associazione al servizio in configurazione.

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

  15. Non utilizzato 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><message> come figlio dell'elemento . Specificare le attestazioni obbligatorie e facoltative su cui si basa il servizio aggiungendo elementi <add> of <claimTypeRequirements><claimTypeRequirements>claimType all'elemento e specificando il tipo di attestazione con l'attributo . 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("https://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("https://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;
}

Vedere anche

Attività

Esempio di federazione
Procedura: disattivare sessioni protette in un'associazione WSFederationHttpBinding

Concetti

Federazione