Provider di token rilasciati in modo durevoleDurable Issued Token Provider

Questo esempio illustra come implementare un provider di token rilasciato del client personalizzato.This sample demonstrates how to implement a custom client issued token provider.

DiscussioneDiscussion

Un provider di token in Windows Communication Foundation (WCF) viene utilizzato per fornire credenziali all'infrastruttura di sicurezza.A token provider in Windows Communication Foundation (WCF) is used to supply credentials to the security infrastructure. In generale, il provider di token esamina la destinazione ed emette credenziali adatte in modo che l'infrastruttura di sicurezza possa proteggere il messaggio.The token provider in general examines the target and issues appropriate credentials so that the security infrastructure can secure the message. WCF viene fornito con un CardSpaceCardSpace provider di token.WCF ships with a CardSpaceCardSpace token provider. I provider di token personalizzati sono utili nei casi seguenti:Custom token providers are useful in the following cases:

  • Se è disponibile un archivio di credenziali con cui il provider di token incluso non è in grado di operare.If you have a credential store that the built-in token provider cannot operate with.

  • Se si desidera fornire un meccanismo personalizzato per la trasformazione delle credenziali dal punto di cui l'utente fornisce i dettagli a quando il client WCF Usa le credenziali.If you want to provide your own custom mechanism for transforming the credentials from the point when the user provides the details to when the WCF client uses the credentials.

  • Se si sta compilando un token personalizzato.If you are building a custom token.

Questo esempio illustra come compilare un provider di token personalizzato che memorizza nella cache token rilasciati da un servizio token di sicurezza (STS, Security Token Service).This sample shows how to build a custom token provider that caches tokens issued by a Security Token Service (STS).

Per riassumere, questo esempio dimostra quanto segue.To summarize, this sample demonstrates the following:

  • Come è possibile configurare un client con un provider personalizzato.How a client can be configured with a custom token provider.

  • La modalità token rilasciati possono essere memorizzati nella cache e fornito al client WCF.How issued tokens can be cached and provided to the WCF client.

  • Come viene autenticato il servizio dal client mediante il certificato X.509 del server.How the server is authenticated by the client using the server's X.509 certificate.

L'esempio è costituito da un programma console del client (Client.exe), da un programma console del servizio token di sicurezza (Securitytokenservice.exe) e da un programma console del servizio (Service.exe).This sample consists of a client console program (Client.exe), a security token service console program (Securitytokenservice.exe) and a service console program (Service.exe). Il servizio implementa un contratto che definisce un modello di comunicazione richiesta/risposta.The service implements a contract that defines a request-reply communication pattern. Il contratto è definito dall'interfaccia ICalculator che espone operazioni matematiche (somma, sottrazione, moltiplicazione e divisione).The contract is defined by the ICalculator interface, which exposes math operations (add, subtract, multiply, and divide). Il client riceve un token di sicurezza dal servizio token di sicurezza (STS), esegue richieste sincrone al servizio per un'operazione matematica specificata e il servizio risponde fornendo il risultato.The client gets a security token from the Security Token Service (STS) and makes synchronous requests to the service for a given math operation and the service replies with the result. L'attività del client è visibile nella finestra della console.Client activity is visible in the console window.

Nota

La procedura di installazione e le istruzioni di compilazione per questo esempio si trovano alla fine di questo argomento.The set-up procedure and build instructions for this sample are located at the end of this topic.

In questo esempio espone il contratto ICalculator utilizzando il <wsHttpBinding >.This sample exposes the ICalculator contract using the <wsHttpBinding>. La configurazione di quest'associazione sul client viene illustrata nel codice seguente.The configuration of this binding on the client is shown in the following code.

<bindings>
  <wsFederationHttpBinding>
    <binding name="ServiceFed">
      <security mode="Message">
        <message issuedKeyType="SymmetricKey" 
                 issuedTokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1">
          <issuer address="http://localhost:8000/sts/windows" 
                  binding="wsHttpBinding" />
        </message>
      </security>
    </binding>
  </wsFederationHttpBinding>
</bindings>  

Nell'elemento security di wsFederationHttpBinding, il valore mode configura quale modalità di sicurezza deve essere utilizzata.On the security element of wsFederationHttpBinding, the mode value configures which security mode should be used. In questo esempio viene utilizzata la sicurezza dei messaggi; per tale motivo, l'elemento message di wsFederationHttpBinding viene specificato all'interno dell'elemento security di wsFederationHttpBinding.In this sample, messages security is being used, which is why the message element of wsFederationHttpBinding is specified inside the security element of wsFederationHttpBinding. L'elemento issuer di wsFederationHttpBinding all'interno dell'elemento message di wsFederationHttpBinding specifica l'indirizzo e l'associazione per il servizio token di sicurezza che rilascia un token di sicurezza al client, in modo che quest'ultimo possa autenticarsi presso il servizio di calcolatrice.The issuer element of wsFederationHttpBinding inside the message element of wsFederationHttpBinding specifies the address and binding for the Security Token Service that issues a security token to the client so that the client can authenticate to the Calculator service.

