Compartilhar via


Segurança de associação personalizada

Este exemplo demonstra como configurar a segurança usando uma associação personalizada. Ele mostra como usar uma associação personalizada para habilitar a segurança no nível da mensagem junto com um transporte seguro. Isso é útil quando um transporte seguro é necessário para transmitir as mensagens entre o cliente e o serviço e, simultaneamente, as mensagens precisam estar seguras no nível da mensagem. Essa configuração não é compatível com associações fornecidas pelo sistema.

Este exemplo consiste em um programa de console do cliente (EXE) e um programa de console de serviço (EXE). O serviço implementa um contrato duplex. O contrato é definido pela interface ICalculatorDuplex, que expõe operações matemáticas (adicionar, subtrair, multiplicar e dividir). A interface ICalculatorDuplex permite que o cliente execute operações matemáticas, calculando um resultado em execução em uma sessão. Independentemente, o serviço pode retornar resultados na interface ICalculatorDuplexCallback. Um contrato duplex requer uma sessão, pois um contexto precisa ser estabelecido para correlacionar o conjunto de mensagens enviadas entre o cliente e o serviço. Uma associação personalizada é definida para permitir comunicação duplex e é segura.

Observação

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

A configuração de serviço define uma associação personalizada que permite o seguinte:

  • Comunicação TCP protegida usando o protocolo TLS/SSL.

  • Segurança de mensagem do Windows.

A configuração de associação personalizada permite o transporte seguro habilitando simultaneamente a segurança no nível da mensagem. A ordenação de elementos de associação é importante na definição de uma associação personalizada, pois cada uma representa uma camada na pilha de canais (consulte Associações Personalizadas). A associação personalizada é definida nos arquivos de configuração do serviço e do cliente, conforme mostrado na configuração de exemplo a seguir.

<bindings>
  <!-- Configure a custom binding. -->
  <customBinding>
    <binding name="Binding1">
      <security authenticationMode="SecureConversation"
                 requireSecurityContextCancellation="true">
      </security>
      <textMessageEncoding messageVersion="Soap12WSAddressing10" writeEncoding="utf-8"/>
      <sslStreamSecurity requireClientCertificate="false"/>
      <tcpTransport/>
    </binding>
  </customBinding>
</bindings>

A associação personalizada usa um certificado de serviço para autenticar o serviço no nível de transporte e para proteger as mensagens durante a transmissão entre o cliente e o serviço. Isso é feito pelo elemento de associação sslStreamSecurity. O certificado do serviço é configurado usando um comportamento de serviço, conforme mostrado na configuração de exemplo a seguir.

<behaviors>
    <serviceBehaviors>
    <behavior name="CalculatorServiceBehavior">
        <serviceMetadata />
        <serviceDebug includeExceptionDetailInFaults="False" />
        <serviceCredentials>
        <serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName"/>
        </serviceCredentials>
    </behavior>
    </serviceBehaviors>
</behaviors>

Além disso, a associação personalizada usa a segurança da mensagem com o tipo de credencial do Windows, e esse é o tipo de credencial padrão. Isso é feito pelo elemento de associação security. O cliente e o serviço serão autenticados usando a segurança no nível da mensagem se o mecanismo de autenticação Kerberos estiver disponível. Isso acontece se o exemplo for executado no ambiente do Active Directory. Se o mecanismo de autenticação Kerberos não estiver disponível, a autenticação NTLM será usada. O NTLM autentica o cliente no serviço, mas não autentica o serviço para o cliente. O elemento de ligação security é configurado para usar SecureConversation authenticationType, o que resulta na criação de uma sessão de segurança tanto no cliente quanto no serviço. Isso é necessário para permitir o funcionamento do contrato duplex do serviço.

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.

Press <ENTER> to terminate client.
Result(100)
Result(50)
Result(882.5)
Result(441.25)
Equation(0 + 100 - 50 * 17.65 / 2 = 441.25)

Ao executar o exemplo, você verá as mensagens retornadas ao cliente na interface de retorno de chamada enviada do serviço. Cada resultado intermediário é exibido, seguido por toda a equação após a conclusão de todas as operações. Pressione ENTER para desligar o cliente.

O arquivo de Setup.bat incluído permite configurar o cliente e o servidor com o certificado de serviço relevante para executar um aplicativo hospedado que requer segurança baseada em certificado. Esse arquivo em lote precisa ser modificado para funcionar em computadores ou em um caso não hospedado.

