Sicherheit mit benutzerdefinierten BindungenCustom Binding Security

In diesem Beispiel wird veranschaulicht, wie die Sicherheitsfunktion mit einer benutzerdefinierten Bindung konfiguriert wird.This sample demonstrates how to configure security by using a custom binding. Es zeigt, wie Sicherheit auf Nachrichtenebene und ein sicherer Transport mithilfe einer benutzerdefinierten Bindung aktiviert wird.It shows how to use a custom binding to enable message-level security together with a secure transport. Dies ist hilfreich, wenn ein sicherer Transport zum Übertragen von Nachrichten zwischen Client und Dienst erforderlich ist und daher die Nachrichten auf Nachrichtenebene gesichert werden müssen.This is useful when a secure transport is required to transmit the messages between client and service and simultaneously the messages must be secure on the message level. Diese Konfiguration wird nicht von Bindungen unterstützt, die vom System bereitgestellt werden.This configuration is not supported by system-provided bindings.

Dieses Beispiel besteht aus einem Clientkonsolenprogramm (EXE) und einem Dienstkonsolenprogramm (EXE).This sample consists of a client console program (EXE) and a service console program (EXE). Der Dienst implementiert einen Duplexvertrag.The service implements a duplex contract. Der Vertrag wird von der ICalculatorDuplex-Schnittstelle definiert, die mathematische Operationen (Addieren, Subtrahieren, Multiplizieren und Dividieren) verfügbar macht.The contract is defined by the ICalculatorDuplex interface, which exposes math operations (Add, Subtract, Multiply, and Divide). Durch die ICalculatorDuplex-Schnittstelle kann der Client mathematische Operationen ausführen (Berechnen eines laufenden Ergebnisses über eine Sitzung).The ICalculatorDuplex interface allows the client to perform math operations, calculating a running result over a session. Unabhängig davon kann der Dienst Ergebnisse auf der ICalculatorDuplexCallback-Schnittstelle zurückgeben.Independently, the service may return results on the ICalculatorDuplexCallback interface. Ein Duplexvertrag erfordert eine Sitzung, da ein Kontext eingerichtet werden muss, um die zwischen dem Client und dem Dienst gesendeten Nachrichten in Beziehung zu setzen.A duplex contract requires a session, because a context must be established to correlate the set of messages being sent between the client and the service. Es wird eine benutzerdefinierte Bindung definiert, die Duplexkommunikation unterstützt und sicher ist.A custom binding is defined that supports duplex communication and is secure.

Hinweis

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

Die Dienstkonfiguration definiert eine benutzerdefinierte Bindung, die Folgendes unterstützt:The service configuration defines a custom binding that supports the following:

  • TCP-Kommunikation mit Schutz durch Verwendung des TLS/SSL-Protokolls.TCP communication protected by using the TLS/SSL protocol.

  • Windows-Nachrichtensicherheit.Windows message security.

Durch die benutzerdefinierte Bindungskonfiguration wird der sichere Transport ermöglicht, da gleichzeitig die Sicherheit auf Nachrichtenebene aktiviert wird.The custom binding configuration enables secure transport by simultaneously enabling the message-level security. Die Reihenfolge der Bindungselemente ist wichtig, eine benutzerdefinierte Bindung definieren, da jeweils eine Ebene im Kanalstapel Abfragen darstellen (siehe benutzerdefinierte Bindungen).The ordering of binding elements is important in defining a custom binding, because each represents a layer in the channel stack (see Custom Bindings). Die benutzerdefinierte Bindung wird in den Dienst- und Clientkonfigurationsdateien definiert, wie in der folgenden Beispielkonfiguration dargestellt.The custom binding is defined in the service and client configuration files, as shown in the following sample configuration.

<bindings>  
  <!-- Configure a custom binding. -->  
  <customBinding>  
    <binding name="Binding1">  
      <security authenticationMode="SecureConversation"  
                 requireSecurityContextCancellation="true">  
      </security>  
      <textMessageEncoding messageVersion="Soap12WSAddressing10" writeEncoding="utf-8"/>  
      <sslStreamSecurity requireClientCertificate="false"/>  
      <tcpTransport/>  
    </binding>  
  </customBinding>  
</bindings>  

