Compartilhar via


Exemplo de segurança de mensagem

O MessageSecurity sample demonstra como implementar um aplicativo que usa o basicHttpBinding e a segurança da mensagem. Este exemplo baseia-se no Guia de Introdução que implementa um serviço de calculadora.

Observação

O procedimento de instalação e as instruções de build para este exemplo estão localizados 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 de serviço App.config 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 configuração de exemplo a seguir.

<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> para Message e também o atributo clientCredentialType da <mensagem> para Certificate, conforme apresentado na configuração de exemplo a seguir:

<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 no serviceCredentials elemento. 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 clientCertificate elemento.

<!--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 o exemplo, as solicitações e respostas da operação 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 avulsa dos exemplos do Windows Communication Foundation.

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

Para executar o exemplo no mesmo computador

  1. Execute Setup.bat na pasta de instalação do exemplo. Isso instala 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 de 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 terminar de usar o exemplo. Outros exemplos de segurança usam os mesmos certificados.

Para executar o exemplo 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 também os arquivos Setup.bat, Cleanup.bate ImportClientCert.bat para o servidor.

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

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

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

  6. Edite Service.exe.config para refletir 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 base para especificar um nome de computador totalmente qualificado em vez de 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. Executar 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 no computador cliente, altere o valor do endereço do ponto de extremidade para corresponder ao novo endereço do serviço. Você faz isso substituindo localhost pelo nome de domínio totalmente qualificado do servidor. Altere também o findValue atributo 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 importa o certificado de serviço do arquivo Service.cer para o repositório CurrentUser – TrustedPeople.

  12. No servidor, execute ImportClientCert.bat, isso importa 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 exemplos de WCF.

Para limpar após a amostra

  • Execute Cleanup.bat na pasta de exemplos depois de concluir a execução do exemplo.

    Observação

    Esse script não remove certificados de serviço em um cliente ao executar este exemplo entre computadores. Se você tiver executado exemplos do Windows Communication Foundation (WCF) que usam certificados em computadores, desmarque 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