Dauerhaft ausgestellter TokenanbieterDurable Issued Token Provider

Dieses Beispiel veranschaulicht das Implementieren eines Tokenanbieters, der von einem benutzerdefinierten Client ausgestellt wird.This sample demonstrates how to implement a custom client issued token provider.

DiskussionDiscussion

Ein Tokenanbieter in Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) wird verwendet, um der Sicherheitsinfrastruktur Anmeldeinformationen bereitzustellen.A token provider in Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) is used to supply credentials to the security infrastructure. Der Tokenanbieter untersucht im Allgemeinen das Ziel und gibt die entsprechenden Anmeldeinformationen aus, sodass die Sicherheitsinfrastruktur die Nachricht sichern kann.The token provider in general examines the target and issues appropriate credentials so that the security infrastructure can secure the message. WCFWCF wird mit einem CardSpaceCardSpace-Tokenanbieter ausgeliefert. ships with a CardSpaceCardSpace token provider. Benutzerdefinierte Tokenanbieter sind in den folgenden Fällen nützlich:Custom token providers are useful in the following cases:

  • Wenn Sie einen Speicher für Anmeldeinformationen verwenden, mit dem der integrierte Tokenanbieter nicht umgehen kann.If you have a credential store that the built-in token provider cannot operate with.

  • Wenn Sie eigene benutzerdefinierte Mechanismen zur Transformation der Anmeldeinformationen von dem Punkt, an dem der Benutzer die Details angibt, bis zu dem Punkt, in dem der WCFWCF-Client die Anmeldeinformationen verwendet, angeben möchten.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 WCFWCF client uses the credentials.

  • Wenn Sie ein benutzerdefiniertes Token erstellen.If you are building a custom token.

Dieses Beispiel veranschaulicht die Erstellung eines benutzerdefinierten Tokenanbieters, der von einem Sicherheitstokendienst (STS, Security Token Service) ausgestellte Token zwischenspeichert.This sample shows how to build a custom token provider that caches tokens issued by a Security Token Service (STS).

Kurz gesagt, veranschaulicht dieses Beispiel folgende Punkte:To summarize, this sample demonstrates the following:

  • Wie ein Client mit einem benutzerdefinierten Tokenanbieter konfiguriert werden kann.How a client can be configured with a custom token provider.

  • Wie ausgestellte Token zwischengespeichert werden können und dem WCFWCF-Client bereitgestellt werden.How issued tokens can be cached and provided to the WCFWCF client.

  • Wie der Server über das X.509-Zertifikat des Servers vom Client authentifiziert wird.How the server is authenticated by the client using the server's X.509 certificate.

Das Beispiel besteht aus einem Clientkonsolenprogramm (Client.exe), einem Konsolenprogramm für den Sicherheitstokendienst (Securitytokenservice.exe) und einem Dienstkonsolenprogramm (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). Der Dienst implementiert einen Vertrag, der ein Anforderungs-Antwort-Kommunikationsmuster definiert.The service implements a contract that defines a request-reply communication pattern. Der Vertrag wird von der ICalculator-Schnittstelle definiert, die mathematische Operationen (Addieren, Subtrahieren, Multiplizieren und Dividieren) verfügbar macht.The contract is defined by the ICalculator interface, which exposes math operations (add, subtract, multiply, and divide). Der Client empfängt ein Sicherheitstoken vom STS und fordert beim Dienst asynchron einen bestimmten mathematischen Vorgang an. Der Dienst antwortet mit dem Ergebnis.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. Die Clientaktivität ist im Konsolenfenster sichtbar.Client activity is visible in the console window.

Hinweis

Die Setupprozedur und die Buildanweisungen für dieses Beispiel befinden sich am Ende dieses Themas.The set-up procedure and build instructions for this sample are located at the end of this topic.

In diesem Beispiel macht die ICalculator-Vertrag mit dem <WsHttpBinding >.This sample exposes the ICalculator contract using the <wsHttpBinding>. Das folgende Codebeispiel zeigt die Konfiguration dieser Bindung auf dem Client.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>  

Im security-Element von wsFederationHttpBinding konfiguriert der mode-Wert, welcher Sicherheitsmodus verwendet werden soll.On the security element of wsFederationHttpBinding, the mode value configures which security mode should be used. In diesem Beispiel wird die Nachrichtensicherheit verwendet. Daher wird das message-Element von wsFederationHttpBinding im security-Element von wsFederationHttpBinding angegeben.In this sample, messages security is being used, which is why the message element of wsFederationHttpBinding is specified inside the security element of wsFederationHttpBinding. Das issuer-Element von wsFederationHttpBinding im message-Element von wsFederationHttpBinding gibt die Adresse und die Bindung für den Sicherheitstokendienst an, der ein Sicherheitstoken an den Client ausgibt, damit der Client beim Rechnerdienst authentifiziert werden kann.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.

Das folgende Codebeispiel zeigt die Konfiguration dieser Bindung auf dem Dienst.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>  

