Delen via


Eindpunt voor aangepaste beveiligde metagegevens

Het CustomMexEndpoint-voorbeeld laat zien hoe u een service implementeert met een beveiligd metagegevenseindpunt dat gebruikmaakt van een van de niet-metagegevensuitwisselingsbindingen en hoe u serviceModel Metadata Utility (Svcutil.exe) of clients configureert om de metagegevens van een dergelijk metagegevenseindpunt op te halen. Er zijn twee door het systeem geleverde bindingen beschikbaar voor het weergeven van metagegevenseindpunten: mexHttpBinding en mexHttpsBinding. mexHttpBinding wordt gebruikt om een metagegevenseindpunt beschikbaar te maken via HTTP op een niet-veilige manier. mexHttpsBinding wordt gebruikt om een metagegevenseindpunt via HTTPS op een veilige manier beschikbaar te maken. In dit voorbeeld ziet u hoe u een eindpunt voor beveiligde metagegevens beschikbaar maakt met behulp van de WSHttpBinding. U wilt dit doen wanneer u de beveiligingsinstellingen voor de binding wilt wijzigen, maar u niet HTTPS wilt gebruiken. Als u het mexHttpsBinding-eindpunt gebruikt, is uw metagegevenseindpunt beveiligd, maar kunt u de bindingsinstellingen niet wijzigen.

Opmerking

De installatieprocedure en build-instructies voor dit voorbeeld bevinden zich aan het einde van dit onderwerp.

Dienst

De service in dit voorbeeld heeft twee eindpunten. Het toepassingseindpunt bedient het ICalculator contract op een WSHttpBinding met ReliableSession ingeschakeld en Message beveiliging door middel van certificaten. Het eindpunt voor metagegevens gebruikt WSHttpBindingook , met dezelfde beveiligingsinstellingen, maar zonder ReliableSession. Dit is de relevante configuratie:

<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 veel van de andere voorbeelden gebruikt het metagegevenseindpunt de standaardwaarde mexHttpBinding, die niet veilig is. Hier worden de metagegevens beveiligd met WSHttpBinding met Message beveiliging. Om ervoor te zorgen dat metagegevensclients deze metagegevens kunnen ophalen, moeten ze worden geconfigureerd met een overeenkomende binding. In dit voorbeeld ziet u twee dergelijke clients.

De eerste client gebruikt Svcutil.exe om de metagegevens op te halen en clientcode en -configuratie te genereren tijdens het ontwerp. Omdat de service gebruikmaakt van een niet-standaardbinding voor de metagegevens, moet het hulpprogramma Svcutil.exe specifiek zijn geconfigureerd, zodat de metagegevens van de service met die binding kunnen worden opgehaald.

De tweede client gebruikt de MetadataResolver opdracht om de metagegevens voor een bekend contract dynamisch op te halen en vervolgens bewerkingen aan te roepen op de dynamisch gegenereerde client.

Svcutil-client

Wanneer u de standaardbinding gebruikt om uw IMetadataExchange eindpunt te hosten, kunt u Svcutil.exe uitvoeren met het adres van dat eindpunt:

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

en het werkt. In dit voorbeeld gebruikt de server echter een niet-standaardeindpunt om de metagegevens te hosten. Daarom moet Svcutil.exe worden geïnstrueerd om de juiste binding te gebruiken. U kunt dit doen met behulp van een Svcutil.exe.config-bestand.

Het Svcutil.exe.config-bestand ziet eruit als een normaal clientconfiguratiebestand. De enige ongebruikelijke aspecten zijn de naam en het contract van het clienteindpunt:

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

De eindpuntnaam moet de naam zijn van het schema van het adres waar de metagegevens worden gehost en het eindpuntcontract moet zijn IMetadataExchange. Dus wanneer Svcutil.exe wordt uitgevoerd met een opdrachtregel zoals de volgende:

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

het zoekt naar het eindpunt met de naam HTTP en contract IMetadataExchange om de binding en het gedrag van de communicatie-uitwisseling met het metagegevenseindpunt te configureren. De rest van het Svcutil.exe.config-bestand in het voorbeeld geeft de bindingsconfiguratie- en gedragsreferenties aan die overeenkomen met de configuratie van het metagegevenseindpunt van de server.

Als Svcutil.exe de configuratie in Svcutil.exe.configwilt ophalen, moet Svcutil.exe zich in dezelfde map bevinden als het configuratiebestand. Als gevolg hiervan moet u Svcutil.exe van de installatielocatie kopiëren naar de map met het Svcutil.exe.config-bestand. Voer vervolgens vanuit die map de volgende opdracht uit:

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

De aanduiding '.\' zorgt ervoor dat de kopie van Svcutil.exe in deze directory (het exemplaar met een bijbehorende Svcutil.exe.config) wordt gerund.

MetadataResolver-client

Als de client het contract kent en hoe de metagegevens tijdens het ontwerp kunnen worden besproken, kan de client dynamisch de binding en het adres van toepassingseindpunten achterhalen met behulp van de MetadataResolver. Deze voorbeeldclient toont dit aan door te laten zien hoe u de binding en referenties configureert die door MetadataResolver worden gebruikt en hoe u een MetadataExchangeClient maakt en configureert.