La configurazione di quest'associazione sul servizio viene illustrata nel seguente codice.The configuration of this binding on the service is shown in the following code.

<bindings>
  <wsFederationHttpBinding>
    <binding name="ServiceFed">
      <security mode="Message">
        <message issuedKeyType="SymmetricKey" 
                 issuedTokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1">
          <issuerMetadata address="http://localhost:8000/sts/mex">
            <identity>
              <certificateReference storeLocation="CurrentUser" 
                                    storeName="TrustedPeople" 
                                    x509FindType="FindBySubjectDistinguishedName" 
                                    findValue="CN=STS" />
            </identity>
          </issuerMetadata>
        </message>
      </security>
    </binding>
  </wsFederationHttpBinding>
</bindings>  

Nell'elemento security di wsFederationHttpBinding, il valore mode configura quale modalità di sicurezza deve essere utilizzata.On the security element of wsFederationHttpBinding, the mode value configures which security mode should be used. In questo esempio viene utilizzata la sicurezza dei messaggi; per tale motivo, l'elemento message di wsFederationHttpBinding viene specificato all'interno dell'elemento security di wsFederationHttpBinding.In this sample, messages security is being used, which is why the message element of wsFederationHttpBinding is specified inside the security element of wsFederationHttpBinding. L'elemento issuerMetadata di wsFederationHttpBinding all'interno dell'elemento message di wsFederationHttpBinding specifica l'indirizzo e l'identità di un endpoint che può essere utilizzato per recuperare metadati per il servizio token di sicurezza.The issuerMetadata element of wsFederationHttpBinding inside the message element of wsFederationHttpBinding specifies the address and identity for an endpoint that can be used to retrieve metadata for the Security Token Service.

Il comportamento per il servizio viene illustrato nel codice seguente.The behavior for the service is shown in the following code.

<behavior name="ServiceBehavior">
  <serviceDebug includeExceptionDetailInFaults="true" />
  <serviceMetadata httpGetEnabled="true" />
  <serviceCredentials>
    <issuedTokenAuthentication>
      <knownCertificates>
        <add storeLocation="LocalMachine" 
              storeName="TrustedPeople" 
              x509FindType="FindBySubjectDistinguishedName" 
              findValue="CN=STS" />
      </knownCertificates>
    </issuedTokenAuthentication>
    <serviceCertificate storeLocation="LocalMachine" 
                        storeName="My" 
                        x509FindType="FindBySubjectDistinguishedName" 
                        findValue="CN=localhost" />
  </serviceCredentials>
</behavior>  

L'elemento issuedTokenAuthentication all'interno dell'elemento serviceCredentials consente al servizio di specificare i vincoli nei token che i client possono presentare durante l'autenticazione.The issuedTokenAuthentication element inside the serviceCredentials element allows the service to specify constraints on the tokens it allows clients to present during authentication. Questa configurazione specifica che i token firmati da un certificato il cui Nome soggetto è CN=STS possono essere accettati dal servizio.This configuration specifies that tokens signed by a certificate whose Subject Name is CN=STS are accepted by the service.

Il servizio token di sicurezza espone un solo endpoint utilizzando l'elemento wsHttpBinding standard.The Security Token Service exposes a single endpoint using the standard wsHttpBinding. Il servizio token di sicurezza risponde alle richieste di token dei client e, se il client si autentica utilizzando un account di Windows, emette un token che contiene il nome utente del client come attestazione nel token emesso.The Security Token Service responds to request from clients for tokens and, provided the client authenticates using a Windows account, issues a token that contains the client's user name as a claim in the issued token. Come parte del processo di creazione del token, il servizio token di protezione firma il token utilizzando la chiave privata associata al certificato CN=STS .As part of creating the token, the Security Token Service signs the token using the private key associated with the CN=STS certificate. Crea, inoltre, una chiave simmetrica e la crittografa utilizzando la chiave pubblica associata al certificato CN=localhost.In addition, it creates a symmetric key and encrypts it using the public key associated with the CN=localhost certificate. Nel restituire il token al client, il servizio token di protezione restituisce anche la chiave simmetrica.In returning the token to the client, the Security Token Service also returns the symmetric key. Il client presenta il token emesso al servizio di calcolatrice e dimostra che conosce la chiave simmetrica firmando il messaggio con quella chiave.The client presents the issued token to the Calculator service, and proves that it knows the symmetric key by signing the message with that key.

Credenziali client e servizio token di protezione personalizzatiCustom Client Credentials and Token Provider

