Nachrichtensicherheit – anonymMessage Security Anonymous

Nachrichtensicherheit – anonym wird veranschaulicht, wie eine Windows Communication Foundation (WCF)-Anwendung implementiert wird, die Sicherheit auf Nachrichtenebene ohne Clientauthentifizierung verwendet, aber erfordert Server-Authentifizierung mit dem Server x. 509 Zertifikat.The Message Security Anonymous sample demonstrates how to implement a Windows Communication Foundation (WCF) application that uses message-level security with no client authentication but that requires server authentication using the server's X.509 certificate. Alle Anwendungsnachrichten zwischen dem Client und dem Server werden signiert und verschlüsselt.All application messages between the client and server are signed and encrypted. Dieses Beispiel basiert auf der WSHttpBinding Beispiel.This sample is based on the WSHttpBinding sample. Dieses Beispiel besteht aus einem Clientkonsolenprogramm (.exe) und einer von IIS (Internet Information Services, Internetinformationsdienste) gehosteten Dienstbibliothek (.dll).This sample consists of a client console program (.exe) and a service library (.dll) hosted by Internet Information Services (IIS). Der Dienst implementiert einen Vertrag, der ein Anforderungs-Antwort-Kommunikationsmuster definiert.The service implements a contract that defines a request-reply communication pattern.

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.

Dieses Beispiel fügt einen neuen Vorgang zur Rechnerschnittstelle hinzu, der True zurückgibt, wenn der Client nicht authentifiziert wurde.This sample adds a new operation to the calculator interface that returns True if the client was not authenticated.

public class CalculatorService : ICalculator  
{  
    public bool IsCallerAnonymous()  
    {  
        // ServiceSecurityContext.IsAnonymous returns true if the caller is not authenticated.  
        return ServiceSecurityContext.Current.IsAnonymous;  
    }  
    ...  
}  

Der Dienst macht einen einzigen Endpunkt zur Kommunikation mit dem Dienst verfügbar, der mit einer Konfigurationsdatei (Web.conf) definiert wird.The service exposes a single endpoint for communicating with the service, defined using a configuration file (Web.config). 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 wsHttpBinding-Bindung konfiguriert.The binding is configured with a wsHttpBinding binding. Der Standardsicherheitsmodus für die wsHttpBinding-Bindung ist Message.The default security mode for the wsHttpBinding binding is Message. Das clientCredentialType-Attribut ist auf None festgelegt.The clientCredentialType attribute is set to None.

<system.serviceModel>  

  <protocolMapping>  
    <add scheme="http" binding="wsHttpBinding" />  
  </protocolMapping>  

  <bindings>  
    <wsHttpBinding>  
     <!--   
     <!--This configuration defines the security mode as Message and-->  
     <!--the clientCredentialType as None. This mode provides -- >  
     <!--server authentication only using the service certificate.-->  

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

Die Anmeldeinformationen für die Dienstauthentifizierung zu verwendende werden angegeben, der <Verhalten >.The credentials to be used for service authentication are specified in the <behavior>. Der Wert für SubjectName des Serverzertifikats muss dem Wert des findValue-Attributs entsprechen (wie in folgendem Beispielcode gezeigt).The server certificate must contain the same value for the SubjectName as the value specified for the findValue attribute as shown in the following sample code.

<behaviors>  
  <serviceBehaviors>  
    <behavior>  
      <!--   
    The serviceCredentials behavior allows you 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>  
      <serviceMetadata httpGetEnabled="True"/>  
      <serviceDebug includeExceptionDetailInFaults="False" />  
    </behavior>  
  </serviceBehaviors>  
</behaviors>  

