Ponto de extremidade de metadados seguros personalizadosCustom Secure Metadata Endpoint

Este exemplo demonstra como implementar um serviço com um ponto de extremidade de metadados seguro que usa uma das associações de troca de não-metadados e como configurar a ferramenta de utilitário de metadados ServiceModel (Svcutil.exe) ou clientes para buscar os metadados desse ponto de extremidade de metadados.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. Há duas associações fornecidas pelo sistema disponíveis para expor pontos de extremidade de metadados: mexHttpBinding e mexHttpsBinding.There are two system-provided bindings available for exposing metadata endpoints: mexHttpBinding and mexHttpsBinding. mexHttpBinding é usado para expor um ponto de extremidade de metadados por HTTP de maneira não segura.mexHttpBinding is used to expose a metadata endpoint over HTTP in a non-secure manner. mexHttpsBinding é usado para expor um ponto de extremidade de metadados por HTTPS de maneira segura.mexHttpsBinding is used to expose a metadata endpoint over HTTPS in a secure manner. Este exemplo ilustra como expor um ponto de extremidade de metadados seguro usando o WSHttpBinding .This sample illustrates how to expose a secure metadata endpoint using the WSHttpBinding. Você desejaria fazer isso quando quiser alterar as configurações de segurança na associação, mas não quiser usar HTTPS.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. Se você usar o mexHttpsBinding, seu ponto de extremidade de metadados será seguro, mas não há como modificar as configurações de associação.If you use the mexHttpsBinding your metadata endpoint will be secure, but there is no way to modify the binding settings.

Observação

O procedimento de instalação e as instruções de Build para este exemplo estão localizados no final deste tópico.The setup procedure and build instructions for this sample are located at the end of this topic.

ServiçoService

O serviço neste exemplo tem dois pontos de extremidade.The service in this sample has two endpoints. O ponto de extremidade do aplicativo serve o ICalculator contrato em um WSHttpBinding com ReliableSession habilitado e Message segurança usando certificados.The application endpoint serves the ICalculator contract on a WSHttpBinding with ReliableSession enabled and Message security using certificates. O ponto de extremidade de metadados também usa WSHttpBinding , com as mesmas configurações de segurança, mas sem ReliableSession .The metadata endpoint also uses WSHttpBinding, with the same security settings but with no ReliableSession. Aqui está a configuração relevante: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>  

Em muitos dos outros exemplos, o ponto de extremidade de metadados usa o padrão mexHttpBinding , que não é seguro.In many of the other samples, the metadata endpoint uses the default mexHttpBinding, which is not secure. Aqui, os metadados são protegidos usando WSHttpBinding with Message Security.Here the metadata is secured using WSHttpBinding with Message security. Para que os clientes de metadados recuperem esses metadados, eles devem ser configurados com uma associação correspondente.In order for metadata clients to retrieve this metadata, they must be configured with a matching binding. Este exemplo demonstra dois clientes desse tipo.This sample demonstrates two such clients.

O primeiro cliente usa Svcutil.exe para buscar os metadados e gerar o código do cliente e a configuração em tempo de design.The first client uses Svcutil.exe to fetch the metadata and generate client code and configuration at design time. Como o serviço usa uma associação não padrão para os metadados, a ferramenta de Svcutil.exe deve ser especificamente configurada para que possa obter os metadados do serviço usando essa associação.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.

O segundo cliente usa o MetadataResolver para buscar dinamicamente os metadados de um contrato conhecido e, em seguida, invocar operações no cliente gerado dinamicamente.The second client uses the MetadataResolver to dynamically fetch the metadata for a known contract and then invoke operations on the dynamically generated client.

Cliente svcutilSvcutil client

Ao usar a associação padrão para hospedar seu IMetadataExchange ponto de extremidade, você pode executar Svcutil.exe com o endereço desse ponto de extremidade: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  

e funciona.and it works. Mas, neste exemplo, o servidor usa um ponto de extremidade não padrão para hospedar os metadados.But in this sample, the server uses a non-default endpoint to host the metadata. Portanto, Svcutil.exe deve ser instruído para usar a ligação correta.So Svcutil.exe must be instructed to use the correct binding. Isso pode ser feito usando um arquivo de Svcutil.exe.config.This can be done using a Svcutil.exe.config file.