Dezelfde bindings- en certificaatgegevens die in Svcutil.exe.config worden weergegeven, kunnen imperatief worden opgegeven op het MetadataExchangeClientvolgende:

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

Met de mexClient geconfigureerde configuratie kunnen we de contracten inventariseren waarin we geïnteresseerd zijn en gebruiken MetadataResolver om een lijst met eindpunten op te halen met deze contracten:

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

Ten slotte kunnen we de informatie van die eindpunten gebruiken om de binding en het adres te initialiseren van een ChannelFactory, dat wordt gebruikt om kanalen te creëren om met de toepassingseindpunten te communiceren.

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

Het belangrijkste punt van deze voorbeeldclient is om te laten zien dat, als u gebruikmaakt MetadataResolveren u aangepaste bindingen of gedrag moet opgeven voor de communicatie over het uitwisselen van metagegevens, u een MetadataExchangeClient kunt gebruiken om deze aangepaste instellingen op te geven.

Het voorbeeld instellen en bouwen

  1. Zorg ervoor dat u de One-Time Setup Procedure voor de Windows Communication Foundation-voorbeelden hebt uitgevoerd.

  2. Volg de instructies in Het bouwen van de Windows Communication Foundation-voorbeelden om de oplossing te bouwen.

Het voorbeeld uitvoeren op dezelfde computer

  1. Voer Setup.bat uit vanuit de voorbeeldinstallatiemap. Hiermee worden alle certificaten geïnstalleerd die vereist zijn voor het uitvoeren van het voorbeeld. Houd er rekening mee dat Setup.bat het hulpprogramma FindPrivateKey.exe gebruikt, dat is geïnstalleerd door setupCertTool.bat uit te voeren vanuit One-Time Installatieprocedure voor de Windows Communication Foundation-voorbeelden.

  2. Voer de clienttoepassing uit vanuit \MetadataResolverClient\bin of \SvcutilClient\bin. Clientactiviteit wordt weergegeven in de clientconsoletoepassing.

  3. Als de client en service niet kunnen communiceren, raadpleegt u Tips voor probleemoplossing voor WCF-voorbeelden.

  4. Verwijder de certificaten door Cleanup.bat uit te voeren wanneer u klaar bent met het voorbeeld. Andere beveiligingsvoorbeelden gebruiken dezelfde certificaten.

Het voorbeeld uitvoeren op verschillende computers

  1. Voer setup.bat serviceop de server uit. Het uitvoeren van setup.bat met het service-argument creëert een servicecertificaat met de volledig gekwalificeerde domeinnaam van de machine en exporteert het servicecertificaat naar een bestand met de naam Service.cer.

  2. Bewerk Web.config op de server om de nieuwe certificaatnaam weer te geven. Dat wil gezegd, wijzig het findValue kenmerk in het <element serviceCertificate> in de volledig gekwalificeerde domeinnaam van de machine.

  3. Kopieer het Service.cer-bestand van de servicemap naar de clientmap op de clientcomputer.

  4. Voer op de client setup.bat clientuit. Als u het argument uitvoert setup.bat , maakt u een clientcertificaat met de client naam Client.com en exporteert u het clientcertificaat naar een bestand met de naam Client.cer.

  5. Wijzig in het App.config bestand van de MetadataResolverClient clientcomputer de adreswaarde van het mex-eindpunt zodat deze overeenkomt met het nieuwe adres van uw service. U doet dit door localhost te vervangen door de volledig gekwalificeerde domeinnaam van de server. Wijzig ook de instantie van 'localhost' in het metadataResolverClient.cs-bestand naar de naam van het nieuwe servicecertificaat (de volledig gekwalificeerde domeinnaam van de server). Doe hetzelfde voor het App.config van het SvcutilClient-project.

  6. Kopieer het Client.cer-bestand van de clientmap naar de servicemap op de server.

  7. Voer op de client ImportServiceCert.batuit. Hiermee importeert u het servicecertificaat uit het Service.cer-bestand in het archief CurrentUser - TrustedPeople.

  8. Voer op de server ImportClientCert.batuit. Hiermee wordt het clientcertificaat uit het Client.cer-bestand geïmporteerd in het archief LocalMachine - TrustedPeople.

  9. Bouw op de servicecomputer het serviceproject in Visual Studio en selecteer de Help-pagina in een webbrowser om te controleren of het wordt uitgevoerd.

  10. Voer op de clientcomputer de MetadataResolverClient of de SvcutilClient uit vanuit VS.

    1. Als de client en service niet kunnen communiceren, raadpleegt u Tips voor probleemoplossing voor WCF-voorbeelden.

Opschonen na het voorbeeld

  • Voer Cleanup.bat uit in de map met voorbeelden zodra u klaar bent met het uitvoeren van het voorbeeld.

    Opmerking

    Dit script verwijdert geen servicecertificaten op een client bij het uitvoeren van dit voorbeeld op computers. Als u WCF-voorbeelden (Windows Communication Foundation) hebt uitgevoerd die gebruikmaken van certificaten tussen computers, moet u de servicecertificaten wissen die zijn geïnstalleerd in de store CurrentUser - TrustedPeople. Gebruik hiervoor de volgende opdracht: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name> Voorbeeld: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.