TokenanbieterToken Provider

Dieses Beispiel veranschaulicht das Implementieren eines benutzerdefinierten Tokenanbieters.This sample demonstrates how to implement a custom token provider. Ein Tokenanbieter in Windows Communication Foundation (WCF) wird verwendet, um Sicherheitsinfrastruktur der Sicherheitsinfrastruktur Anmeldeinformationen bereitzustellen.A token provider in Windows Communication Foundation (WCF) is used for supplying 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. Im Lieferumfang von WCF ist der standardmäßige Tokenanbieter der Anmeldeinformationsverwaltung enthalten.WCF ships with the default Credential Manager Token Provider. Auch Lieferumfang von WCF ein CardSpaceCardSpace Tokenanbieter.WCF also ships with an 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 diese Tokenanbieter nicht umgehen können.If you have a credential store that these token providers cannot operate with.

  • Wenn geben Sie eine eigene benutzerdefinierte Mechanismen zur Transformation angibt, bis die Anmeldeinformationen ab dem Punkt, der Benutzer die Details, wenn der WCF-Clientframework die Anmeldeinformationen verwendet werden sollen.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 framework uses the credentials.

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

In diesem Beispiel wird gezeigt, wie Sie einen benutzerdefinierten Tokenanbieter erstellen können, der die Eingabe des Benutzers in ein anderes Format transformiert.This sample shows how to build a custom token provider that transforms the input from the user into a different format.

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

  • Wie sich ein Client mithilfe eines Benutzername/Kennwort-Paars authentifizieren kann.How a client can authenticate using a username/password pair.

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

  • Wie der Server die Clientanmeldeinformationen anhand eines benutzerdefinierten UserNamePasswordValidator überprüfen kann, der die Übereinstimmung von Benutzername und Kennwort überprüft.How the server can validate the client credentials using a password with a custom UserNamePasswordValidator that validates that the username and password match.

  • 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.

In diesem Beispiel wird auch gezeigt, wie auf die Identität des Aufrufers nach dem benutzerdefinierten Tokenauthentifizierungsprozess zugegriffen werden kann.This sample also shows how the caller's identity is accessible after the custom token authentication process.

Der Dienst macht einen einzelnen Endpunkt zur Kommunikation mit dem Dienst verfügbar, der mit der App.conf-Konfigurationsdatei definiert wird.The service exposes a single endpoint for communicating with the service, defined using the App.config configuration file. Der Endpunkt besteht aus einer Adresse, einer Bindung und einem Vertrag.The endpoint consists of an address, a binding, and a contract. Die Bindung wird mit einer Standard-wsHttpBinding konfiguriert, die standardmäßig Nachrichtensicherheit verwendet.The binding is configured with a standard wsHttpBinding, which uses message security by default. In diesem Beispiel wird das Standard-wsHttpBinding auf die Verwendung der Clientbenutzernamenauthentifizierung festgelegt.This sample sets the standard wsHttpBinding to use client username authentication. Außerdem konfiguriert der Dienst das Dienstzertifikat mit dem serviceCredentials-Verhalten.The service also configures the service certificate using the serviceCredentials behavior. Mit dem serviceCredentials-Verhalten können Sie ein Dienstzertifikat konfigurieren.The serviceCredentials behavior allows you to configure a service certificate. Ein Dienstzertifikat wird von einem Client verwendet, um den Dienst zu authentifizieren und Nachrichtenschutz bereitzustellen.A service certificate is used by a client to authenticate the service and provide message protection. Die folgende Konfiguration verweist auf das Zertifikat localhost, das während des Beispielsetups installiert wird, wie im folgenden Setup beschrieben.The following configuration references the localhost certificate installed during the sample setup as described in the following setup instructions.

