Benutzerdefinierter sicherer MetadatenendpunktCustom Secure Metadata Endpoint

In diesem Beispiel wird veranschaulicht, wie einen Dienst mit einem sicheren Metadatenendpunkt implementiert, die eines der nicht-standardmetadatenaustausch-Bindungen verwendet, und konfigurieren ServiceModel Metadata Utility Tool (Svcutil.exe) oder -Clients beim Abrufen der Metadaten eines metadatenendpunkts.This sample demonstrates how to implement a service with a secure metadata endpoint that uses one of the non-metadata exchange bindings, and how to configure ServiceModel Metadata Utility Tool (Svcutil.exe) or clients to fetch the metadata from such a metadata endpoint. Es gibt zwei vom System bereitgestellte Bindungen, die für die Bereitstellung von Metadatenendpunkten verfügbar sind: mexHttpBinding und mexHttpsBinding.There are two system-provided bindings available for exposing metadata endpoints: mexHttpBinding and mexHttpsBinding. mexHttpBinding wird verwendet, um einen Metadatenendpunkt über eine nicht sichere Verbindung über HTTP bereitzustellen.mexHttpBinding is used to expose a metadata endpoint over HTTP in a non-secure manner. mexHttpsBinding wird verwendet, um einen Metadatenendpunkt über eine sichere Verbindung über HTTPS verfügbar zu machen.mexHttpsBinding is used to expose a metadata endpoint over HTTPS in a secure manner. In diesem Beispiel wird veranschaulicht, wie ein sicherer Metadatenendpunkt mithilfe der WSHttpBinding verfügbar gemacht wird.This sample illustrates how to expose a secure metadata endpoint using the WSHttpBinding. Diese Vorgehensweise eignet sich, wenn Sie die Sicherheitseinstellungen der Bindung ändern, aber nicht HTTPS verwenden möchten.You would want to do this when you want to change the security settings on the binding, but you do not want to use HTTPS. Wenn Sie mexHttpsBinding verwenden, ist der Metadatenendpunkt sicher, die Bindungseinstellungen können jedoch nicht geändert werden.If you use the mexHttpsBinding your metadata endpoint will be secure, but there is no way to modify the binding settings.

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.

DienstService

Der Dienst in diesem Beispiel hat zwei Endpunkte.The service in this sample has two endpoints. Der Anwendungsendpunkt wird vom ICalculator-Vertrag auf einer WSHttpBinding mit aktivierter ReliableSession und einer Message-Sicherheit mit Zertifikaten genutzt.The application endpoint serves the ICalculator contract on a WSHttpBinding with ReliableSession enabled and Message security using certificates. Der Metadatenendpunkt verwendet ebenfalls WSHttpBinding mit denselben Sicherheitseinstellungen, jedoch ohne ReliableSession.The metadata endpoint also uses WSHttpBinding, with the same security settings but with no ReliableSession. Nachfolgend wird die relevante Konfiguration dargestellt:Here is the relevant configuration:

<services>   
    <service name="Microsoft.ServiceModel.Samples.CalculatorService"  
             behaviorConfiguration="CalculatorServiceBehavior">  
     <!-- use base address provided by host -->  
     <endpoint address=""  
       binding="wsHttpBinding"  
       bindingConfiguration="Binding2"  
       contract="Microsoft.ServiceModel.Samples.ICalculator" />  
     <endpoint address="mex"  
       binding="wsHttpBinding"  
       bindingConfiguration="Binding1"  
       contract="IMetadataExchange" />  
     </service>  
 </services>  
 <bindings>  
   <wsHttpBinding>  
     <binding name="Binding1">  
       <security mode="Message">  
         <message clientCredentialType="Certificate" />  
       </security>  
     </binding>  
     <binding name="Binding2">  
       <reliableSession inactivityTimeout="00:01:00" enabled="true" />  
       <security mode="Message">  
         <message clientCredentialType="Certificate" />  
       </security>  
     </binding>  
   </wsHttpBinding>  
 </bindings>  

In vielen der anderen Beispiele verwendet der Metadatenendpunkt die standardmäßige mexHttpBinding, die nicht sicher ist.In many of the other samples, the metadata endpoint uses the default mexHttpBinding, which is not secure. Hier werden die Metadaten durch WSHttpBinding mit Message-Sicherheit gesichert.Here the metadata is secured using WSHttpBinding with Message security. Damit Metadaten-Clients diese Metadaten abrufen können, müssen sie mit einer übereinstimmenden Bindung konfiguriert werden.In order for metadata clients to retrieve this metadata, they must be configured with a matching binding. In diesem Beispiel werden zwei dieser Clients dargestellt.This sample demonstrates two such clients.