Die Clientendpunktkonfiguration besteht aus einer absoluten Adresse für den Dienstendpunkt, der Bindung und dem Vertrag.The client endpoint configuration consists of an absolute address for the service endpoint, the binding, and the contract. Der Clientsicherheitsmodus für die wsHttpBinding-Bindung ist Message.The client security mode for the wsHttpBinding binding is Message. Das clientCredentialType-Attribut ist auf None festgelegt.The clientCredentialType attribute is set to None.

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

  <bindings>  
    <wsHttpBinding>  
      <!--This configuration defines the security mode as -->  
      <!--Message and the clientCredentialType as None. -->  
      <binding name="Binding1">  
        <security mode = "Message">  
          <message clientCredentialType="None"/>  
        </security>  
      </binding>  
    </wsHttpBinding>  
  </bindings>   
  ...  
</system.serviceModel>  

Das Beispiel setzt den CertificateValidationMode für die Authentifizierung des Dienstzertifikats auf PeerOrChainTrust.The sample sets the CertificateValidationMode to PeerOrChainTrust for authenticating the service's certificate. Dies erfolgt in der Datei "App.config" des Clients im Abschnitt behaviors.This is done in the client's App.config file in the behaviors section. Wenn sich das Zertifikat also im Speicher für vertrauenswürdige Personen des Benutzers befindet, wird es als vertrauenswürdig eingestuft wird, ohne dass eine Validierung der Ausstellerkette des Zertifikats erfolgt.This means that if the certificate is in the user's Trusted People store, then it is trusted without performing a validation of the certificate's issuer chain. Diese Einstellung wird hier der Einfachheit halber verwendet. So kann das Beispiel ausgeführt werden, ohne dass Zertifikate erforderlich sind, die von einer Zertifizierungsstelle ausgestellt wurden.This setting is used here for convenience so that the sample can be run without requiring certificates issued by a certification authority (CA). Diese Einstellung ist weniger sicher als die Standardeinstellung ChainTrust.This setting is less secure than the default, ChainTrust. Die aus dieser Einstellung resultierenden Sicherheitsauswirkungen sollten sorgfältig bedacht werden, bevor PeerOrChainTrust im Produktionscode verwendet wird.The security implications of this setting should be carefully considered before using PeerOrChainTrust in production code.

Die Clientimplementierung Fügt einen Aufruf der IsCallerAnonymous Methode, und andernfalls unterscheidet sich nicht von der WSHttpBinding Beispiel.The client implementation adds a call to the IsCallerAnonymous method and otherwise does not differ from the WSHttpBinding sample.

// Create a client with a client endpoint configuration.  
CalculatorClient client = new CalculatorClient();  

// Call the GetCallerIdentity operation.  
Console.WriteLine("IsCallerAnonymous returned: {0}", client.IsCallerAnonymous());  

// Call the Add service operation.  
double value1 = 100.00D;  
double value2 = 15.99D;  
double result = client.Add(value1, value2);  
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);  

...  

//Closing the client gracefully closes the connection and cleans up resources.  
client.Close();  

Console.WriteLine();  
Console.WriteLine("Press <ENTER> to terminate client.");  
Console.ReadLine();  

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.

IsCallerAnonymous returned: True  
Add(100,15.99) = 115.99  
Subtract(145,76.54) = 68.46  
Multiply(9,81.25) = 731.25  
Divide(22,7) = 3.14285714285714  
Press <ENTER> to terminate client.  

Mit der im Beispiel "Nachrichtensicherheit – anonym" enthaltenen Batchdatei Setup.bat können Sie den Server mit einem relevanten Zertifikat zum Ausführen einer gehosteten Anwendung konfigurieren, die serverzertifikatbasierte Sicherheit erfordert.The Setup.bat batch file included with the Message Security Anonymous sample enables you to configure the server with a relevant certificate to run a hosted application that requires certificate-based security. Die Batchdatei kann in zwei Modi ausgeführt werden.The batch file can be run in two modes. Um die Batchdatei im Einzelcomputermodus auszuführen, geben Sie in der Befehlszeile setup.bat ein.To run the batch file in the single-computer mode, type setup.bat at the command line. Um sie im Dienstmodus auszuführen, geben Sie setup.bat service ein.To run it in service mode, type setup.bat service. Verwenden Sie diesen Modus, wenn Sie das Beispiel computerübergreifend ausführen.Use this mode when running the sample across computers. Weitere Informationen finden Sie in der Setupprozedur am Ende dieses Themas.See the setup procedure at the end of this topic for details.

