Partilhar via


Exemplo de segurança de mensagem

O exemplo MessageSecurity demonstra como implementar uma aplicação que usa a basicHttpBinding segurança de mensagens. Este exemplo é baseado na Introdução que implementa um serviço de calculadora.

Observação

O procedimento de configuração e as instruções de compilação para este exemplo estão localizados no final deste tópico.

O modo de segurança de basicHttpBinding pode ser definido com os seguintes valores: Message, Transport, TransportWithMessageCredentiale TransportCredentialOnlyNone . No seguinte ficheiro de serviço de exemplo App.config, a definição de ponto de extremidade especifica o basicHttpBinding e faz referência a uma configuração de vinculação chamada 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 vinculação define o mode<atributo da segurança> como Message e define o clientCredentialType<atributo da mensagem> como Certificate 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 autenticar-se no cliente é definido na seção de comportamentos do arquivo de configuração sob o serviceCredentials elemento . O modo de validação que se aplica ao certificado que o cliente usa para autenticar-se no serviço também é definido na seção 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 vinculaçã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 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 do One-Time para os exemplos do Windows Communication Foundation.

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

Para executar a amostra na mesma máquina

  1. Execute Setup.bat a partir da pasta de instalação de exemplo. Isso instala todos os certificados necessários para executar o exemplo.

    Observação

    O arquivo em lotes 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 de \service\bin.

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

  4. Se o cliente e o serviço não puderem comunicar-se, consulte Dicas de Resolução de Problemas para Amostras de WCF.

  5. Remova os certificados executando Cleanup.bat quando terminar o exemplo. Outros exemplos de segurança usam os mesmos certificados.

Para executar o exemplo em várias máquinas

  1. Crie um diretório na máquina de serviço para os binários de serviço.

  2. Copie os arquivos de 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 na máquina cliente para os binários do cliente.

  4. Copie os arquivos de programa do cliente para o diretório do cliente na máquina 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 da máquina 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 do elemento <serviceCertificate>, que é o mesmo que o nome de domínio totalmente qualificado da máquina. Altere também o valor do endereço base para especificar um nome de máquina totalmente qualificado em vez de localhost.

  7. Copie o arquivo Service.cer do diretório de serviço para o diretório do cliente na máquina 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 de cliente para um arquivo chamado Client.cer.

  9. No arquivo Client.exe.config na máquina cliente, altere o valor de endereço do ponto de extremidade para corresponder ao novo endereço do seu serviço. Para fazer isso, substitua localhost pelo nome de domínio totalmente qualificado do servidor. Altere também o atributo findValue<defaultCertificate> para o novo nome de 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 armazenamento LocalMachine - TrustedPeople.

  13. Na máquina de serviço, execute Service.exe a partir de um prompt de comando.

  14. Na máquina cliente, execute Client.exe a partir de uma janela da linha de comandos.

    1. Se o cliente e o serviço não puderem comunicar-se, consulte Dicas de Resolução de Problemas para Amostras de WCF.

Para limpar após a amostra

  • Execute Cleanup.bat na pasta de exemplos depois de terminar de executar o exemplo.

    Observação

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