Der erste Client verwendet zum Abrufen der Metadaten und Generieren von Clientcode sowie der Konfiguration zur Entwurfszeit die Datei "Svcutil.exe".The first client uses Svcutil.exe to fetch the metadata and generate client code and configuration at design time. Da der Dienst eine nicht standardmäßige Bindung für die Metadaten verwendet, muss das "Svcutil.exe"-Tool entsprechend konfiguriert werden, sodass es die Metadaten vom Dienst mithilfe dieser Bindung abrufen kann.Because the service uses a non-default binding for the metadata, the Svcutil.exe tool must be specifically configured so that it can get the metadata from the service using that binding.

Der zweite Client nutzt MetadataResolver, um die Metadaten für einen bekannten Vertrag dynamisch abzurufen und dann Vorgänge auf dem dynamisch generierten Client auszulösen.The second client uses the MetadataResolver to dynamically fetch the metadata for a known contract and then invoke operations on the dynamically generated client.

Svcutil-ClientSvcutil client

Wenn Sie die Standardbindung zum Hosten des IMetadataExchange-Endpunkts verwenden, können Sie "Svcutil.exe" mit der Adresse dieses Endpunkts ausführen:When using the default binding to host your IMetadataExchange endpoint, you can run Svcutil.exe with the address of that endpoint:

svcutil http://localhost/servicemodelsamples/service.svc/mex  

Und es funktioniert.and it works. In diesem Beispiel verwendet der Server jedoch einen nicht standardmäßigen Endpunkt, um die Metadaten zu hosten.But in this sample, the server uses a non-default endpoint to host the metadata. Deshalb muss „Svcutil.exe“ angewiesen werden, die richtige Bindung zu verwenden.So Svcutil.exe must be instructed to use the correct binding. Dazu können Sie eine Datei "Svcutil.exe.config" verwenden.This can be done using a Svcutil.exe.config file.

Die Datei "Svcutil.exe.config" sieht wie eine normale Clientkonfigurationsdatei aus.The Svcutil.exe.config file looks like a normal client configuration file. Die einzigen ungewöhnlichen Aspekte sind der Clientendpunktname und -vertrag:The only unusual aspects are the client endpoint name and contract:

<endpoint name="http"  
          binding="wsHttpBinding"  
          bindingConfiguration="Binding1"  
          behaviorConfiguration="ClientCertificateBehavior"  
          contract="IMetadataExchange" />  

Der Endpunktname muss mit dem Namen des Schemas der Adresse übereinstimmen, auf der die Metadaten gehostet sind, und der Endpunktvertrag muss IMetadataExchange lauten.The endpoint name must be the name of the scheme of the address where the metadata is hosted and the endpoint contract must be IMetadataExchange. Wenn also "Svcutil.exe" mit einer Befehlszeile wie der folgenden ausgeführt wird:Thus, when Svcutil.exe is run with a command-line such as the following:

svcutil http://localhost/servicemodelsamples/service.svc/mex  

sucht es nach dem Endpunkt namens "http" und dem Vertrag IMetadataExchange, um die Bindung und das Verhalten des Kommunikationsaustauschs mit dem Metadatenendpunkt zu konfigurieren.it looks for the endpoint named "http" and contract IMetadataExchange to configure the binding and behavior of the communication exchange with the metadata endpoint. Der übrige Teil der Datei "Svcutil.exe.config" im Beispiel legt die Bindungskonfiguration und Verhaltensanmeldeinformationen fest, um mit der Konfiguration des Servers für den Metadatenendpunkt übereinzustimmen.The rest of the Svcutil.exe.config file in the sample specifies the binding configuration and behavior credentials to match the server's configuration of the metadata endpoint.

Damit "Svcutil.exe" die Konfiguration in "Svcutil.exe.config" übernehmen kann, muss sich "Svcutil.exe" im selben Verzeichnis wie die Konfigurationsdatei befinden.In order for Svcutil.exe to pick up the configuration in Svcutil.exe.config, Svcutil.exe must be in the same directory as the configuration file. Demzufolge müssen Sie "Svcutil.exe" aus seinem Installationsort in das Verzeichnis kopieren, in dem die Datei "Svcutil.exe.config" gespeichert ist.As a result, you must copy Svcutil.exe from its install location to the directory that contains the Svcutil.exe.config file. Führen Sie dann in diesem Verzeichnis den folgenden Befehl aus:Then from that directory, run the following command:

.\svcutil.exe http://localhost/servicemodelsamples/service.svc/mex  