Die benutzerdefinierte Bindung verwendet ein Dienstzertifikat zum Authentifizieren des Diensts auf Transportebene und zum Sichern der Nachrichten während der Übertragung zwischen Client und Dienst.The custom binding uses a service certificate to authenticate the service on the transport level and to protect the messages during the transmission between client and service. Dies wird durch das sslStreamSecurity-Bindungselement umgesetzt.This is accomplished by the sslStreamSecurity binding element. Das Zertifikat des Diensts wird mit einem Dienstverhalten konfiguriert, wie in der folgenden Beispielkonfiguration dargestellt.The service's certificate is configured using a service behavior as shown in the following sample configuration.

<behaviors>  
    <serviceBehaviors>  
    <behavior name="CalculatorServiceBehavior">  
        <serviceMetadata />  
        <serviceDebug includeExceptionDetailInFaults="False" />  
        <serviceCredentials>  
        <serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName"/>  
        </serviceCredentials>  
    </behavior>  
    </serviceBehaviors>  
</behaviors>  

Außerdem verwendet die benutzerdefinierte Bindung Nachrichtensicherheit mit dem Windows-Anmeldeinformationstyp. Dies ist der Standard-Anmeldeinformationstyp.Additionally, the custom binding uses message security with Windows credential type - this is the default credential type. Dies wird durch das security-Bindungselement umgesetzt.This is accomplished by the security binding element. Sowohl der Client als auch der Dienst werden mithilfe von Sicherheitsfunktionen auf Nachrichtenebene authentifiziert, wenn der Kerberos-Authentifizierungsmechanismus verfügbar ist.Both client and service are authenticated using message-level security if the Kerberos authentication mechanism is available. Dies geschieht, wenn das Beispiel in der Active Directory-Umgebung ausgeführt wird.This happens if the sample is run in the Active Directory environment. Ist der Kerberos-Authentifizierungsmechanismus nicht verfügbar, wird die NTLM-Authentifizierung verwendet.If the Kerberos authentication mechanism is not available, NTLM authentication is used. NTLM authentifiziert den Client für den Dienst, authentifiziert aber nicht den Dienst für den Client.NTLM authenticates the client to the service but does not authenticate the service to the client. Die security Bindungselement wird so konfiguriert, dass verwenden SecureConversation``authenticationType, was dazu führt, bei der Erstellung eine sicherheitssitzung auf dem Client und dem Dienst.The security binding element is configured to use SecureConversation``authenticationType, which results in the creation of a security session on both the client and the service. Dies ist erforderlich, damit der Duplexvertrag des Diensts funktioniert.This is required to enable the service's duplex contract to work.

Wenn Sie das Beispiel ausführen, werden die Anforderungen und Antworten für den Vorgang im Konsolenfenster des Clients angezeigt.When you run the sample, the operation requests and responses are displayed in the client's 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.

Press <ENTER> to terminate client.  
Result(100)  
Result(50)  
Result(882.5)  
Result(441.25)  
Equation(0 + 100 - 50 * 17.65 / 2 = 441.25)  

Wenn Sie das Beispiel ausführen, werden die vom Client zurückgegebenen Nachrichten in der vom Dienst gesendeten Rückrufschnittstelle angezeigt.When you run the sample, you see the messages returned to the client on the callback interface sent from the service. Alle Zwischenergebnisse werden angezeigt, gefolgt von der ganzen Formel nach Abschluss aller Vorgänge.Each intermediate result is displayed, followed by the entire equation upon completion of all operations. Drücken Sie die EINGABETASTE, um den Client zu schließen.Press ENTER to shut down the client.

