Nachrichtensicherheit – BenutzernameMessage Security User Name

Dieses Beispiel zeigt, wie eine Anwendung implementiert wird, die WS-Sicherheit mit Benutzernamenauthentifizierung für den Client verwendet und eine Serverauthentifizierung über das X.509v3-Zertifikat des Servers erfordert.This sample demonstrates how to implement an application that uses WS-Security with username authentication for the client and requires server authentication using the server's X.509v3 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. Standardmäßig werden ein vom Client angegebener Benutzername und ein Kennwort zum Anmelden bei einem gültigen Windows-Konto verwendet.By default, the username and password supplied by the client are used to logon to a valid Windows account. Dieses Beispiel basiert auf der WSHttpBinding.This sample is based on the WSHttpBinding. Das Beispiel besteht aus einem Clientkonsolenprogramm (Client.exe) und einer von IIS (Internet Information Services, Internetinformationsdienste) gehosteten Dienstbibliothek (Service.dll).This sample consists of a client console program (Client.exe) and a service library (Service.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 veranschaulicht darüber hinaus:This sample also demonstrates:

  • Die Standardzuordnung zu Windows-Konten, sodass zusätzliche Autorisierung ausgeführt werden kann.The default mapping to Windows accounts so that additional authorization can be performed.

  • Wie auf die Identitätsinformationen der Aufrufer vom Dienstcode aus zugegriffen wird.How to access the caller's identity information from the service code.

Der Dienst macht einen einzigen Endpunkt zur Kommunikation mit dem Dienst verfügbar. Dieser wird mit der Konfigurationsdatei "Web.config" definiert. Der Endpunkt besteht aus einer Adresse, einer Bindung und einem Vertrag.The service exposes a single endpoint for communicating with the service, which is defined using the configuration file Web.config. The endpoint consists of an address, a binding, and a contract. Die Bindung ist konfiguriert, mit einer normalen <WsHttpBinding >, die standardmäßig nachrichtensicherheit.The binding is configured with a standard <wsHttpBinding>, which defaults to using message security. In diesem Beispiel wird das Standard- <WsHttpBinding > auf die Verwendung der clientbenutzernamenauthentifizierung festgelegt.This sample sets the standard <wsHttpBinding> to use client username authentication. Das Verhalten gibt an, dass zur Dienstauthentifizierung die Benutzeranmeldeinformationen verwendet werden sollen.The behavior specifies that the user credentials are to be used for service authentication. Das Serverzertifikat muss den gleichen Wert für den Antragstellernamen als enthalten die findValue Attribut in der <ServiceCredentials >.The server certificate must contain the same value for the subject name as the findValue attribute in the <serviceCredentials>.

<system.serviceModel>  
  <protocolMapping>  
    <add scheme="http" binding="wsHttpBinding" />  
  </protocolMapping>  
  <bindings>  
    <wsHttpBinding>  
      <!--   
      This configuration defines the security mode as Message and   
      the clientCredentialType as Username.  
      By default, Username authentication attempts to authenticate the provided  
      username as a Windows computer or domain account.  
      -->  
      <binding>  
        <security mode="Message">  
          <message clientCredentialType="UserName"/>  
        </security>  
      </binding>  
    </wsHttpBinding>  
  </bindings>  

  <!--For debugging purposes set the includeExceptionDetailInFaults attribute to true.-->  
  <behaviors>  
    <serviceBehaviors>  
      <behavior>  
        <!--   
      The serviceCredentials behavior allows one to define a service certificate.  
      A service certificate is used by the service to authenticate itself to the client and to 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>  
</system.serviceModel>  

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. Die Clientbindung wird mit dem entsprechenden securityMode und authenticationMode konfiguriert.The client binding is configured with the appropriate securityMode and authenticationMode. Bei Ausführung in einem computerübergreifenden Szenario muss die Endpunktadresse entsprechend geändert werden.When running in a cross-computer scenario, the service endpoint address must be changed accordingly.

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

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

  <!--For debugging purposes set the includeExceptionDetailInFaults attribute to true.-->  
  <behaviors>  
    <endpointBehaviors>  
      <behavior name="ClientCredentialsBehavior">  
        <!--   
      Setting the certificateValidationMode to PeerOrChainTrust 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. This setting is used here for convenience so that the   
      sample can be run without having to have certificates issued by a certification authority (CA).  
      This setting is less secure than the default, ChainTrust. The security implications of this   
      setting should be carefully considered before using PeerOrChainTrust in production code.   
      -->  
        <clientCredentials>  
          <serviceCertificate>  
            <authentication certificateValidationMode="PeerOrChainTrust" />  
          </serviceCertificate>  
        </clientCredentials>  
      </behavior>  
    </endpointBehaviors>  
  </behaviors>  
</system.serviceModel>  

Die Clientimplementierung legt den zu verwendenden Benutzernamen und das Kennwort fest.The client implementation sets the user name and password to use.

// Create a client.  
CalculatorClient client = new CalculatorClient();  

// Configure client with valid computer or domain account (username,password).  
client.ClientCredentials.UserName.UserName = username;  
client.ClientCredentials.UserName.Password = password.ToString();  

// Call GetCallerIdentity service operation.  
Console.WriteLine(client.GetCallerIdentity());  
...  
//Closing the client gracefully closes the connection and cleans up resources.  
client.Close();  

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.

MyMachine\TestAccount  
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 in den MessageSecurity-Beispielen 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 MessageSecurity samples 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.You 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 ServerzertifikatsCreating 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. Wird die Batchdatei Setup.bat mit einem service-Argument ausgeführt (z. B. setup.bat service), enthält %SERVER_NAME% den vollqualifizierten Domänennamen des Computers.If the Setup.bat 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 des Serverzertifikats im Speicher für vertrauenswürdige Zertifikate des ClientsInstalling 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 ZertifikatsGranting 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 ('"%ProgramFiles%\ServiceModelSampleTools\FindPrivateKey.exe" My LocalMachine -n CN^=%SERVER_NAME% -a') do set PRIVATE_KEY_FILE=%%i  
    set WP_ACCOUNT=NT AUTHORITY\NETWORK SERVICE  
    (ver | findstr /C:"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 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-Eingabeaufforderung ausgeführt zu werden.The Setup.bat batch file is designed to be run from a Visual Studio 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 automatisch festgelegt.This environment variable is automatically set within a Visual Studio Command 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 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 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 Sie die Datei Web.config so, dass sie den neuen Zertifikatnamen (im findValue-Attribut im serviceCertificate-Element) enthält, der dem vollqualifizierten Domänennamen des Computers entspricht.Edit Web.config to reflect the new certificate name (in the findValue attribute in the serviceCertificate element) 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