Im Folgenden wird eine kurze Übersicht über die verschiedenen Abschnitte der Batchdateien bereitgestellt:The following provides a brief overview of the different sections of the batch files:

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

    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  
    

    Die Variable %SERVER_NAME% gibt den Servernamen an.The %SERVER_NAME% variable specifies the server name. Das Zertifikat wird im LocalMachine-Speicher gespeichert.The certificate is stored in the LocalMachine store. Wenn die Setupbatchdatei mit dem service-Argument ausgeführt wird (z. B. setup.bat service), enthält %SERVER_NAME% den vollqualifizierten Domänennamen des Computers.If the setup batch file is run with an argument of service (such as setup.bat service) the %SERVER_NAME% contains the fully-qualified domain name of the computer. Andernfalls wird standardmäßig localhost verwendet.Otherwise it defaults to localhost.

  • Installieren Sie das Serverzertifikat im Speicher für vertrauenswürdige Zertifikate des Clients.Installing the server certificate into the client's trusted certificate store.

    Die folgenden Zeilen kopieren das Serverzertifikat in den Clientspeicher für vertrauenswürdige Personen.The following line copies 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  
    
  • Gewähren von Berechtigungen auf dem privaten Schlüssel des Zertifikats.Granting permissions on the certificate's private key.

    Die folgenden Zeilen in der Batchdatei Setup.bat sorgen dafür, dass das Serverzertifikat, das im Speicher LocalMachine gespeichert ist, für das ASP.NETASP.NET-Arbeitsprozesskonto verfügbar ist.The following lines in the Setup.bat batch file make the server certificate stored in the LocalMachine store accessible to the ASP.NETASP.NET worker process account.

    echo ************  
    echo setting privileges on server certificates  
    echo ************  
    for /F "delims=" %%i in ('"%MSSDK%\bin\FindPrivateKey.exe" My LocalMachine -n CN^=%SERVER_NAME% -a') do set PRIVATE_KEY_FILE=%%i set WP_ACCOUNT=NT AUTHORITY\NETWORK SERVICE  
    (ver | findstr "5.1") && set WP_ACCOUNT=%COMPUTERNAME%\ASPNET  
    echo Y|cacls.exe "%PRIVATE_KEY_FILE%" /E /G "%WP_ACCOUNT%":R  
    iisreset  
    

Hinweis