A seguir, oferecemos uma visão geral das diferentes seções dos arquivos em lote que se aplicam a essa amostra, para que possam ser modificadas para executar a configuração apropriada:

  • Criação do certificado do servidor.

    As linhas a seguir do arquivo Setup.bat criam o certificado do servidor a ser usado. A variável %SERVER_NAME% especifica o nome do servidor. Altere essa variável para especificar o nome do seu próprio servidor. Esse arquivo em lote usa como padrão o nome do servidor para localhost.

    O certificado é armazenado no repositório CurrentUser para os serviços hospedados na Web.

    echo ************
    echo Server cert setup starting
    echo %SERVER_NAME%
    echo ************
    echo making server cert
    echo ************
    makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%SERVER_NAME% -sky exchange -pe
    
  • Instalação do certificado do servidor no repositório de certificados confiáveis do cliente.

    As linhas a seguir no arquivo Setup.bat copiam o certificado do servidor no repositório de pessoas confiáveis do cliente. Essa etapa é necessária porque os certificados gerados por Makecert.exe não são implicitamente confiáveis para o sistema do cliente. Se você já tiver um certificado com raiz em um certificado raiz confiável do cliente, por exemplo, um certificado emitido pela Microsoft, essa etapa de preenchimento do repositório de certificados do cliente com o certificado do servidor não será necessária.

    certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
    

    Observação

    O arquivo de lote Setup.bat foi projetado para ser executado a partir de um prompt de comando do Visual Studio 2010. 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 Visual Studio 2010.

Para configurar, compilar, e executar 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 .NET do C# ou do Visual Basic da solução, siga as instruções contidas em Como Compilar as Amostras do Windows Communication Foundation.

  3. Para executar o exemplo em uma configuração de computador único ou entre computadores, siga as instruções em Como executar os exemplos do Windows Communication Foundation.

Para executar o exemplo no mesmo computador

  1. Abra uma janela de Prompt de Comando do Desenvolvedor para Visual Studio com privilégios de administrador e execute Setup.bat na pasta de instalação da amostra. Isso instalará todos os certificados necessários para executar a amostra.

    Observação

    O arquivo de lote Setup.bat foi projetado para ser executado a partir de um prompt de comando do Visual Studio. A variável de ambiente PATH definida no prompt de comando do Visual Studio aponta para o diretório que contém executáveis exigidos pelo script Setup.bat.

  2. Inicie Service.exe por meio de \service\bin.

  3. Inicialize o Client.exe a partir do \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.

Para executar a amostra em vários computadores

  1. No computador de serviço:

    1. Crie um diretório virtual chamado servicemodelsamples.

    2. Copie os arquivos do programa de serviço de \inetpub\wwwroot\servicemodelsamples para o diretório virtual no computador de serviço. Certifique-se de copiar os arquivos no subdiretório \bin.

    3. Copie os arquivos Setup.bat e Cleanup.bat para o computador de serviço.

    4. Execute o comando a seguir em um Prompt de Comando do Desenvolvedor para Visual Studio aberto com privilégios de administrador: Setup.bat service. Isso cria o certificado de serviço com o nome da entidade que corresponde ao nome do computador no qual o arquivo do lote foi executado.

      Observação

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

    5. Altere o <serviceCertificate> dentro do arquivo Service.exe.config para refletir o nome da entidade do certificado gerado na etapa anterior.

    6. Execute Service.exe em um prompt de comando.

  2. No computador cliente:

    1. Copie os arquivos do programa cliente da pasta \client\bin\ para o computador cliente. Copie também o arquivo Cleanup.bat.

    2. Execute Cleanup.bat para remover certificados antigos de exemplos anteriores.

    3. Para exportar o certificado do serviço, abra um Prompt de Comando do Desenvolvedor para Visual Studio com privilégios administrativos e execute o seguinte comando no computador de serviço (substitua %SERVER_NAME% pelo nome totalmente qualificado do computador em que o serviço está em execução):

      certmgr -put -r LocalMachine -s My -c -n %SERVER_NAME% %SERVER_NAME%.cer
      
    4. Copie %SERVER_NAME%.cer para o computador cliente (substitua %SERVER_NAME% pelo nome totalmente qualificado do computador em que o serviço está em execução).

    5. Para importar o certificado do serviço, abra um Prompt de Comando do Desenvolvedor para Visual Studio com privilégios administrativos e execute o seguinte comando no computador cliente (substitua %SERVER_NAME% pelo nome totalmente qualificado do computador em que o serviço está em execução):

      certmgr.exe -add -c %SERVER_NAME%.cer -s -r CurrentUser TrustedPeople
      

      As etapas c, d e e não serão necessárias se o certificado for emitido por um emissor confiável.

    6. Modifique o arquivo de App.config do cliente da seguinte maneira:

      <client>
          <endpoint name="default"
              address="net.tcp://ReplaceThisWithServiceMachineName:8000/ServiceModelSamples/Service"
              binding="customBinding"
              bindingConfiguration="Binding1"
              contract="Microsoft.ServiceModel.Samples.ICalculatorDuplex"
              behaviorConfiguration="CalculatorClientBehavior" />
      </client>
      
    7. Se o serviço estiver em execução em uma conta diferente da conta NetworkService ou LocalSystem em um ambiente de domínio, talvez seja necessário modificar a identidade do ponto de extremidade de serviço dentro do arquivo App.config do cliente para definir o UPN ou SPN apropriado com base na conta usada para executar o serviço. Para obter mais informações sobre identidade, consulte o tópico Identidade de serviço e autenticação.

    8. Execute Client.exe em um prompt de comando.

Para limpar após a amostra

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