Das führende ". \"wird sichergestellt, dass die Kopie von Svcutil.exe in diesem Verzeichnis (die eines, das einem entsprechenden" Svcutil.exe.config ") ausgeführt wird.The leading ".\" ensures that the copy of Svcutil.exe in this directory (the one which has a corresponding Svcutil.exe.config) is run.

MetadataResolver-ClientMetadataResolver client

Wenn der Client zur Entwurfszeit den Vertrag kennt und weiß, wie er mit den Metadaten kommuniziert, kann er mithilfe von MetadataResolver die Bindung und Adresse der Anwendungsendpunkte dynamisch herausfinden.If the client knows the contract and how to talk to the metadata at design time, the client can dynamically find out the binding and address of application endpoints using the MetadataResolver. Dies wird in diesem Beispielclient dargestellt. Es wird gezeigt, wie die vom MetadataResolver verwendete Bindung und die Anmeldeinformationen konfiguriert werden, indem ein MetadataExchangeClient erstellt und konfiguriert wird.This sample client demonstrates this, showing how to configure the binding and credentials used by MetadataResolver by creating and configuring a MetadataExchangeClient.

Die Bindungs- und Zertifikatsinformationen, die in "Svcutil.exe.config" angezeigt wurden, können auf dem MetadataExchangeClient zwingend angegeben werden:The same binding and certificate information that appeared in Svcutil.exe.config can be specified imperatively on the MetadataExchangeClient:

// Specify the Metadata Exchange binding and its security mode  
WSHttpBinding mexBinding = new WSHttpBinding(SecurityMode.Message);  
mexBinding.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;  

// Create a MetadataExchangeClient for retrieving metadata, and set the // certificate details  
MetadataExchangeClient mexClient = new MetadataExchangeClient(mexBinding);  
mexClient.SoapCredentials.ClientCertificate.SetCertificate(    StoreLocation.CurrentUser, StoreName.My,  
    X509FindType.FindBySubjectName, "client.com");  
mexClient.SoapCredentials.ServiceCertificate.Authentication.    CertificateValidationMode =    X509CertificateValidationMode.PeerOrChainTrust;  
mexClient.SoapCredentials.ServiceCertificate.SetDefaultCertificate(    StoreLocation.CurrentUser, StoreName.TrustedPeople,  
    X509FindType.FindBySubjectName, "localhost");  

Nachdem der mexClient konfiguriert ist, können Sie die für Sie interessanten Verträge auflisten und MetadataResolver verwenden, um eine Liste der Endpunkte mit diesen Verträgen abzurufen:With the mexClient configured, we can enumerate the contracts we are interested in, and use MetadataResolver to fetch a list of endpoints with those contracts:

// The contract we want to fetch metadata for  
Collection<ContractDescription> contracts =    new Collection<ContractDescription>();  
ContractDescription contract =    ContractDescription.GetContract(typeof(ICalculator));  
contracts.Add(contract);  
// Find endpoints for that contract  
EndpointAddress mexAddress = new    EndpointAddress(ConfigurationManager.AppSettings["mexAddress"]);  
ServiceEndpointCollection endpoints =    MetadataResolver.Resolve(contracts, mexAddress, mexClient);  

Abschließend können Sie die Informationen von diesen Endpunkten dazu verwenden, die Bindung und die Adresse einer ChannelFactory zu initialisieren, die zum Erstellen von Kanälen für die Kommunikation mit den Anwendungsendpunkten verwendet wird.Finally we can use the information from those endpoints to initialize the binding and address of a ChannelFactory used to create channels to communicate with the application endpoints.

ChannelFactory<ICalculator> cf = new    ChannelFactory<ICalculator>(endpoint.Binding, endpoint.Address);  