Mit der in diesem Beispiel enthaltenen Datei Setup.bat können Sie Client und Server mit relevanten Dienstzertifikaten zum Ausführen einer gehosteten Anwendung konfigurieren, die serverzertifikatbasierte Sicherheit erfordert.The included Setup.bat file enables you to configure the client and server with the relevant service certificate to run a hosted application that requires 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 für dieses Beispiel, 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 that apply to this sample 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 Datei "Setup.bat" wird das zu verwendende Serverzertifikat erstellt.The following lines from the Setup.bat 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. In dieser Batchdatei ist der Servername standardmäßig auf localhost festgelegt.This batch file defaults the server name to localhost.

    Das Zertifikat wird im Speicher CurrentUser für im Internet gehostete Dienste gespeichert.The certificate is stored in the CurrentUser store for the Web-hosted services.

    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 Sie das Serverzertifikat 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 Datei "Setup.bat" wird das Serverzertifikat in den Clientspeicher für vertrauenswürdige Personen kopiert.The following lines in the Setup.bat 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, das von einem vertrauenswürdigen Clientstammzertifikat stammt (z. B. ein von Microsoft ausgegebenes Zertifikat), ist dieser Schritt zum Fü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 darauf ausgelegt, an einer Visual Studio-Eingabeaufforderung (2010) ausgeführt zu werden.The Setup.bat batch file is designed to be run from a Visual Studio 2010 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 ist innerhalb einer Visual Studio-Eingabeaufforderung (2010) automatisch festgelegt.This environment variable is automatically set within a Visual Studio 2010 Command Prompt.

