Compartilhar via


Exemplo de identidade de serviço

Este exemplo de identidade de serviço demonstra como definir a identidade de um serviço. Em tempo de design, um cliente pode recuperar a identidade usando os metadados do serviço e, em tempo 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. Veja os exemplos no Cliente que mostram a autenticação do servidor.

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 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 utilizadas na configuração do endpoint.

  • 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

    Este 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 derivando das classes EndpointIdentity e IdentityVerifier. Conceitualmente, a IdentityVerifier classe pode ser considerada como o equivalente ao cliente da classe do AuthorizationManager 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 para o nome da organização ocorre no CheckAccess método na CustomIdentityVerifier classe.

// 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;
    }
}

Este exemplo usa um certificado chamado identity.com que está na pasta da solução Identity específica para o idioma.

Para configurar, compilar e executar o exemplo

  1. Verifique se você executou o Procedimento de instalação avulsa dos 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 cruzado, siga as instruções em Executar os exemplos do Windows Communication Foundation.

Para executar o exemplo 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 do MMC. Esse arquivo é protegido por senha. Durante a importação, você é solicitado a obter uma senha. Digite xyz na caixa de senha. Para obter mais informações, consulte o tópico 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 da pasta de instalação de exemplo dentro de um prompt de comando do Visual Studio 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 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. Certifique-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 de 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. Em seguida, compile o exemplo.

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

  3. Copie os arquivos do programa de serviço do 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 cliente.

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

  6. No serviço, execute setup.bat service em um Prompt de Comando do Desenvolvedor para Visual Studio aberto com privilégios de administrador. Executar 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 no computador cliente, altere o valor do endereço do ponto de extremidade para corresponder ao novo endereço do serviço. Há várias ocorrê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 importa 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 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.