<system.serviceModel>  
    <services>  
      <service   
          name="Microsoft.ServiceModel.Samples.CalculatorService"  
          behaviorConfiguration="CalculatorServiceBehavior">  
        <host>  
          <baseAddresses>  
            <!-- configure base address provided by host -->  
            <add baseAddress ="http://localhost:8000/servicemodelsamples/service"/>  
          </baseAddresses>  
        </host>  
        <!-- use base address provided by host -->  
        <endpoint address=""  
                  binding="wsHttpBinding"  
                  bindingConfiguration="Binding1"   
                  contract="Microsoft.ServiceModel.Samples.ICalculator" />  
      </service>  
    </services>  

    <bindings>  
      <wsHttpBinding>  
        <binding name="Binding1">  
          <security mode="Message">  
            <message clientCredentialType="UserName" />  
          </security>  
        </binding>  
      </wsHttpBinding>  
    </bindings>  

    <behaviors>  
      <serviceBehaviors>  
        <behavior name="CalculatorServiceBehavior">  
          <serviceDebug includeExceptionDetailInFaults="False" />  
          <!--   
        The serviceCredentials behavior allows one to define a service certificate.  
        A service certificate is used by a client to authenticate the service and provide message protection.  
        This configuration references the "localhost" certificate installed during the setup instructions.  
        -->  
          <serviceCredentials>  
            <serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />  
          </serviceCredentials>  
        </behavior>  
      </serviceBehaviors>  
    </behaviors>  
  </system.serviceModel>  

Die Clientendpunktkonfiguration besteht aus einem Konfigurationsnamen, einer absoluten Adresse für den Dienstendpunkt, der Bindung und dem Vertrag.The client endpoint configuration consists of a configuration name, an absolute address for the service endpoint, the binding, and the contract. Die Clientbindung wird mit dem entsprechenden Mode und der entsprechenden clientCredentialType-Nachricht konfiguriert.The client binding is configured with the appropriate Mode and message clientCredentialType.

<system.serviceModel>  
  <client>  
    <endpoint name=""  
              address="http://localhost:8000/servicemodelsamples/service"   
              binding="wsHttpBinding"   
              bindingConfiguration="Binding1"   
              contract="Microsoft.ServiceModel.Samples.ICalculator">  
    </endpoint>  
  </client>  

  <bindings>  
    <wsHttpBinding>  
      <binding name="Binding1">  
        <security mode="Message">  
          <message clientCredentialType="UserName" />  
        </security>  
      </binding>  
    </wsHttpBinding>  
  </bindings>  
</system.serviceModel>  

