Partilhar via


Segurança de vinculaçã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 juntamente 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 devem ser seguras no nível da mensagem. Esta configuração não é suportada por associações fornecidas pelo sistema.

Este exemplo consiste em um programa de console cliente (EXE) e um programa de console de serviço (EXE). O serviço implementa um contrato duplex. O contrato é definido pela ICalculatorDuplex interface, que expõe operações matemáticas (Adicionar, Subtrair, Multiplicar e Dividir). A ICalculatorDuplex interface permite que o cliente execute operações matemáticas, calculando um resultado de execução ao longo de uma sessão. Independentemente, o serviço pode retornar resultados na ICalculatorDuplexCallback interface. Um contrato duplex requer uma sessão, porque um contexto deve ser estabelecido para correlacionar o conjunto de mensagens que estão sendo enviadas entre o cliente e o serviço. É definida uma ligação personalizada que suporta comunicação duplex e é segura.

Nota

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

A configuração do serviço define uma associação personalizada que suporta o seguinte:

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

  • Segurança de mensagens do Windows.

A configuração de vinculação personalizada permite o transporte seguro, habilitando simultaneamente a segurança no nível da mensagem. A ordenação dos elementos de vinculação é importante na definição de uma associação personalizada, porque cada um representa uma camada na pilha de canais (consulte Ligações personalizadas). A associação personalizada é definida nos arquivos de configuração de serviço e 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 proteger as mensagens durante a transmissão entre o cliente e o serviço. Isso é feito pelo sslStreamSecurity elemento de ligação. 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 segurança de mensagem com o tipo de credencial do Windows - esse é o tipo de credencial padrão. Isso é feito pelo security elemento de ligação. O cliente e o serviço são autenticados usando 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 Ative Directory. Se o mecanismo de autenticação Kerberos não estiver disponível, a autenticação NTLM será usada. NTLM autentica o cliente para o serviço, mas não autentica o serviço para o cliente. O security elemento binding é configurado para usar SecureConversation authenticationType, o que resulta na criação de uma sessão de segurança no cliente e no serviço. Isso é necessário para permitir que o contrato duplex do serviço funcione.

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.

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ê vê 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 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 lotes deve ser modificado para funcionar entre computadores ou para funcionar em um caso não hospedado.

A seguir fornece uma breve visão geral das diferentes seções dos arquivos em lote que se aplicam a este exemplo para que eles possam ser modificados para serem executados na 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 %SERVER_NAME% variável especifica o nome do servidor. Altere essa variável para especificar seu próprio nome de servidor. Esse arquivo em lotes padroniza 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
    
  • Instalando o certificado do servidor no armazenamento de certificados confiáveis do cliente.

    As linhas a seguir no arquivo Setup.bat copiam o certificado do servidor para o armazenamento de pessoas confiáveis do cliente. Esta etapa é necessária porque os certificados gerados por Makecert.exe não são implicitamente confiáveis pelo sistema cliente. Se você já tiver um certificado enraizado em um certificado raiz confiável do cliente, por exemplo, um certificado emitido pela Microsoft, esta etapa de preencher o armazenamento 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
    

    Nota

    O arquivo em lotes 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. 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.

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

Para executar o exemplo no mesmo computador

  1. Abra uma janela do Prompt de Comando do Desenvolvedor para Visual Studio com privilégios de administrador e execute Setup.bat 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 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 a partir de \service\bin.

  3. Inicie Client.exe 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.

Para executar o exemplo em computadores

  1. No computador de serviço:

    1. Crie um diretório virtual chamado servicemodelsamples no computador de serviço.

    2. Copie os arquivos de 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 seguinte comando 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 correspondente ao nome do computador em que o arquivo em lotes foi executado.

      Nota

      O arquivo em lotes 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 do assunto do certificado gerado na etapa anterior.

    6. Execute Service.exe a partir de um prompt de comando.

  2. No computador cliente:

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

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

    3. Exporte o certificado do serviço abrindo um prompt de comando do desenvolvedor para Visual Studio com privilégios administrativos e executando o seguinte comando no computador de serviço (substitua %SERVER_NAME% pelo nome totalmente qualificado do computador onde o serviço está sendo executado):

      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 onde o serviço está sendo executado).

    5. Importe o certificado do serviço abrindo um prompt de comando do desenvolvedor para Visual Studio com privilégios administrativos e executando o seguinte comando no computador cliente (substitua %SERVER_NAME% pelo nome totalmente qualificado do computador onde o serviço está sendo executado):

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

      As etapas c, d e e não são necessárias se o certificado for emitido por um Emissor Confiável.

    6. Modifique o arquivo 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 sendo executado 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 do 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 a identidade do ponto de extremidade, consulte o tópico Identidade e autenticação do serviço.

    8. Execute Client.exe a partir de um prompt de comando.

Para limpar após a amostra

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