I passaggi seguenti mostrano come sviluppare un provider di token personalizzato che memorizza nella cache i token rilasciati e integrarlo con WCF: protezione.The following steps show how to develop a custom token provider that caches issued tokens and integrate it with WCF: security.

Per sviluppare un provider di token personalizzatoTo develop a custom token provider

  1. Scrivere un provider di token personalizzati.Write a custom token provider.

    L'esempio implementa un provider di token personalizzato che restituisce un token di sicurezza recuperato da una cache.The sample implements a custom token provider that returns a security token retrieved from a cache.

    Per eseguire questa attività il provider di token personalizzato deriva dalla classe SecurityTokenProvider ed esegue l'override del metodo GetTokenCore.To perform this task, the custom token provider derives the SecurityTokenProvider class and overrides the GetTokenCore method. Questo metodo tenta di ottenere un token dalla cache o, se non è possibile trovare un token nella cache, recupera un token dal provider sottostante e quindi lo memorizza nella cache.This method tries to get a token from the cache, or if a token cannot be found in the cache, retrieves a token from the underlying provider and then caches that token. In entrambi i casi, il metodo restituisce SecurityToken.In both cases the method returns a SecurityToken.

    protected override SecurityToken GetTokenCore(TimeSpan timeout)  
    {  
      GenericXmlSecurityToken token;  
      if (!this.cache.TryGetToken(target, issuer, out token))  
      {  
        token = (GenericXmlSecurityToken) this.innerTokenProvider.GetToken(timeout);  
        this.cache.AddToken(token, target, issuer);  
      }  
      return token;  
    }  
    
  2. Scrivere il gestore di token di sicurezza personalizzato.Write custom security token manager.

    La classe SecurityTokenManager viene utilizzata per creare un SecurityTokenProvider per un SecurityTokenRequirement specifico che viene passato nel metodo CreateSecurityTokenProvider.The SecurityTokenManager is used to create a SecurityTokenProvider for a specific SecurityTokenRequirement that is passed to it in the CreateSecurityTokenProvider method. Viene inoltre utilizzato un gestore del token di sicurezza per creare autenticatori del token e serializzatori del token, che però non vengono presi in esame in questo esempio.Security token manager is also used to create token authenticators and token serializers, but those are not covered by this sample. Nell'esempio, il gestore del token di sicurezza eredita dalla classe ClientCredentialsSecurityTokenManager ed esegue l'override del metodo CreateSecurityTokenProvider per restituire il provider di token personalizzato quando i requisiti del token passati indicano che viene richiesto un token emesso.In this sample, the custom security token manager inherits from the ClientCredentialsSecurityTokenManager class and overrides the CreateSecurityTokenProvider method to return the custom token provider when the passed token requirements indicate that an issued token is requested.

    class DurableIssuedTokenClientCredentialsTokenManager :  
     ClientCredentialsSecurityTokenManager  
    {  
      IssuedTokenCache cache;  
    
      public DurableIssuedTokenClientCredentialsTokenManager ( DurableIssuedTokenClientCredentials creds ): base(creds)  
      {  
        this.cache = creds.IssuedTokenCache;  
      }  
    
      public override SecurityTokenProvider CreateSecurityTokenProvider ( SecurityTokenRequirement tokenRequirement )  
      {  
        if (IsIssuedSecurityTokenRequirement(tokenRequirement))  
        {  
          return new DurableIssuedSecurityTokenProvider ((IssuedSecurityTokenProvider)base.CreateSecurityTokenProvider( tokenRequirement), this.cache);  
        }  
        Else  
        {  
          return base.CreateSecurityTokenProvider(tokenRequirement);  
        }  
      }  
    }  
    
  3. Scrivere una credenziale client personalizzata.Write a custom client credential.

    La classe delle credenziali di un client viene utilizzata per rappresentare le credenziali configurate per il proxy client e crea il gestore del token di protezione utilizzato per ottenere gli autenticatori del token, i provider di token e i serializzatori di token.A client credentials class is used to represent the credentials that are configured for the client proxy and creates the security token manager that is used to obtain token authenticators, token providers and token serializers.

    public class DurableIssuedTokenClientCredentials : ClientCredentials  
    {  
      IssuedTokenCache cache;  
    
      public DurableIssuedTokenClientCredentials() : base()  
      {  
      }  
    
      DurableIssuedTokenClientCredentials ( DurableIssuedTokenClientCredentials other) : base(other)  
      {  
        this.cache = other.cache;  
      }  
    
      public IssuedTokenCache IssuedTokenCache  
      {  
        Get  
        {  
          return this.cache;  
        }  
        Set  
        {  
          this.cache = value;  
        }  
      }  
    
      protected override ClientCredentials CloneCore()  
      {  
        return new DurableIssuedTokenClientCredentials(this);  
      }  
    
      public override SecurityTokenManager CreateSecurityTokenManager()  
      {  
        return new DurableIssuedTokenClientCredentialsTokenManager ((DurableIssuedTokenClientCredentials)this.Clone());  
      }  
    }  
    
  4. Implementare la cache del token.Implement the token cache. L'implementazione di esempio utilizza una classe di base astratta tramite la quale utenti di una cache del token specificata interagiscono con la cache.The sample implementation uses an abstract base class through which consumers of a given token cache interact with the cache.

    public abstract class IssuedTokenCache  
    {  
      public abstract void AddToken ( GenericXmlSecurityToken token, EndpointAddress target, EndpointAddress issuer);  
      public abstract bool TryGetToken(EndpointAddress target, EndpointAddress issuer, out GenericXmlSecurityToken cachedToken);  
    }  
    Configure the client to use the custom client credential.  
    

    L'esempio elimina la classe della credenziale client predefinita e fornisce la nuova classe della credenziale client affinché il client possa utilizzare la credenziale client personalizzata.For the client to use the custom client credential, the sample deletes the default client credential class and supplies the new client credential class.

    clientFactory.Endpoint.Behaviors.Remove<ClientCredentials>();  
    DurableIssuedTokenClientCredentials durableCreds = new DurableIssuedTokenClientCredentials();  
    durableCreds.IssuedTokenCache = cache;  
    durableCreds.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust;  
    clientFactory.Endpoint.Behaviors.Add(durableCreds);  
    

