Exemplo de identidade de serviço

Este exemplo de identidade de serviço demonstra como definir a identidade para um serviço. Em tempo de design, um cliente pode recuperar a identidade usando os metadados do serviço e, em seguida, 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 de chamadas não autenticadas. Em uma conexão segura, o serviço também autentica as credenciais de um cliente antes de permitir seu acesso, mas esse não é o foco deste exemplo. Veja os exemplos em Cliente que mostram a autenticação do servidor.

Nota

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 ilustra os seguintes recursos:

  • Como definir os diferentes tipos de identidade em diferentes pontos de extremidade para um serviço. Cada tipo de identidade tem capacidades 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, tanto para o cliente quanto para 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 ao cliente examinar 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.

    Nota

    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 Certificate e RSA na configuração no cliente, uma maneira fácil de obter esses valores é inspecionar o WSDL para o serviço onde 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 servidor de nomes de domínio (DNS) 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 Principal do 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 EndpointIdentity classes e IdentityVerifier . Conceitualmente, a IdentityVerifier classe pode ser considerada o equivalente do cliente da classe do AuthorizationManager serviço. O exemplo de código a seguir mostra uma implementação de , que armazena um nome de OrgEndpointIdentityorganização para corresponder ao nome do assunto do certificado do servidor. A verificação de autorização para o nome da CheckAccess organização ocorre no 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 de solução de identidade específica do idioma.

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. No Windows XP ou Windows Vista, importe o arquivo de certificado Identity.pfx na pasta Solução de identidade para o armazenamento de certificados LocalMachine/My (Personal) usando a ferramenta de snap-in MMC. Este ficheiro está protegido por palavra-passe. Durante a importação, é-lhe pedida uma palavra-passe. Digite xyz na caixa de senha. Para obter mais informações, consulte o tópico Como exibir certificados com o snap-in do MMC. Feito isso, execute Setup.bat em um prompt de comando do desenvolvedor para Visual Studio com privilégios de administrador, que copia esse certificado para o armazenamento CurrentUser/Trusted People para uso no cliente.

  2. No Windows Server 2003, execute Setup.bat a partir 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.

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

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

  4. Inicie Client.exe a partir 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, consulte Dicas de solução de problemas para exemplos de WCF.

Para executar o exemplo em computadores

  1. Antes de criar a parte do cliente do exemplo, certifique-se de alterar o valor do endereço do ponto de extremidade do serviço no arquivo de Client.cs no CallServiceCustomClientIdentity método. Em seguida, construa o exemplo.

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

  3. Copie os arquivos de 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 de programa 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 serviço, execute setup.bat service em um prompt de comando do desenvolvedor para Visual Studio aberto com privilégios de administrador. A execução setup.bat com o service argumento 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 de endereço do ponto de extremidade para corresponder ao novo endereço do seu 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 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, inicie Client.exe a partir de um prompt de comando. Se o cliente e o serviço não puderem se comunicar, consulte Dicas de solução de problemas para exemplos de WCF.

Para limpar após a amostra

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

    Nota

    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.