Teilen über


Benutzerdefinierter Endpunkt für sichere Metadaten

Das CustomMexEndpoint-Beispiel veranschaulicht, wie sie einen Dienst mit einem sicheren Metadatenendpunkt implementieren, der eine der Nicht-Metadatenaustauschbindungen verwendet, und wie Sie das ServiceModel Metadata Utility Tool (Svcutil.exe) oder Clients so konfigurieren, dass die Metadaten von einem solchen Metadatenendpunkt abgerufen werden. Es gibt zwei vom System bereitgestellte Bindungen zum Verfügbarmachen von Metadatenendpunkten: mexHttpBinding und mexHttpsBinding. mexHttpBinding wird verwendet, um einen Metadatenendpunkt über HTTP auf nicht sichere Weise verfügbar zu machen. mexHttpsBinding wird verwendet, um einen Metadatenendpunkt über HTTPS sicher verfügbar zu machen. In diesem Beispiel wird veranschaulicht, wie Sie einen sicheren Metadatenendpunkt mit Hilfe von WSHttpBinding veröffentlichen. Sie möchten dies tun, wenn Sie die Sicherheitseinstellungen für die Bindung ändern möchten, aber nicht HTTPS verwenden möchten. Wenn Sie den mexHttpsBinding-Endpunkt verwenden, ist der Metadatenendpunkt sicher, aber es gibt keine Möglichkeit, die Bindungseinstellungen zu ändern.

Hinweis

Die Einrichtungsverfahren und Build-Anweisungen für dieses Beispiel befinden sich am Ende dieses Themas.

Dienstleistung

Der Dienst in diesem Beispiel verfügt über zwei Endpunkte. Der Anwendungsendpunkt wird vom ICalculator-Vertrag auf einer WSHttpBinding mit aktivierter ReliableSession und einer Message-Sicherheit mit Zertifikaten genutzt. Der Metadatenendpunkt verwendet WSHttpBindingaußerdem die gleichen Sicherheitseinstellungen, jedoch ohne ReliableSession. Hier ist die relevante Konfiguration:

<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 anderen Beispielen verwendet der Metadatenendpunkt den Standardwert mexHttpBinding, der nicht sicher ist. Hier werden die Metadaten mittels WSHttpBinding und Message Sicherheit gesichert. Damit Metadatenclients diese Metadaten abrufen können, müssen sie mit einer übereinstimmenden Bindung konfiguriert werden. In diesem Beispiel werden zwei solche Clients veranschaulicht.

Der erste Client verwendet zum Abrufen der Metadaten und Generieren von Clientcode sowie der Konfiguration zur Entwurfszeit die Datei „Svcutil.exe“. Da der Dienst eine nicht standardmäßige Bindung für die Metadaten verwendet, muss das Svcutil.exe Tool speziell konfiguriert werden, damit die Metadaten mithilfe dieser Bindung vom Dienst abgerufen werden können.

Der zweite Client benutzt die MetadataResolver, um die Metadaten für einen bekannten Vertrag dynamisch abzurufen und anschließend Vorgänge auf dem dynamisch generierten Client auszuführen.

Svcutil-Client

Wenn Sie die Standardbindung zum Hosten Ihres IMetadataExchange Endpunkts verwenden, können Sie Svcutil.exe mit der Adresse dieses Endpunkts ausführen:

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

und es funktioniert. In diesem Beispiel verwendet der Server jedoch einen nicht standardmäßigen Endpunkt, um die Metadaten zu hosten. Daher muss Svcutil.exe angewiesen werden, die richtige Bindung zu verwenden. Dazu kann eine Svcutil.exe.config Datei verwendet werden.

Die Svcutil.exe.config Datei sieht wie eine normale Clientkonfigurationsdatei aus. Die einzigen ungewöhnlichen Aspekte sind der Name und der Vertrag des Clientendpunkts:

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

Der Endpunktname muss der Name des Schemas der Adresse sein, in der die Metadaten gehostet werden, und der Endpunktvertrag muss sein IMetadataExchange. Wenn also "Svcutil.exe" mit einer Befehlszeile wie der folgenden ausgeführt wird:

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

er sucht nach dem Endpunkt mit dem Namen "http" und dem Vertrag IMetadataExchange , um die Bindung und das Verhalten des Kommunikationsaustauschs mit dem Metadatenendpunkt zu konfigurieren. Der Rest der Svcutil.exe.config Datei im Beispiel gibt die Bindungskonfigurations- und Verhaltensanmeldeinformationen an, die mit der Konfiguration des Metadatenendpunkts des Servers übereinstimmen.

Damit Svcutil.exe die Konfiguration in Svcutil.exe.configübernehmen kann, muss Svcutil.exe sich im selben Verzeichnis wie die Konfigurationsdatei befinden. Daher müssen Sie Svcutil.exe aus dem Installationsspeicherort in das Verzeichnis kopieren, das die Svcutil.exe.config Datei enthält. Führen Sie dann in diesem Verzeichnis den folgenden Befehl aus:

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

Die führende Zeichenfolge ".\" stellt sicher, dass die Kopie von "Svcutil.exe" in diesem Verzeichnis (dem Verzeichnis mit einer entsprechenden "Svcutil.exe.config") ausgeführt wird.

MetadataResolver-Client

Wenn der Client den Vertrag kennt und zur Entwurfszeit mit den Metadaten kommunizieren kann, kann er dynamisch die Bindung und die Adresse von Anwendungsendpunkten mithilfe von MetadataResolver herausfinden. 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.

