Exemplo de identidade de serviço

Esse exemplo demonstra como definir a identidade de um serviço. No momento do design, um cliente pode recuperar a identidade usando os metadados do serviço e, no momento de execução, o cliente pode autenticar a identidade do serviço. O conceito de identidade de serviço é permitir que um cliente autentique um serviço antes de chamar qualquer uma de suas operações, protegendo assim o cliente contra chamadas não autenticadas. Em uma conexão segura, o serviço também autentica as credenciais de um cliente antes de permitir o acesso, mas esse não é o foco deste exemplo. Consulte os exemplos em Cliente que mostram a autenticação do servidor.

Observação

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

Esse exemplo ilustra os seguintes recursos:

  • Como definir os diferentes tipos de identidade em pontos de extremidade diferentes para um serviço. Cada tipo de identidade tem recursos diferentes. O tipo de identidade a ser usado depende do tipo de credenciais de segurança usadas na associação do ponto de extremidade.

  • A identidade pode ser definida declarativamente na configuração ou imperativamente no código. Normalmente, para o cliente e o serviço, você deve usar a configuração para definir a identidade.

  • Como definir uma identidade personalizada no cliente. Uma identidade personalizada normalmente é uma personalização de um tipo existente de identidade que permite que o cliente examine outras informações de declaração fornecidas nas credenciais do serviço para tomar decisões de autorização antes de chamar o serviço.

    Observação

    Esse exemplo verifica a identidade de um certificado específico chamado identity.com e a chave RSA contida nesse certificado. Ao usar os tipos de identidade de Certificado e RSA na configuração no cliente, uma maneira fácil de obter esses valores é inspecionar o WSDL para o serviço em que esses valores são serializados.

O código de exemplo a seguir mostra como configurar a identidade de um ponto de extremidade de serviço com o DNS (Servidor de Nomes de Domínio) de um certificado usando um WSHttpBinding.

//Create a service endpoint and set its identity to the certificate's DNS
WSHttpBinding wsAnonbinding = new WSHttpBinding (SecurityMode.Message);
// Client are Anonymous to the service
wsAnonbinding.Security.Message.ClientCredentialType = MessageCredentialType.None;
WServiceEndpoint ep = serviceHost.AddServiceEndpoint(typeof(ICalculator),wsAnonbinding, String.Empty);
EndpointAddress epa = new EndpointAddress(dnsrelativeAddress,EndpointIdentity.CreateDnsIdentity("identity.com"));
ep.Address = epa;

A identidade também pode ser especificada na configuração no arquivo App.config. O exemplo a seguir mostra como definir a identidade UPN (Nome da Entidade de Usuário) para um ponto de extremidade de serviço.

<endpoint address="upnidentity"
        behaviorConfiguration=""
        binding="wsHttpBinding"
        bindingConfiguration="WSHttpBinding_Windows"
        name="WSHttpBinding_ICalculator_Windows"
        contract="Microsoft.ServiceModel.Samples.ICalculator">
  <!-- Set the UPN identity for this endpoint -->
  <identity>
      <userPrincipalName value="host\myservice.com" />
  </identity >
</endpoint>

Uma identidade personalizada pode ser definida no cliente por meio da derivação das classes EndpointIdentity e IdentityVerifier. Conceitualmente, a classe IdentityVerifier pode ser considerada o cliente equivalente da classe AuthorizationManager do serviço. O exemplo de código a seguir mostra uma implementação de OrgEndpointIdentity, que armazena um nome de organização para corresponder ao nome da entidade do certificado do servidor. A verificação de autorização do nome da organização ocorre no método CheckAccess na classe CustomIdentityVerifier.

// This custom EndpointIdentity stores an organization name
public class OrgEndpointIdentity : EndpointIdentity
{
    private string orgClaim;
    public OrgEndpointIdentity(string orgName)
    {
        orgClaim = orgName;
    }
    public string OrganizationClaim
    {
        get { return orgClaim; }
        set { orgClaim = value; }
    }
}

