Compartilhar via


Exemplo de segurança de mensagem

O Exemplo de segurança de mensagens demonstra como implementar um aplicativo que usa o basicHttpBinding e a segurança de mensagens. Este exemplo se baseia na Introdução que implementa um serviço de calculadora.

Observação

O procedimento de instalação e as instruções de compilação dessa amostra estão no final deste tópico.

O modo de segurança de basicHttpBinding pode ser definido para os seguintes valores: Message, Transport, TransportWithMessageCredential, TransportCredentialOnly e None. No arquivo App.config de serviço de exemplo a seguir, a definição do ponto de extremidade especifica basicHttpBinding e faz referência a uma configuração de associação nomeada Binding1, conforme mostrado na seguinte configuração de exemplo:

<system.serviceModel>
  <services>
    <service name="Microsoft.ServiceModel.Samples.CalculatorService"
             behaviorConfiguration="CalculatorServiceBehavior">
     <!-- This endpoint is exposed at the base address provided by -->
     <!-- host: http://localhost:8000/ServiceModelSamples/service.-->
     <endpoint address=""
               binding="basicHttpBinding"
               bindingConfiguration="Binding1"
               contract="Microsoft.ServiceModel.Samples.ICalculator" />
    </service>
  </services>
  ...
</system.serviceModel>

A configuração de associação define o atributo mode da <segurança> como Message, e define o atributo clientCredentialType da <mensagem> como Certificate, conforme mostrado na seguinte configuração de exemplo:

<bindings>
  <basicHttpBinding>
    <!--
        This configuration defines the SecurityMode as Message and
        the clientCredentialType as Certificate.
        -->
    <binding name="Binding1" >
      <security mode = "Message">
        <message clientCredentialType="Certificate"/>
      </security>
    </binding>
  </basicHttpBinding>
</bindings>

O certificado que o serviço usa para se autenticar no cliente é definido na seção de comportamentos do arquivo de configuração sob o elemento serviceCredentials. O modo de validação que se aplica ao certificado que o cliente usa para se autenticar no serviço também é definido na seção de comportamentos sob o elemento clientCertificate.

<!--For debugging purposes, set the includeExceptionDetailInFaults attribute to true.-->
<behaviors>
  <serviceBehaviors>
    <behavior name="CalculatorServiceBehavior">
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="False" />
      <!--The serviceCredentials behavior allows one to define a -->
      <!--service certificate. A service certificate is used by a -->
      <!--client to authenticate the service and provide message -->
      <!-- protection. This configuration references the "localhost"-->
      <!--certificate installed during the setup instructions. -->
      <serviceCredentials>
        <serviceCertificate findValue="localhost"
               storeLocation="LocalMachine"
               storeName="My" x509FindType="FindBySubjectName" />
        <clientCertificate>
          <!-- Setting the certificateValidationMode to -->
          <!-- PeerOrChainTrust means that if the certificate -->
          <!--is in the user's Trusted People store, then it is -->
          <!-- trusted without performing a validation of the -->
          <!-- certificate's issuer chain. This setting is used -->
          <!-- here for convenience so that the sample can be run -->
          <!-- without having to have certificates issued by a -->
          <!-- certification authority (CA). -->
          <!-- This setting is less secure than the default, -->
          <!-- ChainTrust. The security implications of this -->
          <!-- setting should be carefully considered before using -->
          <!-- PeerOrChainTrust in production code. -->
          <authentication
                       certificateValidationMode="PeerOrChainTrust" />
        </clientCertificate>
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>
</behaviors>

Os mesmos detalhes de associação e segurança são especificados no arquivo de configuração do cliente.

A identidade do chamador é exibida na janela do console de serviço usando o seguinte código:

Console.WriteLine("Called by {0}", ServiceSecurityContext.Current.PrimaryIdentity.Name);

Quando você executa a amostra, as solicitações de operação e as respostas são exibidas na janela do console do cliente. Pressione ENTER na janela do cliente para desligar o cliente.

Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714
Press <ENTER> to terminate client.

