Exemplo de segurança de mensagem

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

Nota

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 NoneTransportCredentialOnly . No seguinte arquivo App.config de serviço de exemplo, a definição de ponto de extremidade especifica e faz referência a basicHttpBinding 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<clientCredentialTypeatributo 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. Certifique-se de ter executado o procedimento de instalação única 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.

    Nota

    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 se comunicar, consulte Dicas de solução de problemas para exemplos de WCF.

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

Para executar a amostra em 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.bat e 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.bat e 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 findValue atributo no <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 setup.bat com o client argumento 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 findValue<atributo 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, inicie Client.exe a partir de uma janela de prompt de comando.

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

Para limpar após a amostra

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

    Nota

    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