Die folgenden Schritte wird die Entwicklung eines benutzerdefinierten tokenanbieters und seine Integration mit dem WCF-Sicherheitsframework gezeigt:The following steps show how to develop a custom token provider and integrate it with the WCF security framework:

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

    Im Beispiel wird ein benutzerdefinierter Tokenanbieter implementiert, der den Benutzernamen und das Kennwort erhält.The sample implements a custom token provider that obtains the username and password. Das Kennwort muss mit diesem Benutzernamen übereinstimmen.The password must match this username. Dieser benutzerdefinierte Tokenanbieter ist nur für Demonstrationszwecke gedacht und wird nicht zur realen Bereitstellung empfohlen.This custom token provider is for demonstration purposes only and is not recommended for real world deployment.

    Zur Ausführung dieser Aufgabe leitet der benutzerdefinierte Tokenanbieter die SecurityTokenProvider-Klasse ab und überschreibt die GetTokenCore(TimeSpan)-Methode.To perform this task, the custom token provider derives the SecurityTokenProvider class and overrides the GetTokenCore(TimeSpan) method. Diese Methode erstellt ein neues UserNameSecurityToken-Objekt und gibt es zurück.This method creates and returns a new UserNameSecurityToken.

    protected override SecurityToken GetTokenCore(TimeSpan timeout)  
    {  
        // obtain username and password from the user using console window  
        string username = GetUserName();  
        string password = GetPassword();  
        Console.WriteLine("username: {0}", username);  
    
        // return new UserNameSecurityToken containing information obtained from user  
        return new UserNameSecurityToken(username, password);  
    }  
    
  2. Schreiben Sie den benutzerdefiniertem Sicherheitstoken-Manager.Write custom security token manager.

    Die SecurityTokenManager wird zur Erstellung von SecurityTokenProvider für eine bestimmte SecurityTokenRequirement verwendet, die in der CreateSecurityTokenProvider-Methode übergeben wird.The SecurityTokenManager is used to create SecurityTokenProvider for specific SecurityTokenRequirement that is passed to it in CreateSecurityTokenProvider method. Der Sicherheitstoken-Manager dient außerdem zum Erstellen von Tokenauthentifizierern und eines Token-Serialisierungsprogramms. Diese Vorgänge werden jedoch in diesem Beispiel nicht behandelt.Security token manager is also used to create token authenticators and a token serializer, but those are not covered by this sample. In diesem Beispiel erbt der benutzerdefinierte Sicherheitstoken-Manager aus der Klasse ClientCredentialsSecurityTokenManager und überschreibt die Methode CreateSecurityTokenProvider, um benutzerdefinierte Benutzernamen-Tokenanbieter zurückzugeben, wenn die übergebenen Tokenanforderungen angeben, dass der Benutzernamenanbieter angefordert wird.In this sample, the custom security token manager inherits from ClientCredentialsSecurityTokenManager class and overrides the CreateSecurityTokenProvider method to return custom username token provider when the passed token requirements indicate that username provider is requested.

    public class MyUserNameSecurityTokenManager : ClientCredentialsSecurityTokenManager  
    {  
        MyUserNameClientCredentials myUserNameClientCredentials;  
    
        public MyUserNameSecurityTokenManager(MyUserNameClientCredentials myUserNameClientCredentials)  
            : base(myUserNameClientCredentials)  
        {  
            this.myUserNameClientCredentials = myUserNameClientCredentials;  
        }  
    
        public override SecurityTokenProvider CreateSecurityTokenProvider(SecurityTokenRequirement tokenRequirement)  
        {  
            // if token requirement matches username token return custom username token provider  
            // otherwise use base implementation  
            if (tokenRequirement.TokenType == SecurityTokenTypes.UserName)  
            {  
                return new MyUserNameTokenProvider();  
            }  
            else  
            {  
                return base.CreateSecurityTokenProvider(tokenRequirement);  
            }  
        }  
    }  
    
  3. Schreiben Sie benutzerdefinierte Clientanmeldeinformationen.Write a custom client credential.

    Die 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.Client credentials class is used to represent the credentials that are configured for the client proxy and creates security token manager that is used to obtain token authenticators, token providers and a token serializer.

    public class MyUserNameClientCredentials : ClientCredentials  
    {  
        public MyUserNameClientCredentials()  
            : base()  
        {  
        }  
    
        protected override ClientCredentials CloneCore()  
        {  
            return new MyUserNameClientCredentials();  
        }  
    
        public override SecurityTokenManager CreateSecurityTokenManager()  
        {  
            // return custom security token manager  
            return new MyUserNameSecurityTokenManager(this);  
        }  
    }  
    
  4. Konfigurieren Sie den Client für die Verwendung der benutzerdefinierten Clientanmeldeinformationen.Configure the client to use the custom client credential.

    Damit der Client die benutzerdefinierten Clientanmeldeinformationen verwenden kann, wird im Beispiel die Standardklasse für die Clientanmeldeinformationen gelöscht und die neue Klasse für Clientanmeldeinformationen angegeben.In order for the client to use the custom client credential, the sample deletes the default client credential class and supplies the new client credential class.

    static void Main()  
    {  
        // ...  
           // Create a client with given client endpoint configuration  
          CalculatorClient client = new CalculatorClient();  
    
          // set new credentials  
           client.ChannelFactory.Endpoint.Behaviors.Remove(typeof(ClientCredentials));  
         client.ChannelFactory.Endpoint.Behaviors.Add(new MyUserNameClientCredentials());  
       // ...  
    }  
    

Um beim Dienst die Informationen zu den Aufrufern anzuzeigen, können Sie PrimaryIdentity verwenden, wie im folgenden Beispielcode gezeigt.On the service, to display the caller's information, use the PrimaryIdentity as shown in the following code example. Current enthält Informationen zu den Ansprüchen des aktuellen Aufrufers.The Current contains claims information about the current caller.

static void DisplayIdentityInformation()  
{  
    Console.WriteLine("\t\tSecurity context identity  :  {0}",   
        ServiceSecurityContext.Current.PrimaryIdentity.Name);  
}  

Wenn Sie das Beispiel ausführen, werden die Anforderungen und Antworten für den Vorgang im Clientkonsolenfenster angezeigt.When you run the sample, the operation requests and responses are displayed in the client console window. Drücken Sie im Clientfenster die EINGABETASTE, um den Client zu schließen.Press ENTER in the client window to shut down the client.

SetupbatchdateiSetup Batch File

Mit der in diesem Beispiel enthaltenen Batchdatei Setup.bat können Sie den Server mit dem relevanten Zertifikat zum Ausführen einer selbst gehosteten Anwendung konfigurieren, die serverzertifikatbasierte Sicherheit erfordert.The Setup.bat batch file included with this sample allows you to configure the server with the relevant certificate to run a self-hosted application that requires server certificate-based security. Diese Batchdatei muss angepasst werden, wenn sie computerübergreifend oder in einem nicht gehosteten Szenario verwendet werden soll.This batch file must be modified to work across computers or to work in a non-hosted case.