So können Sie das Beispiel einrichten, erstellen und ausführenTo set up, build, and run 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. Um die C#- oder Visual Basic .NET-Edition der Projektmappe zu erstellen, befolgen Sie die unter Building the Windows Communication Foundation Samplesaufgeführten Anweisungen.To build the C# or Visual Basic .NET edition of the solution, follow the instructions in Building the Windows Communication Foundation Samples.

  3. Um das Beispiel in einer Einzelcomputer- oder computerübergreifenden Konfiguration ausführen möchten, folgen Sie den Anweisungen Ausführen der Windows Communication Foundation-Beispiele.To run the sample in a single- or cross-computer configuration, follow the instructions in Running 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 ein Visual Studio-Eingabeaufforderungsfenster mit Administratorrechten, und führen Sie die Datei Setup.bat aus dem Beispielinstallationsordner aus.Open a Visual Studio Command Prompt window with administrator privileges and run Setup.bat from the sample install folder. 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. 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. Auf dem Dienstcomputer:On the service computer:

    1. Erstellen Sie auf dem Dienstcomputer ein virtuelles Verzeichnis mit dem Namen servicemodelsamples.Create a virtual directory named servicemodelsamples on the service computer.

    2. Kopieren Sie die Dienstprogrammdateien aus \inetpub\wwwroot\servicemodelsamples in das virtuelle Verzeichnis auf dem Dienstcomputer.Copy the service program files from \inetpub\wwwroot\servicemodelsamples to the virtual directory on the service computer. Stellen Sie sicher, dass Sie die Dateien in das Unterverzeichnis \bin kopieren.Ensure that you copy the files in the \bin subdirectory.

    3. Kopieren Sie die Dateien Setup.bat und Cleanup.bat auf den Dienstcomputer.Copy the Setup.bat and Cleanup.bat files to the service computer.

    4. Führen Sie der folgende Befehl an einer Visual Studio-Eingabeaufforderung mit Administratorrechten geöffnet: Setup.bat service.Run the following command in a Visual Studio command prompt opened with administrator privileges: Setup.bat service. Hiermit wird das Dienstzertifikat erstellt, dessen Antragstellername mit dem Namen des Computers übereinstimmt, auf dem die Batchdatei ausgeführt wurde.This creates the service certificate with the subject name matching the name of the computer the batch file was run on.

      Hinweis

      Die Batchdatei Setup.bat ist darauf ausgelegt, an einer Visual Studio-Eingabeaufforderung (2010) ausgeführt zu werden.The Setup.bat batch file is designed to be run from a Visual Studio 2010 Command Prompt. Die PATH-Umgebungsvariable muss auf das Verzeichnis zeigen, in dem das SDK installiert ist.It requires that the path environment variable point to the directory where the SDK is installed. Diese Umgebungsvariable ist innerhalb einer Visual Studio-Eingabeaufforderung (2010) automatisch festgelegt.This environment variable is automatically set within a Visual Studio 2010 Command Prompt.

    5. Ändern der <ServiceCertificate > innerhalb der Datei Service.exe.config entsprechend der Antragstellername des Zertifikats, das im vorherigen Schritt generiert.Change the <serviceCertificate> inside the Service.exe.config file to reflect the subject name of the certificate generated in the previous step.

    6. Führen Sie Service.exe an einer Eingabeaufforderung aus.Run Service.exe from a command prompt.

  2. Auf dem Clientcomputer:On the client computer:

    1. Kopieren Sie die Clientprogrammdateien aus dem Ordner \client\bin\ auf den Clientcomputer.Copy the client program files from the \client\bin\ folder to the client computer. Kopieren Sie auch die Datei Cleanup.bat.Also copy the Cleanup.bat file.

    2. Führen Sie Cleanup.bat aus, um alte Zertifikate aus vorherigen Beispielen zu entfernen.Run Cleanup.bat to remove any old certificates from previous samples.

    3. Exportieren Sie das Dienstzertifikat, indem Sie eine Visual Studio-Eingabeaufforderung mit Administratorrechten öffnen und den folgenden Befehl auf dem Dienstcomputer ausführen (ersetzen Sie %SERVER_NAME% durch den vollqualifizierten Namen des Computers, auf dem der Dienst ausgeführt wird):Export the service's certificate by opening a Visual Studio command prompt with administrative privileges, and running the following command on the service computer (substitute %SERVER_NAME% with the fully-qualified name of the computer where the service is running):

      certmgr -put -r LocalMachine -s My -c -n %SERVER_NAME% %SERVER_NAME%.cer  
      
    4. Kopieren Sie %SERVER_NAME%.cer auf den Clientcomputer (ersetzen Sie %SERVER_NAME% durch den vollqualifizierten Namen des Computers, auf dem der Dienst ausgeführt wird).Copy %SERVER_NAME%.cer to the client computer (substitute %SERVER_NAME% with the fully-qualified name of the computer where the service is running).

    5. Importieren Sie das Dienstzertifikat, indem Sie eine Visual Studio-Eingabeaufforderung mit Administratorrechten öffnen und den folgenden Befehl auf dem Clientcomputer ausführen (ersetzen Sie %SERVER_NAME% durch den vollqualifizierten Namen des Computers, auf dem der Dienst ausgeführt wird):Import the service's certificate by opening a Visual Studio command prompt with administrative privileges, and running the following command on the client computer (substitute %SERVER_NAME% with the fully-qualified name of the computer where the service is running):

      certmgr.exe -add -c %SERVER_NAME%.cer -s -r CurrentUser TrustedPeople  
      

      Die Schritte c, d und e sind nicht erforderlich, wenn das Zertifikat von einem vertrauenswürdigen Aussteller stammt.Steps c, d, and e are not necessary if the certificate is issued by a Trusted Issuer.

    6. Ändern Sie die Datei App.config des Clients wie folgt:Modify the client’s App.config file as follows:

      <client>  
          <endpoint name="default"  
              address="net.tcp://ReplaceThisWithServiceMachineName:8000/ServiceModelSamples/Service"   
              binding="customBinding"   
              bindingConfiguration="Binding1"   
              contract="Microsoft.ServiceModel.Samples.ICalculatorDuplex"  
      behaviorConfiguration="CalculatorClientBehavior" />  
      </client>  
      
    7. Wenn der Dienst unter einem anderen Konto als NetworkService oder LocalSystem in einer Domänenumgebung ausgeführt wird, müssen Sie möglicherweise die Endpunktidentität für den Dienstendpunkt in der Datei App.config des Clients ändern und den entsprechenden UPN oder SPN für das Konto angeben, unter dem der Dienst ausgeführt wird.If the service is running under an account other than the NetworkService or LocalSystem account in a domain environment, you might need to modify the endpoint identity for the service endpoint inside the client's App.config file to set the appropriate UPN or SPN based on the account that is used to run the service. Weitere Informationen zur Identität des Endpunkts finden Sie unter der -Dienstidentität und Authentifizierung Thema.For more information about endpoint identity, see the Service Identity and Authentication topic.

    8. Führen Sie an einer Eingabeaufforderung Client.exe aus.Run Client.exe from a command prompt.

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

  • Führen Sie Cleanup.bat im Beispielordner aus, nachdem Sie die Ausführung des Beispiels abgeschlossen haben.Run Cleanup.bat in the samples folder after you have finished running the sample.

Siehe auchSee Also