Im security-Element von wsFederationHttpBinding konfiguriert der mode-Wert, welcher Sicherheitsmodus verwendet werden soll.On the security element of wsFederationHttpBinding, the mode value configures which security mode should be used. In diesem Beispiel wird die Nachrichtensicherheit verwendet. Daher wird das message-Element von wsFederationHttpBinding im security-Element von wsFederationHttpBinding angegeben.In this sample, messages security is being used, which is why the message element of wsFederationHttpBinding is specified inside the security element of wsFederationHttpBinding. Das issuerMetadata-Element von wsFederationHttpBinding im message-Element von wsFederationHttpBinding gibt die Adresse und Identität für einen Endpunkt an, mit dem Metadaten für den Sicherheitstokendienst abgerufen werden können.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.

Das Verhalten für den Dienst wird im folgenden Code gezeigt.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>  

Mit dem issuedTokenAuthentication-Element im serviceCredentials-Element kann der Dienst Einschränkungen für die Token angeben, die Clients bei der Authentifizierung angeben dürfen.The issuedTokenAuthentication element inside the serviceCredentials element allows the service to specify constraints on the tokens it allows clients to present during authentication. In dieser Konfiguration wird angegeben, dass von einem Zertifikat mit dem Ausstellernamen CN=STS signierte Token vom Dienst akzeptiert werden.This configuration specifies that tokens signed by a certificate whose Subject Name is CN=STS are accepted by the service.

Der Sicherheitstokendienst (STS, Security Token Service) macht mit Standard-wsHttpBinding einen einzelnen Endpunkt verfügbar.The Security Token Service exposes a single endpoint using the standard wsHttpBinding. Der STS reagiert auf eine Tokenanforderung von Clients. Wenn der Client mit einem Windows-Konto authentifiziert wird, gibt der STS ein Token mit dem Benutzernamen des Clients als Anspruch im herausgegebenen Token heraus.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. Beim Erstellen des Tokens signiert der STS das Token mit dem privaten Schlüssel, der dem CN=STS-Zertifikat zugeordnet ist.As part of creating the token, the Security Token Service signs the token using the private key associated with the CN=STS certificate. Außerdem wird ein symmetrischer Schlüssel erstellt und mit dem öffentlichen Schlüssel verschlüsselt, der dem CN=localhost-Zertifikat zugeordnet ist.In addition, it creates a symmetric key and encrypts it using the public key associated with the CN=localhost certificate. Beim Zurückgeben des Tokens an den Client gibt der STS auch den symmetrischen Schlüssel zurück.In returning the token to the client, the Security Token Service also returns the symmetric key. Der Client stellt das herausgegebene Token für den Rechnerdienst bereit und beweist, dass der symmetrische Schlüssel bekannt ist, indem die Nachricht mit diesem Schlüssel signiert wird.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.

Benutzerdefinierte Clientanmeldeinformationen und TokenanbieterCustom Client Credentials and Token Provider

In den folgenden Schritten wird die Entwicklung eines benutzerdefinierten Tokenanbieters, der ausgestellte Token zwischenspeichert, und seine Integration in die WCFWCF-Sicherheit gezeigt.The following steps show how to develop a custom token provider that caches issued tokens and integrate it with WCFWCF: security.

So entwickeln Sie einen benutzerdefinierten TokenanbieterTo develop a custom token provider

  1. Schreiben Sie einen benutzerdefinierten Tokenanbieter.Write a custom token provider.

    Das Beispiel implementiert einen benutzerdefinierten Tokenanbieter, der ein Sicherheitstoken zurückgibt, das aus dem Cache abgerufen wird.The sample implements a custom token provider that returns a security token retrieved from a cache.

    Zur Ausführung dieser Aufgabe leitet der benutzerdefinierte Tokenanbieter die SecurityTokenProvider-Klasse ab und überschreibt die GetTokenCore-Methode.To perform this task, the custom token provider derives the SecurityTokenProvider class and overrides the GetTokenCore method. Bei dieser Methode wird versucht, ein Token aus dem Cache abzurufen. Wenn im Cache kein Token gefunden wird, wird ein Token vom zugrunde liegenden Anbieter abgerufen und anschließend im Cache gespeichert.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 diesem Fall gibt die Methode ein SecurityToken zurück.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. Schreiben Sie den benutzerdefiniertem Sicherheitstoken-Manager.Write custom security token manager.

    Der SecurityTokenManager wird zur Erstellung von einem SecurityTokenProvider für eine bestimmte SecurityTokenRequirement verwendet, die in der CreateSecurityTokenProvider-Methode übergeben wird.The SecurityTokenManager is used to create a SecurityTokenProvider for a specific SecurityTokenRequirement that is passed to it in the CreateSecurityTokenProvider method. Der Sicherheitstoken-Manager dient außerdem zum Erstellen von Tokenauthentifizierern und Token-Serialisierungsprogrammen. Diese Vorgänge werden jedoch in diesem Beispiel nicht behandelt.Security token manager is also used to create token authenticators and token serializers, but those are not covered by this sample. In diesem Beispiel erbt der benutzerdefinierte Sicherheitstoken-Manager aus der Klasse ClientCredentialsSecurityTokenManager und setzt die Methode CreateSecurityTokenProvider außer Kraft, um den benutzerdefinierten Tokenanbieter zurückzugeben, wenn die übergebenen Tokenanforderungen angeben, dass ein ausgestelltes Token angefordert wird.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. Schreiben Sie benutzerdefinierte Clientanmeldeinformationen.Write a custom client credential.

    Eine Klasse der Clientanmeldeinformationen stellt die Anmeldeinformationen dar, die für den Clientproxy konfiguriert werden, und erstellt einen Sicherheitstoken-Manager, mit dem Tokenauthentifizierer, Tokenanbieter und Token-Serialisierungsprogramme abgerufen werden können.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. Implementieren Sie den Tokencache.Implement the token cache. Die Beispielimplementierung verwendet eine abstrakte Basisklasse, über die Consumer eines bestimmten Tokencaches mit dem Cache interagieren.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.  
    

    Im Beispiel wird die Standardklasse für die Clientanmeldeinformationen gelöscht und die neue Klasse für Clientanmeldeinformationen angegeben, sodass der Client die benutzerdefinierten Clientanmeldeinformationen verwenden kann.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);  
    

