Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este exemplo demonstra como implementar um aplicativo que usa WS-Security com autenticação de nome de usuário para o cliente e requer autenticação de servidor usando o certificado X.509v3 do servidor. Todas as mensagens de aplicativo entre o cliente e o servidor são assinadas e criptografadas. Por padrão, o nome de usuário e a senha fornecidos pelo cliente são usados para fazer logon em uma conta válida do Windows. Este exemplo é baseado no WSHttpBinding. Este exemplo consiste em um programa de console do cliente (Client.exe) e uma biblioteca de serviços (Service.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 instalação e as instruções de build para este exemplo estão localizados no final deste tópico.
Este exemplo também demonstra:
O mapeamento padrão para contas do Windows para que a autorização adicional possa ser executada.
Como acessar as informações de identidade do chamador do código de serviço.
O serviço expõe um único ponto de extremidade para se comunicar com o serviço, que é definido usando o arquivo de configuração Web.config. O ponto de extremidade consiste em um endereço, uma associação e um contrato. A associação é configurada com um wsHttpBinding< padrão>, que por padrão utiliza a segurança de mensagens. Este exemplo define o wsHttpBinding< padrão> para usar a autenticação de nome de usuário do cliente. O comportamento especifica que as credenciais do usuário devem ser usadas para autenticação de serviço. O certificado do servidor deve conter o mesmo valor para o nome do assunto que o atributo findValue
em <serviceCredentials>.
<system.serviceModel>
<protocolMapping>
<add scheme="http" binding="wsHttpBinding" />
</protocolMapping>
<bindings>
<wsHttpBinding>
<!--
This configuration defines the security mode as Message and
the clientCredentialType as Username.
By default, Username authentication attempts to authenticate the provided
username as a Windows computer or domain account.
-->
<binding>
<security mode="Message">
<message clientCredentialType="UserName"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<!--For debugging purposes set the includeExceptionDetailInFaults attribute to true.-->
<behaviors>
<serviceBehaviors>
<behavior>
<!--
The serviceCredentials behavior allows one to define a service certificate.
A service certificate is used by the service to authenticate itself to the client and to 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>
</system.serviceModel>
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. A associação de cliente é configurada com o securityMode
e authenticationMode
apropriados. Ao ser executado em um cenário entre computadores, o endereço do ponto de extremidade de serviço deve ser alterado de acordo.
<system.serviceModel>
<client>
<endpoint address="http://localhost/servicemodelsamples/service.svc"
binding="wsHttpBinding"
bindingConfiguration="Binding1"
behaviorConfiguration="ClientCredentialsBehavior"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
</client>
<bindings>
<wsHttpBinding>
<!--
This configuration defines the security mode as Message and
the clientCredentialType as Username.
-->
<binding name="Binding1">
<security mode="Message">
<message clientCredentialType="UserName"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<!--For debugging purposes set the includeExceptionDetailInFaults attribute to true.-->
<behaviors>
<endpointBehaviors>
<behavior name="ClientCredentialsBehavior">
<!--
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.
-->
<clientCredentials>
<serviceCertificate>
<authentication certificateValidationMode="PeerOrChainTrust" />
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
A implementação do cliente define o nome de usuário e a senha a serem usados.
// Create a client.
CalculatorClient client = new CalculatorClient();
// Configure client with valid computer or domain account (username,password).
client.ClientCredentials.UserName.UserName = username;
client.ClientCredentials.UserName.Password = password.ToString();
// Call GetCallerIdentity service operation.
Console.WriteLine(client.GetCallerIdentity());
...
//Closing the client gracefully closes the connection and cleans up resources.
client.Close();
Quando você executa o exemplo, as solicitações e respostas da operação são exibidas na janela do console do cliente. Pressione ENTER na janela do cliente para desligar o cliente.
MyMachine\TestAccount
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 os exemplos de MessageSecurity 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 lote no modo de computador único, digite setup.bat
na linha de comando. Para executá-lo em modo de serviço, digite setup.bat service
. Você usa esse modo ao executar o exemplo em computadores. Consulte o procedimento de instalação no final deste tópico para obter detalhes.
O seguinte fornece uma breve visão geral das diferentes seções dos arquivos em lotes.
Criando o certificado do servidor
As linhas a seguir do arquivo em lote 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 -pe
A variável %SERVER_NAME% especifica o nome do servidor. O certificado é armazenado no repositório LocalMachine. Se o arquivo de lote Setup.bat for executado com um argumento de serviço (por exemplo,
setup.bat service
), o %SERVER_NAME% conterá o nome de domínio totalmente qualificado do computador. Caso contrário, ele usará o localhost como padrão.Instalando o certificado do servidor no repositório de certificados confiável do cliente
A linha a seguir copia 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 pelo sistema 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 preencher o 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
Concedendo permissões na chave privada do certificado
As linhas a seguir no arquivo de lote Setup.bat tornam o certificado do servidor armazenado no repositório LocalMachine acessível à conta de processo de trabalho do ASP.NET.
echo ************ echo setting privileges on server certificates echo ************ for /F "delims=" %%i in ('"%ProgramFiles%\ServiceModelSampleTools\FindPrivateKey.exe" My LocalMachine -n CN^=%SERVER_NAME% -a') do set PRIVATE_KEY_FILE=%%i set WP_ACCOUNT=NT AUTHORITY\NETWORK SERVICE (ver | findstr /C:"5.1") && set WP_ACCOUNT=%COMPUTERNAME%\ASPNET echo Y|cacls.exe "%PRIVATE_KEY_FILE%" /E /G "%WP_ACCOUNT%":R iisreset
Observação
Se você estiver usando uma edição do Windows em inglês que não seja dos EUA, você deve editar o arquivo Setup.bat e substituir o nome da conta
NT AUTHORITY\NETWORK SERVICE
pelo equivalente regional.
Para configurar, compilar e executar o exemplo
Verifique se você executou o Procedimento de instalação avulsa dos exemplos do Windows Communication Foundation.
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.
Para executar o exemplo no mesmo computador
Verifique se o caminho inclui a pasta em que Makecert.exe e FindPrivateKey.exe estão localizados.
Execute Setup.bat na pasta de instalação da amostra em um Prompt de Comando do Desenvolvedor para Visual Studio aberto com privilégios de administrador. Isso instala todos os certificados necessários para executar o exemplo.
Observação
O arquivo em lote Setup.bat foi projetado para ser executado em um Prompt de Comando do Desenvolvedor para Visual Studio. Isso requer que a variável de ambiente de caminho aponte para o diretório em que 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 inserindo o endereço
http://localhost/servicemodelsamples/service.svc
.Inicie Client.exe de \client\bin. A atividade do cliente é exibida no aplicativo de console do cliente.
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 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 dos Serviços de Informações da Internet.
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. 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 cliente.
Copie os arquivos do 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 service
em um Prompt de Comando do Desenvolvedor para Visual Studio aberto com privilégios de administrador. Executarsetup.bat
com o argumentoservice
cria 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 atributo findValue no elemento 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 do endereço do ponto de extremidade para corresponder ao novo endereço do 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, inicialize Client.exe a partir de um prompt de comando. Se o cliente e o serviço não puderem se comunicar, confira Dicas de solução de problemas para exemplos de WCF.
Para limpar após a amostra
Execute Cleanup.bat na pasta de exemplos depois de concluir a execução do 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 em 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
.