Die gleichen Bindungs- und Zertifikatsinformationen, die in Svcutil.exe.config angezeigt wurden, können imperativ auf MetadataExchangeClient angegeben werden.

// 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");

Mit der mexClient konfiguration können wir die verträge aufzählen, an denen wir interessiert sind, und eine MetadataResolver Liste der Endpunkte mit diesen Verträgen abrufen:

// 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);

Schließlich können wir die Informationen von diesen Endpunkten verwenden, um die Bindung und Adresse eines ChannelFactory zum Erstellen von Kanälen für die Kommunikation mit den Anwendungsendpunkten zu initialisieren.

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

Der wichtigste Punkt dieses Beispielclients ist, zu veranschaulichen, dass Sie, wenn Sie MetadataResolver verwenden, benutzerdefinierte Bindungen oder Verhaltensweisen für die Metadatenaustauschkommunikation angeben müssen, diese benutzerdefinierten Einstellungen mit MetadataExchangeClient spezifizieren können.

So richten Sie das Beispiel ein und erstellen es

  1. Stellen Sie sicher, dass Sie das One-Time Setup-Verfahren für die Windows Communication Foundation-Beispieleausgeführt haben.

  2. Befolgen Sie zum Erstellen der Lösung die Anweisungen im Erstellen der Windows Communication Foundation-Beispiele.

So führen Sie das Beispiel auf demselben Computer aus

  1. Führen Sie Setup.bat aus dem Beispiel-Installationsordner aus. Dadurch werden alle Zertifikate installiert, die für die Ausführung des Beispiels erforderlich sind. Beachten Sie, dass „Setup.bat“ das Tool „FindPrivateKey.exe“ verwendet, das installiert wird, indem „setupCertTool.bat“ aus der einmaligen Setupprozedur für die Windows Communication Foundation-Beispiele ausgeführt wird.

  2. Führen Sie die Clientanwendung aus \MetadataResolverClient\bin oder \SvcutilClient\bin aus. Clientaktivität wird in der Clientkonsolenanwendung angezeigt.

  3. Wenn der Client und der Dienst nicht kommunizieren können, schauen Sie sich Tipps zur Problembehandlung für WCF-Samplesan.

  4. Entfernen Sie die Zertifikate, indem Sie Cleanup.bat ausführen, wenn Sie mit dem Beispiel fertig sind. Andere Sicherheitsbeispiele verwenden dieselben Zertifikate.

So führen Sie das Beispiel computerübergreifend aus

  1. Führen Sie setup.bat serviceauf dem Server aus. Durch das Ausführen von setup.bat mit dem service Argument wird ein Dienstzertifikat mit dem vollqualifizierten Domänennamen des Computers erstellt und das Dienstzertifikat in eine Datei namens Service.cer exportiert.

  2. Bearbeiten Sie auf dem Server die Datei "Web.config", damit sie dem neuen Zertifikatnamen entspricht, Ändern Sie das findValue-Attribut im <serviceCertificate>-Element in den vollqualifizierten Domänennamen des Rechners.

  3. Kopieren Sie die Service.cer Datei aus dem Dienstverzeichnis in das Clientverzeichnis auf dem Clientcomputer.

  4. Führen Sie auf dem Client setup.bat clientaus. Wenn setup.bat mit dem Argument client ausgeführt wird, wird ein Clientzertifikat namens Client.com erstellt und in eine Datei namens Client.cer exportiert.

  5. Ändern Sie in der Datei App.config auf dem MetadataResolverClient-Clientcomputer den Adresswert des MEX-Endpunkts, sodass er mit der neuen Adresse Ihres Dienstes übereinstimmt. Ersetzen Sie dazu localhost durch den vollqualifizierten Domänennamen des Servers. Ändern Sie außerdem das Vorkommen von "localhost" in der metadataResolverClient.cs-Datei in den neuen Dienstzertifikatnamen (den vollqualifizierten Domänennamen des Servers). Führen Sie denselben Schritt für die Datei "App.config" des "SvcutilClient"-Projekts aus.

  6. Kopieren Sie die Client.cer Datei aus dem Clientverzeichnis in das Dienstverzeichnis auf dem Server.

  7. Führen Sie auf dem Client ImportServiceCert.bataus. Dadurch wird das Dienstzertifikat aus der Service.cer-Datei in den Speicher CurrentUser - TrustedPeople importiert.

  8. Führen Sie auf dem Server ImportClientCert.bataus. Dadurch wird das Clientzertifikat aus der Client.cer-Datei in den LocalMachine - TrustedPeople-Speicher importiert.

  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 es ausgeführt wird.

  10. Führen Sie auf dem Clientcomputer den MetadataResolverClient oder den SvcutilClient aus VS aus.

    1. Wenn der Client und der Dienst nicht kommunizieren können, schauen Sie sich Tipps zur Problembehandlung für WCF-Samplesan.

So stellen Sie den Zustand vor Ausführung des Beispiels wieder her

  • Führen Sie Cleanup.bat im Beispielordner aus, nachdem Sie die Ausführung des Beispiels abgeschlossen haben.

    Hinweis

    Dieses Skript entfernt keine Dienstzertifikate auf einem Client, wenn dieses Beispiel auf computernübergreifend ausgeführt wird. Wenn Sie Windows Communication Foundation (WCF)-Beispiele ausgeführt haben, die Zertifikate über mehrere Computer hinweg verwenden, sollten Sie die Dienstzertifikate löschen, die im CurrentUser - TrustedPeople-Speicher installiert wurden. 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.