Para configurar e compilar o exemplo

  1. Verifique se você executou o Procedimento de instalação única para os exemplos do Windows Communication Foundation.

  2. Para compilar a edição C# ou do Visual Basic .NET da solução, siga as instruções descritas em Como compilar os exemplos do Windows Communication Foundation.

Para executar o exemplo no mesmo computador

  1. Execute Setup.bat na pasta de instalação do exemplo. Isso instalará todos os certificados necessários para executar o exemplo.

    Observação

    O arquivo de lote Setup.bat foi projetado para ser executado a partir de um prompt de comando do SDK do Windows. Ele requer que a variável de ambiente MSSDK aponte para o diretório onde o SDK está instalado. Essa variável de ambiente é definida automaticamente em um Prompt de Comando do SDK do Windows.

  2. Execute o aplicativo de serviço em \service\bin.

  3. Execute o aplicativo cliente em \client\bin. A atividade do cliente é exibida no aplicativo do console do cliente.

  4. Se o cliente e o serviço não puderem se comunicar, confira Dicas de solução de problemas para exemplos de WCF.

  5. Remova os certificados executando Cleanup.bat quando tiver terminado de usar a amostra. Outros exemplos de segurança usam os mesmos certificados.

Para executar a amostra entre computadores

  1. Crie um diretório no computador de serviço para os binários de serviço.

  2. Copie os arquivos do programa de serviço para o diretório de serviço no servidor. Copie os arquivos Setup.bat, Cleanup.bat e ImportClientCert.bat para o servidor.

  3. Crie um diretório no computador cliente para os binários do cliente.

  4. Copie os arquivos do programa do cliente para o diretório do cliente no computador cliente. Copie também os arquivos Setup.bat, Cleanup.bat e ImportServiceCert.bat para o cliente.

  5. No servidor, execute setup.bat service. A execução de setup.bat com o argumento service 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.

  6. Edite Service.exe.config para que ele reflita o novo nome do certificado (no atributo findValue no elemento <serviceCertificate>), que é o mesmo que o nome de domínio totalmente qualificado do computador. Altere também o valor do endereço básico para especificar um nome de computador totalmente qualificado em vez do localhost.

  7. Copie o arquivo Service.cer do diretório de serviço para o diretório do cliente no computador cliente.

  8. No cliente, execute setup.bat client. A execução de setup.bat com o argumento client cria um certificado de cliente chamado client.com e exporta o certificado do cliente para um arquivo chamado Client.cer.

  9. No arquivo Client.exe.config do computador cliente, altere o valor do endereço do ponto de extremidade para que corresponda ao novo endereço do seu serviço. Você faz isso substituindo localhost pelo nome de domínio totalmente qualificado do servidor. Altere também o atributo findValue do <defaultCertificate> para o novo nome do certificado de serviço, que é o nome de domínio totalmente qualificado do servidor.

  10. Copie o arquivo Client.cer do diretório do cliente para o diretório de serviço no servidor.

  11. No cliente, execute ImportServiceCert.bat. Isso importará o certificado de serviço do arquivo Service.cer para o repositório CurrentUser - TrustedPeople.

  12. No servidor, execute ImportClientCert.bat. Isso importará o certificado do cliente do arquivo Client.cer para o repositório LocalMachine – TrustedPeople.

  13. No computador de serviço, execute Service.exe a partir de um prompt de comando.

  14. No computador cliente, inicialize Client.exe a partir de uma janela do prompt de comando.

    1. Se o cliente e o serviço não puderem se comunicar, confira Dicas de solução de problemas para amostras de WCF.

Para fazer uma limpeza após o exemplo

  • Execute Cleanup.bat na pasta de amostras depois de concluir a execução da amostra.

    Observação

    Esse script não remove os certificados de serviço em um cliente na execução dessa amostra em vários computadores. Se você tiver executado amostras do WCF (Windows Communication Foundation) que usam certificados em computadores, lembre-se de limpar os certificados de serviço que foram instalados no repositório CurrentUser - TrustedPeople. Para fazer isso, use o seguinte comando: 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