Nachfolgend erhalten Sie einen kurzen Überblick über die verschiedenen Abschnitte der Batchdateien, damit Sie sie so ändern können, dass sie in der entsprechenden Konfiguration ausgeführt werden:The following provides a brief overview of the different sections of the batch files so that they can be modified to run in the appropriate configuration:

  • Erstellen des Serverzertifikats.Creating the server certificate.

    Mit den folgenden Zeilen aus der Batchdatei "Setup.bat" wird das zu verwendende Serverzertifikat erstellt.The following lines from the Setup.bat batch file create the server certificate to be used. Die Variable %SERVER_NAME% gibt den Servernamen an.The %SERVER_NAME% variable specifies the server name. Ändern Sie diese Variable, und geben Sie Ihren eigenen Servernamen an.Change this variable to specify your own server name. Der Standardwert in dieser Batchdatei lautet localhost.The default value in this batch file is localhost.

    echo ************  
    echo Server cert setup starting  
    echo %SERVER_NAME%  
    echo ************  
    echo making server cert  
    echo ************  
    makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%SERVER_NAME% -sky exchange -pe  
    
  • Installieren des Serverzertifikats im Speicher für vertrauenswürdige Zertifikate des Clients:Installing the server certificate into the client's trusted certificate store:

    Mit den folgenden Zeilen in der Batchdatei Setup.bat wird das Serverzertifikat in den Clientspeicher für vertrauenswürdige Personen kopiert.The following lines in the Setup.bat batch file copy the server certificate into the client trusted people store. Dieser Schritt ist erforderlich, da von "Makecert.exe" generierte Zertifikate nicht implizit vom Clientsystem als vertrauenswürdig eingestuft werden.This step is required because certificates generated by Makecert.exe are not implicitly trusted by the client system. Wenn Sie bereits über ein Zertifikat verfügen, dass von einem vertrauenswürdigen Clientstammzertifikat abstammt (z. B. ein von Microsoft ausgegebenes Zertifikat), ist dieser Schritt zum Auffüllen des Clientzertifikatspeichers mit dem Serverzertifikat nicht erforderlich.If you already have a certificate that is rooted in a client trusted root certificate—for example, a Microsoft issued certificate—this step of populating the client certificate store with the server certificate is not required.

    certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople  
    

Hinweis

Die Batchdatei "Setup.bat" ist dafür ausgelegt, von einer Windows SDK-Eingabeaufforderung ausgeführt zu werden.The Setup.bat batch file is designed to be run from a Windows SDK Command Prompt. Die MSSDK-Umgebungsvariable muss auf das Verzeichnis zeigen, in dem das SDK installiert ist.It requires that the MSSDK environment variable point to the directory where the SDK is installed. Diese Umgebungsvariable wird automatisch innerhalb einer Windows SDK-Eingabeaufforderung festgelegt.This environment variable is automatically set within a Windows SDK Command Prompt.

So richten Sie das Beispiel ein und erstellen esTo set up and build the sample

  1. Stellen Sie sicher, dass Sie ausgeführt haben die Setupprozedur für die Windows Communication Foundation-Beispiele zum einmaligen.Ensure that you have performed the One-Time Setup Procedure for the Windows Communication Foundation Samples.

  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.

So führen Sie das Beispiel auf demselben Computer ausTo run the sample on the same computer

  1. Öffnen Sie eine Visual Studio 2012Visual Studio 2012-Eingabeaufforderung mit Administratorrechten, und führen Sie Setup.bat aus dem Beispielinstallationsordner aus.Run Setup.bat from the sample installation folder inside a Visual Studio 2012Visual Studio 2012 command prompt opened with administrator privileges. Hiermit werden alle Zertifikate installiert, die zum Ausführen des Beispiels erforderlich sind.This installs all the certificates required for running the sample.

    Hinweis

    Die Batchdatei Setup.bat ist darauf ausgelegt, an einer Visual Studio 2012Visual Studio 2012-Eingabeaufforderung ausgeführt zu werden.The Setup.bat batch file is designed to be run from a Visual Studio 2012Visual Studio 2012 Command Prompt. Die innerhalb der Visual Studio 2012Visual Studio 2012-Eingabeaufforderung festgelegte PATH-Umgebungsvariable zeigt auf das Verzeichnis mit den ausführbaren Dateien, die für das Skript Setup.bat erforderlich sind.The PATH environment variable set within the Visual Studio 2012Visual Studio 2012 Command Prompt points to the directory that contains executables required by the Setup.bat script.

  2. Starten Sie Service.exe aus dem Ordner \service\bin.Launch service.exe from service\bin.

  3. Starten Sie Client.exe aus dem Ordner \client\bin.Launch Client.exe from \client\bin. In der Clientkonsolenanwendung wird Clientaktivität angezeigt.Client activity is displayed on the client console application.

  4. Geben Sie an der Benutzernamen-Eingabeaufforderung einen Benutzernamen ein.At the username prompt, type a user name.

  5. Verwenden Sie an der Kennworteingabeaufforderung dieselbe Zeichenfolge, die an der Benutzernamen-Eingabeaufforderung eingegeben wurde.At the password prompt, use the same string that was typed for the username prompt.

  6. Wenn Client und Dienst nicht miteinander kommunizieren können, finden Sie unter Tipps zur Problembehandlung.If the client and service are not able to communicate, see Troubleshooting Tips.