O arquivo de Svcutil.exe.config é semelhante a um arquivo de configuração de cliente normal.The Svcutil.exe.config file looks like a normal client configuration file. Os únicos aspectos incomuns são o nome e o contrato do ponto de extremidade do cliente:The only unusual aspects are the client endpoint name and contract:

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

O nome do ponto de extremidade deve ser o nome do esquema do endereço onde os metadados estão hospedados e o contrato do ponto de extremidade deve ser IMetadataExchange .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. Assim, quando Svcutil.exe é executado com uma linha de comando, como a seguinte:Thus, when Svcutil.exe is run with a command-line such as the following:

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

Ele procura o ponto de extremidade chamado "http" e o contrato IMetadataExchange para configurar a associação e o comportamento da troca de comunicação com o ponto de extremidade de metadados.it looks for the endpoint named "http" and contract IMetadataExchange to configure the binding and behavior of the communication exchange with the metadata endpoint. O restante do arquivo de Svcutil.exe.config no exemplo especifica a configuração de associação e as credenciais de comportamento para corresponder à configuração do servidor do ponto de extremidade de metadados.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.

Para que Svcutil.exe pegue a configuração no Svcutil.exe.config, Svcutil.exe deve estar no mesmo diretório que o arquivo de configuração.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. Como resultado, você deve copiar Svcutil.exe de seu local de instalação para o diretório que contém o arquivo de Svcutil.exe.config.As a result, you must copy Svcutil.exe from its install location to the directory that contains the Svcutil.exe.config file. Em seguida, a partir desse diretório, execute o seguinte comando:Then from that directory, run the following command:

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

O ". \ " líder garante que a cópia de Svcutil.exe nesse diretório (aquela que tem um Svcutil.exe.config correspondente) seja executada.The leading ".\" ensures that the copy of Svcutil.exe in this directory (the one which has a corresponding Svcutil.exe.config) is run.

Cliente MetadataResolverMetadataResolver client

Se o cliente souber o contrato e como se comunicar com os metadados em tempo de design, o cliente poderá descobrir dinamicamente a ligação e o endereço dos pontos de extremidade do aplicativo usando o MetadataResolver .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. Este cliente de exemplo demonstra isso, mostrando como configurar a associação e as credenciais usadas pelo MetadataResolver criando e configurando um MetadataExchangeClient .This sample client demonstrates this, showing how to configure the binding and credentials used by MetadataResolver by creating and configuring a MetadataExchangeClient.

As mesmas informações de associação e certificado exibidas no Svcutil.exe.config podem ser especificadas de forma imperativa no MetadataExchangeClient :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");  

Com o mexClient configurado, podemos enumerar os contratos nos quais estamos interessados e usar MetadataResolver para buscar uma lista de pontos de extremidade com esses contratos: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);  

Por fim, podemos usar as informações desses pontos de extremidade para inicializar a ligação e o endereço de um ChannelFactory usado para criar canais para se comunicar com os pontos de extremidade do aplicativo.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);  

O ponto principal deste cliente de exemplo é demonstrar que, se você estiver usando o MetadataResolver , e precisar especificar associações ou comportamentos personalizados para a comunicação de troca de metadados, poderá usar um MetadataExchangeClient para especificar essas configurações personalizadas.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.

Para configurar e compilar o exemploTo set up and build the sample

  1. Verifique se você executou o procedimento de configuração única para os exemplos de Windows Communication Foundation.Ensure that you have performed the One-Time Setup Procedure for the Windows Communication Foundation Samples.

  2. Para compilar a solução, siga as instruções em criando os exemplos de Windows Communication Foundation.To build the solution, follow the instructions in Building the Windows Communication Foundation Samples.

Para executar o exemplo no mesmo computadorTo run the sample on the same machine

  1. Execute Setup.bat na pasta de instalação de exemplo.Run Setup.bat from the sample install folder. Isso instala todos os certificados necessários para executar o exemplo.This installs all the certificates required for running the sample. Observe que Setup.bat usa a ferramenta FindPrivateKey.exe, que é instalada com a execução de setupCertTool.bat do procedimento de configuração única para os exemplos de Windows Communication Foundation.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. Executar o aplicativo cliente do \MetadataResolverClient\bin ou \SvcutilClient\bin.Run the client application from \MetadataResolverClient\bin or \SvcutilClient\bin. A atividade do cliente é exibida no aplicativo de console do cliente.Client activity is displayed on the client console application.

  3. Se o cliente e o serviço não puderem se comunicar, consulte dicas de solução de problemas para exemplos do WCF.If the client and service are not able to communicate, see Troubleshooting Tips for WCF Samples.

  4. Remova os certificados executando Cleanup.bat ao concluir o exemplo.Remove the certificates by running Cleanup.bat when you have finished with the sample. Outros exemplos de segurança usam os mesmos certificados.Other security samples use the same certificates.