Bei Verwendung einer anderen als der englischsprachigen US-Version von Windows müssen Sie in der Datei "Setup.bat" den Kontonamen NT AUTHORITY\NETWORK SERVICE durch den äquivalenten Kontonamen in der entsprechenden Sprache ersetzen.If you are using a non-U.S. English edition of Windows you must edit the Setup.bat file and replace the NT AUTHORITY\NETWORK SERVICE account name with your regional equivalent.

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.

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

  1. Vergewissern Sie sich, dass der Pfad den Ordner enthält, in dem sich die Dateien Makecert.exe und FindPrivateKey.exe befinden.Ensure that the path includes the folder where Makecert.exe and FindPrivateKey.exe are located.

  2. Führen Sie Setup.bat aus dem Beispielinstallationsordner an einer Visual Studio-Eingabeaufforderung mit Administratorrechten aus.Run Setup.bat from the sample install folder in a Visual Studio command prompt run 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 Setupbatchdatei ist dafür gedacht, an einer Visual Studio 2012Visual Studio 2012-Eingabeaufforderung ausgeführt zu werden.The setup batch file is designed to be run from a Visual Studio 2012Visual Studio 2012Command 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 wird automatisch innerhalb einer Visual Studio 2012Visual Studio 2012-Eingabeaufforderung festgelegt.This environment variable is automatically set within a Visual Studio 2012Visual Studio 2012Command Prompt.

  3. Überprüfen des Zugriffs auf den Dienst mithilfe eines Browsers durch Eingabe der Adresse http://localhost/servicemodelsamples/service.svc.Verify access to the service using a browser by entering the address http://localhost/servicemodelsamples/service.svc.

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

  5. 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.Create a directory on the service computer. Erstellen Sie mithilfe des Verwaltungstools für Internetinformationsdienste (IIS) für dieses Verzeichnis eine virtuelle Anwendung mit dem Namen servicemodelsamples.Create a virtual application named servicemodelsamples for this directory by using the Internet Information Services (IIS) management tool.

  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. 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. Erstellen Sie auf dem Clientcomputer ein Verzeichnis für die Clientbinärdateien.Create a directory on the client computer for the client binaries.

  4. Kopieren Sie die Clientprogrammdateien in das Clientverzeichnis auf dem Clientcomputer.Copy the client program files to the client directory on the client computer. Kopieren Sie die Dateien Setup.bat, Cleanup.bat und ImportServiceCert.bat ebenfalls auf den Client.Also copy the Setup.bat, Cleanup.bat, and ImportServiceCert.bat files to the client.

  5. Führen Sie auf dem Server setup.bat service an einer Visual Studio-Eingabeaufforderung mit Administratorrechten aus.On the server, run setup.bat service in a Visual Studio command prompt opened with administrator privileges. Ausführen setup.bat mit der service Argument wird ein Dienstzertifikat mit dem vollqualifizierten Domänennamen des Computers erstellt und das Dienstzertifikat in eine Datei "Service.cer" exportiert exportiert.Running setup.bat with the service argument creates a service certificate with the fully-qualified domain name of the computer and exports the service certificate to a file named Service.cer.

  6. Bearbeiten der Datei "Web.config", um den neuen Zertifikatnamen entspricht (in der findValue Attribut in der <ServiceCertificate >), also den voll qualifizierten Domänennamen des Computers identisch.Edit Web.config to reflect the new certificate name (in the findValue attribute in the <serviceCertificate>), which is the same as the fully-qualified domain name of the computer.

  7. Kopieren Sie die Datei Service.cer aus dem Dienstverzeichnis in das Clientverzeichnis auf dem Clientcomputer.Copy the Service.cer file from the service directory to the client directory on 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. Führen Sie auf dem Client ImportServiceCert.bat an einer Visual Studio-Eingabeaufforderung mit Administratorrechten aus.On the client, run ImportServiceCert.bat in a Visual Studio command prompt opened with administrator privileges. Dadurch wird das Dienstzertifikat aus der Datei Service.cer in den Speicher CurrentUser – TrustedPeople importiert.This imports the service certificate from the Service.cer file into the CurrentUser - TrustedPeople store.

  10. Starten Sie auf dem Clientcomputer Client.exe an einer Eingabeaufforderung.On the client computer, launch Client.exe from a command prompt. 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

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

Hinweis

Wenn dieses Beispiel computerübergreifend ausgeführt wird, entfernt dieses Skript keine Dienstzertifikate auf einem Client.This script does not remove service certificates on a client when running this sample across computers. Wenn Sie Windows Communication Foundation (WCF)-Beispielen, die Zertifikate computerübergreifend verwenden ausgeführt haben, achten Sie darauf, dass Sie die Dienstzertifikate entfernen, die in den Speicher CurrentUser - trustedpeople installiert wurden.If you have run Windows Communication Foundation (WCF) samples that use certificates across computers, be sure to clear the service certificates that have been installed in the CurrentUser - TrustedPeople store. Verwenden Sie dazu den folgenden Befehl: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name> Beispiel: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com..To do this, use the following command: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name> For example: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.

Siehe auchSee Also