Als wichtigster Punkt soll in diesem Beispielclient veranschaulicht werden, dass Sie einen MetadataResolver zum Festlegen dieser benutzerdefinierten Einstellungen verwenden können, wenn Sie MetadataExchangeClient verwenden und benutzerdefinierte Bindungen oder Verhalten für die Metadatenaustauschkommunikation festlegen müssen.The key point of this sample client is to demonstrate that, if you are using MetadataResolver, and you must specify custom bindings or behaviors for the metadata exchange communication, you can use a MetadataExchangeClient to specify those custom settings.

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 machine

  1. Führen Sie "Setup.bat" im Beispielinstallationsordner aus.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. Beachten Sie, dass "Setup.bat" das Tool FindPrivateKey.exe, die installiert ist verwendet, durch Ausführen von "setupcerttool.bat" aus, aus Setupprozedur für die Windows Communication Foundation-Beispiele zum einmaligen.Note that Setup.bat uses the FindPrivateKey.exe tool, which is installed by running setupCertTool.bat from One-Time Setup Procedure for the Windows Communication Foundation Samples.

  2. Führen Sie die Clientanwendung von "\MetadataResolverClient\bin" oder von ""\SvcutilClient\bin" aus.Run the client application from \MetadataResolverClient\bin or \SvcutilClient\bin. In der Clientkonsolenanwendung wird Clientaktivität angezeigt.Client activity is displayed on the client console application.

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

  4. Wenn Sie mit dem Beispiel fertig sind, führen Sie die Datei Cleanup.bat aus, um die Zertifikate zu entfernen.Remove the certificates by running Cleanup.bat when you have finished with the sample. In anderen Sicherheitsbeispielen werden die gleichen Zertifikate verwendet.Other security samples use the same certificates.

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

  1. Führen Sie auf dem Server setup.bat service aus.On the server, run setup.bat service. 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 machine and exports the service certificate to a file named Service.cer.

  2. Bearbeiten Sie auf dem Server die Datei "Web.config", damit sie dem neuen Zertifikatnamen entspricht,On the server, edit Web.config to reflect the new certificate name. Ändern, d. h. die findValue Attribut in der <ServiceCertificate > -Elements auf den vollqualifizierten Domänennamen des Computers.That is, change the findValue attribute in the <serviceCertificate> element to the fully-qualified domain name of the machine.

  3. 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 machine.

  4. Führen Sie auf dem Client setup.bat client aus.On the client, run setup.bat client. Ausführen setup.bat mit der client Argument wird ein Clientzertifikat mit dem Namen Client.com erstellt und das Clientzertifikat in der Datei Client.cer exportiert.Running setup.bat with the client argument creates a client certificate named Client.com and exports the client certificate to a file named Client.cer.

  5. Ändern Sie in der Datei "App.config" des MetadataResolverClient auf dem Clientcomputer den Wert für die Adresse des MEX-Endpunkts, sodass er mit der neuen Adresse des Diensts übereinstimmt.In the App.config file of the MetadataResolverClient on the client machine, change the address value of the mex endpoint to match the new address of your service. Ersetzen Sie dazu localhost durch den vollqualifizierten Domänennamen des Servers.You do this by replacing localhost with the fully-qualified domain name of the server. Ändern Sie auch das Vorkommen von localhost in der Datei "metadataResolverClient.cs" in den neuen Namen des Dienstzertifikats (den vollqualifizierten Domänennamen des Servers).Also change the occurrence of "localhost" in the metadataResolverClient.cs file to the new service certificate name (the fully-qualified domain name of the server). Führen Sie denselben Schritt für die Datei "App.config" des "SvcutilClient"-Projekts aus.Do the same thing for the App.config of the SvcutilClient project.

  6. Kopieren Sie die Datei Client.cer aus dem Clientverzeichnis in das Dienstverzeichnis auf dem Server.Copy the Client.cer file from the client directory to the service directory on the server.

  7. Führen Sie auf dem Client ImportServiceCert.bat aus.On the client, run ImportServiceCert.bat. 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.

  8. Führen Sie auf dem Server ImportClientCert.bat aus. Dadurch wird das Clientzertifikat aus der Datei Client.cer in den Speicher LocalMachine – TrustedPeople importiert.On the server, run ImportClientCert.bat, This imports the client certificate from the Client.cer file into the LocalMachine - TrustedPeople store.

  9. Erstellen Sie auf dem Dienstcomputer das Dienstprojekt in Visual Studio, und wählen Sie die Hilfeseite in einem Webbrowser aus, um zu überprüfen, ob sie ausgeführt wird.On the service machine, build the service project in Visual Studio and select the help page in a web browser to verify that it is running.

  10. Führen Sie auf dem Clientcomputer den MetadataResolverClient oder den SvcutilClient von Visual Studio aus.On the client machine, run the MetadataResolverClient or the SvcutilClient from VS.

    1. 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 das Beispiel fertig ausgeführt haben.Run Cleanup.bat in the samples folder once 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 machines. 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 machines, be sure to clear the service certificates that have been installed in the CurrentUser - TrustedPeople store. Führen Sie dazu folgenden Befehl aus: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>To do this, use the following command: 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.For example: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.

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, fahren Sie mit Windows Communication Foundation (WCF) und Windows Workflow Foundation (WF) Samples for .NET Framework 4 aller Windows Communication Foundation (WCF) herunterladen und WFWF Beispiele.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) and WFWF samples. Dieses Beispiel befindet sich im folgenden Verzeichnis.This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WCF\Extensibility\Metadata\CustomMexEndpoint

Siehe auchSee Also