So führen Sie das Beispiel computerübergreifend ausTo run the sample across computers

  1. Erstellen Sie auf dem Dienstcomputer ein Verzeichnis für die Dienstbinärdateien.Create a directory on the service computer for the service binaries.

  2. Kopieren Sie die Dienstprogrammdateien in das Dienstverzeichnis auf dem Dienstcomputer.Copy the service program files to the service directory on the service computer. Kopieren Sie außerdem die Dateien Setup.bat und Cleanup.bat auf den Dienstcomputer.Also copy the Setup.bat and Cleanup.bat files to the service computer.

  3. Sie benötigen ein Serverzertifikat mit dem Antragstellernamen, das den vollqualifizierten Domänennamen des Computers enthält.You must have a server certificate with the subject name that contains the fully-qualified domain name of the computer. Die Datei Service.exe.config muss so aktualisiert werden, dass sie diesem neuen Zertifikatsnamen entspricht.The Service.exe.config file must be updated to reflect this new certificate name. Sie können das Serverzertifikat erstellen, indem Sie die Batchdatei Setup.bat ändern.You can create server certificate by modifying the Setup.bat batch file. Beachten Sie, dass die Datei setup.bat an einer Visual Studio-Eingabeaufforderung mit Administratorrechten ausgeführt werden muss.Note that the setup.bat file must be run from a Visual Studio command prompt opened with administrator privileges. Sie müssen die Variable %SERVER_NAME% auf den vollqualifizierten Hostnamen des Computers festlegen, der als Host für den Dienst dienen soll.You must set %SERVER_NAME% variable to fully-qualified host name of the computer that is used to host the service.

  4. Kopieren Sie das Serverzertifikat in den Speicher CurrentUser – TrustedPeople des Clients.Copy the server certificate into the CurrentUser-TrustedPeople store of the client. Dieser Schritt muss nicht ausgeführt werden, wenn das Serverzertifikat von einem Aussteller stammt, der vom Client als vertrauenswürdig eingestuft wurde.You do not need to do this when the server certificate is issued by a client trusted issuer.

  5. Ändern Sie in der Datei Service.exe.config auf dem Dienstcomputer den Wert der Basisadresse, und geben Sie anstelle von localhost einen vollqualifizierten Computernamen an.In the Service.exe.config file on the service computer, change the value of the base address to specify a fully-qualified computer name instead of localhost.

  6. Führen Sie auf dem Dienstcomputer service.exe an einer Eingabeaufforderung aus.On the service computer, run service.exe from a command prompt.

  7. Kopieren Sie die Clientprogrammdateien aus dem Ordner \client\bin\ (unterhalb des sprachspezifischen Ordners) auf den Clientcomputer.Copy the client program files from the \client\bin\ folder, under the language-specific folder, to the client computer.

  8. Ändern Sie in der Datei Client.exe.config auf dem Clientcomputer den Wert für die Adresse des Endpunkts, sodass er mit der neuen Adresse Ihres Diensts übereinstimmt.In the Client.exe.config file on the client computer, change the address value of the endpoint to match the new address of your service.

  9. Starten Sie auf dem Clientcomputer Client.exe in einem Eingabeaufforderungsfenster.On the client computer, launch Client.exe from a command prompt window.

  10. Wenn Client und Dienst nicht miteinander kommunizieren können, finden Sie unter Tipps zur Problembehandlung.If the client and service are not able to communicate, see Troubleshooting Tips.

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

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

Siehe auchSee Also