Esecuzione dell'esempioRunning the sample

Per eseguire l'esempio seguire le istruzioni riportate qui.See the following instructions to run the sample. Quando si esegue l'esempio, la richiesta per il token di protezione viene visualizzata nella finestra della console del servizio token di protezione.When you run the sample, the request for the security token is shown in the Security Token Service console window. Le richieste e le risposte dell'operazione vengono visualizzate nella finestra della console del client e del servizio.The operation requests and responses are displayed in the client and service console windows. Premere INVIO in una delle finestre della console per arrestare l'applicazione.Press ENTER in any of the console windows to shut down the application.

File batch Setup.cmdThe Setup.cmd Batch File

Il file batch Setup.cmd incluso con questo esempio consente di configurare il server e il servizio token di sicurezza con i certificati attinenti per eseguire un'applicazione indipendente.The Setup.cmd batch file included with this sample allows you to configure the server and security token service with relevant certificates to run a self-hosted application. Il file batch crea due certificati, entrambi nell'archivio certificati di CurrentUser/TrustedPeople.The batch file creates two certificates both in the CurrentUser/TrustedPeople certificate store. Il primo certificato ha un nome soggetto di CN=STS e viene utilizzato dal servizio token di protezione per firmare i token di protezione emessi al client.The first certificate has a subject name of CN=STS and is used by the Security Token Service to sign the security tokens that it issues to the client. Il secondo certificato ha un nome soggetto di CN=localhost e viene utilizzato dal servizio token di sicurezza per crittografare un segreto in modo che il servizio non possa decrittografarlo.The second certificate has a subject name of CN=localhost and is used by the Security Token Service to encrypt a secret so that the service can decrypt it.

Per impostare, compilare ed eseguire l'esempioTo set up, build, and run the sample

  1. Eseguire il file Setup.cmd per creare i certificati richiesti.Run the Setup.cmd file to create the required certificates.

  2. Per compilare la soluzione, seguire le istruzioni in compilazione degli esempi di Windows Communication Foundation.To build the solution, follow the instructions in Building the Windows Communication Foundation Samples. Assicurarsi che tutti i progetti nella soluzione siano stati generati (Shared, RSTRSTR, Service, SecurityTokenService e Client).Ensure that all the projects in the solution are built (Shared, RSTRSTR, Service, SecurityTokenService, and Client).

  3. Assicurarsi che Service.exe e SecurityTokenService.exe siano entrambi in esecuzione con privilegi di amministratore.Ensure that Service.exe and SecurityTokenService.exe are both running with administrator privileges.

  4. Eseguire Client.exe.Run Client.exe.

Per eseguire la pulizia dopo l'esempioTo clean up after the sample

  1. Eseguire Cleanup.cmd nella cartella degli esempi una volta completato l'esempio.Run Cleanup.cmd in the samples folder once you have finished running the sample.

Importante

È possibile che gli esempi siano già installati nel computer.The samples may already be installed on your machine. Verificare la directory seguente (impostazione predefinita) prima di continuare.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Se questa directory non esiste, andare al Windows Communication Foundation (WCF) e gli esempi di Windows Workflow Foundation (WF) per .NET Framework 4 per scaricare tutti i Windows Communication Foundation (WCF) e WFWF esempi.If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF) and WFWF samples. Questo esempio si trova nella directory seguente.This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WCF\Extensibility\Security\DurableIssuedTokenProvider

Vedere ancheSee Also