Para executar o exemplo entre computadoresTo run the sample across machines

  1. No servidor, execute setup.bat service .On the server, run setup.bat service. setup.batA execução com o service argumento cria um certificado de serviço com o nome de domínio totalmente qualificado do computador e exporta o certificado de serviço para um arquivo chamado Service. cer.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. No servidor, edite Web.config para refletir o novo nome do certificado.On the server, edit Web.config to reflect the new certificate name. Ou seja, altere o findValue atributo no <serviceCertificate> elemento para o nome de domínio totalmente qualificado do computador.That is, change the findValue attribute in the <serviceCertificate> element to the fully-qualified domain name of the machine.

  3. Copie o arquivo Service. cer do diretório de serviço para o diretório do cliente no computador cliente.Copy the Service.cer file from the service directory to the client directory on the client machine.

  4. No cliente, execute setup.bat client .On the client, run setup.bat client. setup.batA execução com o client argumento cria um certificado de cliente chamado Client.com e exporta o certificado do cliente para um arquivo chamado Client. cer.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. No arquivo de App.config do MetadataResolverClient no computador cliente, altere o valor de endereço do ponto de extremidade MEX para corresponder ao novo endereço do serviço.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. Você faz isso substituindo localhost pelo nome de domínio totalmente qualificado do servidor.You do this by replacing localhost with the fully-qualified domain name of the server. Além disso, altere a ocorrência de "localhost" no arquivo metadataResolverClient.cs para o novo nome do certificado de serviço (o nome de domínio totalmente qualificado do servidor).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). Faça a mesma coisa para a App.config do projeto SvcutilClient.Do the same thing for the App.config of the SvcutilClient project.

  6. Copie o arquivo client. cer do diretório cliente para o diretório de serviço no servidor.Copy the Client.cer file from the client directory to the service directory on the server.

  7. No cliente, execute ImportServiceCert.bat .On the client, run ImportServiceCert.bat. Isso importa o certificado de serviço do arquivo Service. cer para o repositório CurrentUser-TrustedPeople.This imports the service certificate from the Service.cer file into the CurrentUser - TrustedPeople store.

  8. No servidor, execute ImportClientCert.bat , que importa o certificado do cliente do arquivo. cer do cliente para o repositório LocalMachine-TrustedPeople.On the server, run ImportClientCert.bat, This imports the client certificate from the Client.cer file into the LocalMachine - TrustedPeople store.

  9. Na máquina de serviço, crie o projeto de serviço no Visual Studio e selecione a página de ajuda em um navegador da Web para verificar se ele está em execução.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. No computador cliente, execute o MetadataResolverClient ou o SvcutilClient do VS.On the client machine, run the MetadataResolverClient or the SvcutilClient from VS.

    1. Se o cliente e o serviço não puderem se comunicar, consulte dicas de solução de problemas para exemplos do WCF.If the client and service are not able to communicate, see Troubleshooting Tips for WCF Samples.

Para limpar após o exemploTo clean up after the sample

  • Execute Cleanup.bat na pasta Samples depois de concluir a execução do exemplo.Run Cleanup.bat in the samples folder once you have finished running the sample.

    Observação

    Esse script não remove certificados de serviço em um cliente ao executar esse exemplo em computadores.This script does not remove service certificates on a client when running this sample across machines. Se você tiver executado Windows Communication Foundation (WCF) exemplos que usam certificados entre computadores, certifique-se de limpar os certificados de serviço que foram instalados no repositório CurrentUser-TrustedPeople.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. Para fazer isso, use o seguinte comando: 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>. Por exemplo, certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.For example: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.

Importante

Os exemplos podem já estar instalados no seu computador.The samples may already be installed on your machine. Verifique o seguinte diretório (padrão) antes de continuar.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Se esse diretório não existir, vá para Windows Communication Foundation (WCF) e exemplos de Windows Workflow Foundation (WF) para .NET Framework 4 para baixar todos os Windows Communication Foundation (WCF) e WFWF exemplos.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. Este exemplo está localizado no seguinte diretório.This sample is located in the following directory.

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