Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
O exemplo de Segurança de Mensagem Anônima demonstra como implementar um aplicativo WCF (Windows Communication Foundation) que usa segurança no nível de mensagem sem autenticação de cliente, mas que requer autenticação de servidor usando o certificado X.509 do servidor. Todas as mensagens do aplicativo entre o cliente e o servidor são assinadas e criptografadas. Este exemplo é baseado no exemplo WSHttpBinding . Este exemplo consiste em um programa de console do cliente (.exe) e uma biblioteca de serviços (.dll) hospedada pelo IIS (Serviços de Informações da Internet). O serviço implementa um contrato que define um padrão de comunicação solicitação-resposta.
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.
Este exemplo adiciona uma nova operação à interface da calculadora que retorna True se o cliente não foi autenticado.
public class CalculatorService : ICalculator
{
public bool IsCallerAnonymous()
{
// ServiceSecurityContext.IsAnonymous returns true if the caller is not authenticated.
return ServiceSecurityContext.Current.IsAnonymous;
}
...
}
O serviço expõe um único endpoint para comunicação com o serviço, definido por meio de um arquivo de configuração (Web.config). O endpoint consiste em um endereço, uma ligação e um contrato. A associação é configurada com uma wsHttpBinding ligação. O modo de segurança padrão para a wsHttpBinding associação é Message. O clientCredentialType atributo é definido como None.
<system.serviceModel>
<protocolMapping>
<add scheme="http" binding="wsHttpBinding" />
</protocolMapping>
<bindings>
<wsHttpBinding>
<!-- This configuration defines the security mode as Message and -->
<!-- the clientCredentialType as None. This mode provides -->
<!-- server authentication only using the service certificate. -->
<binding>
<security mode="Message">
<message clientCredentialType="None" />
</security>
</binding>
</wsHttpBinding>
</bindings>
...
</system.serviceModel>
As credenciais a serem usadas para autenticação de <serviço são especificadas no comportamento>. O certificado do servidor deve conter o mesmo valor para o SubjectName como o valor especificado para o atributo findValue conforme mostrado no código de exemplo a seguir.
<behaviors>
<serviceBehaviors>
<behavior>
<!--
The serviceCredentials behavior allows you 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" />
</serviceCredentials>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
A configuração do ponto de extremidade do cliente consiste em um endereço absoluto para o ponto de extremidade de serviço, a associação e o contrato. O modo de segurança do cliente para a wsHttpBinding associação é Message. O clientCredentialType atributo é definido como None.
<system.serviceModel>
<client>
<endpoint name=""
address="http://localhost/servicemodelsamples/service.svc"
binding="wsHttpBinding"
behaviorConfiguration="ClientCredentialsBehavior"
bindingConfiguration="Binding1"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
</client>
<bindings>
<wsHttpBinding>
<!--This configuration defines the security mode as -->
<!--Message and the clientCredentialType as None. -->
<binding name="Binding1">
<security mode = "Message">
<message clientCredentialType="None"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
...
</system.serviceModel>
O exemplo define o CertificateValidationMode para PeerOrChainTrust autenticar o certificado do serviço. Isso é feito no arquivo App.config do cliente na seção behaviors. Isso significa que, se o certificado estiver no repositório de Pessoas Confiáveis do utilizador, ele será confiável sem validar a cadeia de emissores do certificado. Essa configuração é usada aqui para conveniência para que a amostra possa ser executada sem exigir certificados emitidos por uma autoridade de certificação (CA). Essa configuração é menos segura do que o padrão, ChainTrust. As implicações de segurança desta definição devem ser cuidadosamente consideradas antes de usar PeerOrChainTrust no código de produção.
A implementação do cliente adiciona uma chamada ao método IsCallerAnonymous e, caso contrário, não difere do exemplo WSHttpBinding.
// Create a client with a client endpoint configuration.
CalculatorClient client = new CalculatorClient();
// Call the GetCallerIdentity operation.
Console.WriteLine("IsCallerAnonymous returned: {0}", client.IsCallerAnonymous());
// Call the Add service operation.
double value1 = 100.00D;
double value2 = 15.99D;
double result = client.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
...
//Closing the client gracefully closes the connection and cleans up resources.
client.Close();
Console.WriteLine();
Console.WriteLine("Press <ENTER> to terminate client.");
Console.ReadLine();
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.
IsCallerAnonymous returned: True
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.
O arquivo em lote Setup.bat incluído com o exemplo Message Security Anonymous permite configurar o servidor com um certificado relevante para executar um aplicativo hospedado que requer segurança baseada em certificado. O arquivo em lote pode ser executado em dois modos. Para executar o arquivo em lotes no modo de computador único, digite setup.bat na linha de comando. Para executá-lo no modo de serviço, digite setup.bat service. Use esse modo ao executar o exemplo em computadores. Consulte o procedimento de configuração no final deste tópico para obter detalhes.
O seguinte fornece uma breve visão geral das diferentes seções dos arquivos em lote:
Criação do certificado do servidor.
As linhas a seguir do arquivo em lotes Setup.bat criam o certificado do servidor a ser usado.
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 -peA variável %SERVER_NAME% especifica o nome do servidor. O certificado é armazenado no repositório LocalMachine. Se o arquivo em lotes de instalação for executado com um argumento de serviço (como
setup.bat service), o %SERVER_NAME% conterá o nome de domínio totalmente qualificado do computador. Caso contrário, o padrão é localhost.Instalando o certificado do servidor no armazenamento de certificados confiáveis do cliente.
A linha a seguir copia o certificado do servidor para o repositório de pessoas fidedignas 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 TrustedPeopleConcessão de permissões na chave privada do certificado.
As linhas a seguir no arquivo em lote Setup.bat tornam o certificado do servidor armazenado no armazenamento LocalMachine acessível à conta do processo de trabalho ASP.NET.
echo ************ echo setting privileges on server certificates echo ************ for /F "delims=" %%i in ('"%MSSDK%\bin\FindPrivateKey.exe" My LocalMachine -n CN^=%SERVER_NAME% -a') do set PRIVATE_KEY_FILE=%%i set WP_ACCOUNT=NT AUTHORITY\NETWORK SERVICE (ver | findstr "5.1") && set WP_ACCOUNT=%COMPUTERNAME%\ASPNET echo Y|cacls.exe "%PRIVATE_KEY_FILE%" /E /G "%WP_ACCOUNT%":R iisreset
Observação
Se estiver a utilizar uma edição em inglês fora dos EUA do Windows, deve editar o arquivo Setup.bat e substituir o nome da conta NT AUTHORITY\NETWORK SERVICE pelo seu equivalente regional.
Para configurar, compilar e executar o exemplo
Verifique se você executou o procedimento de instalação do One-Time para os exemplos do Windows Communication Foundation.
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 o exemplo no mesmo computador
Verifique se o caminho inclui a pasta onde Makecert.exe e FindPrivateKey.exe estão localizados.
Execute Setup.bat a partir da pasta de instalação de exemplo em um prompt de comando do desenvolvedor para Visual Studio executado com privilégios de administrador. Isso instala todos os certificados necessários para executar o exemplo.
Observação
O arquivo em lote de instalação foi projetado para ser executado a partir de um prompt de comando do desenvolvedor para Visual Studio. 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 desenvolvedor para Visual Studio.
Verifique o acesso ao serviço usando um navegador digitando o endereço
http://localhost/servicemodelsamples/service.svc.Inicie Client.exe a partir de \client\bin. A atividade do cliente é exibida no aplicativo de console do cliente.
Se o cliente e o serviço não puderem comunicar-se, consulte Dicas de Resolução de Problemas para Amostras de WCF.
Para executar o exemplo em vários computadores
Crie um diretório no computador de serviço. Crie um aplicativo virtual chamado servicemodelsamples para esse diretório usando a ferramenta de gerenciamento do IIS (Serviços de Informações da Internet).
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. Copie também os arquivos Setup.bat e Cleanup.bat para o computador de serviço.
Crie um diretório no computador cliente para os binários do cliente.
Copie os arquivos de 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.
No servidor, execute
setup.bat serviceem um prompt de comando do desenvolvedor para Visual Studio aberto com privilégios de administrador. A execução desetup.batcom o argumentoservicecria 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.Edite Web.config para refletir o novo nome do certificado (no
findValueatributo no <serviceCertificate>), que é o mesmo que o nome de domínio totalmente qualificado do computador.Copie o arquivo Service.cer do diretório de serviço para o diretório do cliente no computador cliente.
No arquivo Client.exe.config no computador cliente, altere o valor de endereço do ponto de extremidade para corresponder ao novo endereço do seu serviço.
No cliente, execute ImportServiceCert.bat em um prompt de comando do desenvolvedor para Visual Studio aberto com privilégios de administrador. Isso importa o certificado de serviço do arquivo Service.cer para o repositório CurrentUser - TrustedPeople.
No computador cliente, inicie Client.exe a partir de um prompt de comando. 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 computadores. Se você tiver executado exemplos do Windows Communication Foundation (WCF) que usam certificados entre computadores, 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.