//This custom IdentityVerifier uses the supplied OrgEndpointIdentity to
//check that X.509 certificate's distinguished name claim contains
//the organization name e.g. the string value "O=Contoso"
class CustomIdentityVerifier : IdentityVerifier
{
    public override bool CheckAccess(EndpointIdentity identity, AuthorizationContext authContext)
    {
        bool returnvalue = false;
        foreach (ClaimSet claimset in authContext.ClaimSets)
        {
            foreach (Claim claim in claimset)
            {
                if (claim.ClaimType == "http://schemas.microsoft.com/ws/2005/05/identity/claims/x500distinguishedname")
                {
                    X500DistinguishedName name = (X500DistinguishedName)claim.Resource;
                    if (name.Name.Contains(((OrgEndpointIdentity)identity).OrganizationClaim))
                    {
                        Console.WriteLine("Claim Type: {0}",claim.ClaimType);
                        Console.WriteLine("Right: {0}", claim.Right);
                        Console.WriteLine("Resource: {0}",claim.Resource);
                        Console.WriteLine();
                        returnvalue = true;
                    }
                }
            }
        }
        return returnvalue;
    }
}

Esse exemplo usa um certificado chamado identity.com que está na pasta de solução de identidade específica do idioma.

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 a amostra no mesmo computador

  1. No Windows XP ou no Windows Vista, importe o arquivo de certificado Identity.pfx na pasta da solução Identity para o repositório de certificados LocalMachine/My (Personal) usando a ferramenta de snap-in MMC. Esse arquivo é protegido por senha. Durante a importação, é solicitada uma senha. Digite xyz no campo de senha. Para obter mais informações, confira Como exibir certificados com o snap-in do MMC. Depois que isso for feito, execute Setup.bat em um Prompt de Comando do Desenvolvedor do Visual Studio com privilégios de administrador, que copia esse certificado para o repositório CurrentUser/Pessoas Confiáveis para uso no cliente.

  2. No Windows Server 2003, execute Setup.bat na pasta de instalação de exemplo dentro de um prompt de comando do Visual Studio executado com privilégios de administrador. Isso instalará todos os certificados necessários para executar o exemplo.

    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. Lembre-se de remover os certificados executando Cleanup.bat quando terminar de usar o exemplo. Outros exemplos de segurança usam os mesmos certificados.

  3. Inicie Service.exe do diretório \service\bin. Verifique se o serviço indica que ele está pronto e exibe um prompt para pressionar <Enter> para encerrar o serviço.

  4. Inicie Client.exe do diretório \client\bin ou pressionando F5 no Visual Studio para compilar e executar. A atividade do cliente é exibida no aplicativo do console do cliente.

  5. 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

  1. Antes de criar a parte do cliente do exemplo, não se esqueça de alterar o valor do endereço do ponto de extremidade do serviço no arquivo Client.cs no método CallServiceCustomClientIdentity. Depois, compile a amostra.

  2. Criar um diretório no computador de serviço.

  3. Copie os arquivos do programa de serviço de \service\bin para o diretório no computador de serviço. Copie também os arquivos Setup.bat e Cleanup.bat para o computador de serviço.

  4. Crie um diretório no computador cliente para os binários do cliente.

  5. Copie os arquivos do programa do cliente para o diretório do cliente no computador cliente. Copie também os arquivos Setup.bat, Cleanup.bat e ImportServiceCert.bat para o cliente.

  6. No servidor, execute setup.bat service em um Prompt de Comando do Desenvolvedor do Visual Studio aberto com privilégios de administrador. A execução de setup.bat com o argumento service 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.

  7. Copie o arquivo Service.cer do diretório de serviço para o diretório do cliente no computador cliente.

  8. No arquivo Client.exe.config do computador cliente, altere o valor do endereço do ponto de extremidade para que ele corresponda ao novo endereço do serviço. Há várias instâncias que devem ser alteradas.

  9. No cliente, execute ImportServiceCert.bat em um Prompt de Comando do Desenvolvedor para Visual Studio aberto com privilégios de administrador. Isso importará o certificado de serviço do arquivo Service.cer para o repositório CurrentUser – TrustedPeople.

  10. No computador de serviço, inicie o Service.exe no prompt de comando.

  11. 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 fazer uma limpeza após o exemplo

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

    Observação

    Esse script não remove os certificados de serviço em um cliente na execução dessa amostra em vários computadores. Se você tiver executado exemplos do WCF (Windows Communication Foundation) que usam certificados em computadores, lembre-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.