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.
Notitie
De installatieprocedure en build-instructies voor dit voorbeeld bevinden zich aan het einde van dit onderwerp.
Service
De service in dit voorbeeld heeft twee eindpunten. Het toepassingseindpunt dient het ICalculator
contract voor een WSHttpBinding
met ReliableSession
ingeschakelde en beveiliging ingeschakelde certificaten Message
. Het eindpunt voor metagegevens gebruikt WSHttpBinding
ook , 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 Message
behulp van WSHttpBinding
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 worden 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 bestand Svcutil.exe.config 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 bestand Svcutil.exe.config in het voorbeeld geeft de bindingsconfiguratie en gedragsreferenties op die overeenkomen met de configuratie van de server van het metagegevenseindpunt.
Als Svcutil.exe de configuratie in Svcutil.exe.config wilt 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 bestand Svcutil.exe.config. Voer vervolgens vanuit die map de volgende opdracht uit:
.\svcutil.exe http://localhost/servicemodelsamples/service.svc/mex
De voorloop '.\' zorgt ervoor dat de kopie van Svcutil.exe in deze map (het exemplaar met een bijbehorende Svcutil.exe.config) wordt uitgevoerd.
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 laat zien hoe u de binding en referenties configureert die worden gebruikt door MetadataResolver
het maken en configureren van een MetadataExchangeClient
.
Dezelfde bindings- en certificaatgegevens die in Svcutil.exe.config worden weergegeven, kunnen imperatief worden opgegeven op het MetadataExchangeClient
volgende:
// 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 deze eindpunten gebruiken om de binding en het adres te initialiseren van een ChannelFactory
gebruikt om kanalen te maken om te communiceren met de toepassingseindpunten.
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 MetadataResolver
en 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
Zorg ervoor dat u de eenmalige installatieprocedure voor de Windows Communication Foundation-voorbeelden hebt uitgevoerd.
Volg de instructies in Het bouwen van de Windows Communication Foundation-voorbeelden om de oplossing te bouwen.
Het voorbeeld uitvoeren op dezelfde computer
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 de eenmalige installatieprocedure voor de Windows Communication Foundation-voorbeelden.
Voer de clienttoepassing uit vanuit \MetadataResolverClient\bin of \SvcutilClient\bin. Clientactiviteit wordt weergegeven in de clientconsoletoepassing.
Als de client en service niet kunnen communiceren, raadpleegt u Tips voor probleemoplossing voor WCF-voorbeelden.
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
Voer op de server de opdracht uit
setup.bat service
. Als u hetservice
argument uitvoertsetup.bat
, maakt u een servicecertificaat met de volledig gekwalificeerde domeinnaam van de computer en exporteert u het servicecertificaat naar een bestand met de naam Service.cer.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.Kopieer het Service.cer-bestand van de servicemap naar de clientmap op de clientcomputer.
Voer op de client de opdracht uit
setup.bat client
. Als u het argument uitvoertsetup.bat
, maakt u een clientcertificaat met declient
naam Client.com en exporteert u het clientcertificaat naar een bestand met de naam Client.cer.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 het exemplaar van 'localhost' in het metadataResolverClient.cs-bestand in de naam van het nieuwe servicecertificaat (de volledig gekwalificeerde domeinnaam van de server). Doe hetzelfde voor de App.config van het SvcutilClient-project.Kopieer het Client.cer-bestand van de clientmap naar de servicemap op de server.
Voer op de client de opdracht uit
ImportServiceCert.bat
. Hiermee importeert u het servicecertificaat uit het Service.cer-bestand in het CurrentUser - Trusted Mensen-archief.Voer
ImportClientCert.bat
op de server uit, hiermee importeert u het clientcertificaat uit het Client.cer-bestand in het LocalMachine - Trusted Mensen-archief.Bouw op de servicecomputer het serviceproject in Visual Studio en selecteer de Help-pagina in een webbrowser om te controleren of het wordt uitgevoerd.
Voer op de clientcomputer de MetadataResolverClient of de SvcutilClient uit vanuit VS.
- 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.
Notitie
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 op computers, moet u de servicecertificaten wissen die zijn geïnstalleerd in het CurrentUser - Trusted Mensen-archief. 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
.