Ausführen des BeispielsRunning the sample

In den folgenden Anweisungen finden Sie Informationen zum Ausführen des Beispiels.See the following instructions to run the sample. Wenn Sie das Beispiel ausführen, wird die Anforderung des Sicherheitstokens im STS-Konsolenfenster angezeigt.When you run the sample, the request for the security token is shown in the Security Token Service console window. Die Anforderungen und Antworten des Vorgangs werden im Client- und Dienstkonsolenfenster angezeigt.The operation requests and responses are displayed in the client and service console windows. Drücken Sie die EINGABETASTE in einem der Konsolenfenster, um die Anwendung zu schließen.Press ENTER in any of the console windows to shut down the application.

Die Batchdatei Setup.cmdThe Setup.cmd Batch File

Mit der in diesem Beispiel enthaltenen Batchdatei "Setup.cmd" können Sie den Server und den STS mit relevanten Zertifikaten zum Ausführen einer selbst gehosteten Anwendung konfigurieren.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. Die Batchdatei erstellt zwei Zertifikate im Zertifikatspeicher CurrentUser/TrustedPeople.The batch file creates two certificates both in the CurrentUser/TrustedPeople certificate store. Der Antragstellername des ersten Zertifikats lautet CN=STS und wird vom STS zum Signieren des Sicherheitstokens verwendet, das an den Client herausgegeben wird.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. Der Antragstellername des zweiten Zertifikats lautet CN=localhost und wird vom STS zum Verschlüsseln eines Geheimnisses verwendet, das dann vom Dienst entschlüsselt werden kann.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.

So können Sie das Beispiel einrichten, erstellen und ausführenTo set up, build, and run the sample

  1. Führen Sie die Datei "Setup.cmd" aus, um die erforderlichen Zertifikate zu erstellen.Run the Setup.cmd file to create the required certificates.

  2. Führen Sie zum Erstellen der Projektmappe die Anweisungen im Erstellen der Windows Communication Foundation-Beispiele.To build the solution, follow the instructions in Building the Windows Communication Foundation Samples. Stellen Sie sicher, dass alle Projekte in der Projektmappe erstellt werden (Shared, RSTRSTR, Service, SecurityTokenService und Client).Ensure that all the projects in the solution are built (Shared, RSTRSTR, Service, SecurityTokenService, and Client).

  3. Stellen Sie sicher, dass Service.exe und SecurityTokenService.exe mit Administratorrechten ausgeführt werden.Ensure that Service.exe and SecurityTokenService.exe are both running with administrator privileges.

  4. Führen Sie Client.exe aus.Run Client.exe.

So stellen Sie den Zustand vor Ausführung des Beispiels wieder herTo clean up after the sample

  1. Führen Sie "Cleanup.cmd" im Beispielordner aus, nachdem Sie das Beispiel fertig ausgeführt haben.Run Cleanup.cmd in the samples folder once you have finished running the sample.

Wichtig

Die Beispiele sind möglicherweise bereits auf dem Computer installiert.The samples may already be installed on your machine. Suchen Sie nach dem folgenden Verzeichnis (Standardverzeichnis), bevor Sie fortfahren.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Wenn dieses Verzeichnis nicht vorhanden ist, rufen Sie Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 auf, um alle Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) - und WFWF -Beispiele herunterzuladen.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)Windows Communication Foundation (WCF) and WFWF samples. Dieses Beispiel befindet sich im folgenden Verzeichnis.This sample is located in the following directory.

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

Siehe auchSee Also