Fornecedor de tokenToken Provider

Este exemplo demonstra como implementar um provedor de token personalizado.This sample demonstrates how to implement a custom token provider. Um provedor de token no Windows Communication Foundation (WCF) é usado para fornecer credenciais para a infraestrutura de segurança.A token provider in Windows Communication Foundation (WCF) is used for supplying credentials to the security infrastructure. O provedor de token em geral examina o destino e emite as credenciais apropriadas para que a infraestrutura de segurança possa proteger a mensagem.The token provider in general examines the target and issues appropriate credentials so that the security infrastructure can secure the message. O WCF é fornecido com o provedor de token padrão do Credential Manager.WCF ships with the default Credential Manager Token Provider. O WCF também é fornecido com um provedor de token do CardSpace.WCF also ships with a CardSpace token provider. Os provedores de token personalizados são úteis nos seguintes casos:Custom token providers are useful in the following cases:

  • Se você tiver um repositório de credenciais para o qual esses provedores de token não podem operar.If you have a credential store that these token providers cannot operate with.

  • Se você quiser fornecer seu próprio mecanismo personalizado para transformar as credenciais do ponto em que o usuário fornece os detalhes quando a estrutura do cliente WCF usa as credenciais.If you want to provide your own custom mechanism for transforming the credentials from the point when the user provides the details to when the WCF client framework uses the credentials.

  • Se você estiver criando um token personalizado.If you are building a custom token.

Este exemplo mostra como criar um provedor de token personalizado que transforma a entrada do usuário em um formato diferente.This sample shows how to build a custom token provider that transforms the input from the user into a different format.

Para resumir, este exemplo demonstra o seguinte:To summarize, this sample demonstrates the following:

  • Como um cliente pode se autenticar usando um par de nome de usuário/senha.How a client can authenticate using a username/password pair.

  • Como um cliente pode ser configurado com um provedor de token personalizado.How a client can be configured with a custom token provider.

  • Como o servidor pode validar as credenciais do cliente usando uma senha com um personalizado UserNamePasswordValidator que valida a correspondência entre o nome de usuário e a senha.How the server can validate the client credentials using a password with a custom UserNamePasswordValidator that validates that the username and password match.

  • Como o servidor é autenticado pelo cliente usando o certificado X. 509 do servidor.How the server is authenticated by the client using the server's X.509 certificate.

Este exemplo também mostra como a identidade do chamador pode ser acessada após o processo de autenticação de token personalizado.This sample also shows how the caller's identity is accessible after the custom token authentication process.

O serviço expõe um único ponto de extremidade para se comunicar com o serviço, definido usando o arquivo de configuração App.config.The service exposes a single endpoint for communicating with the service, defined using the App.config configuration file. O ponto de extremidade consiste em um endereço, uma associação e um contrato.The endpoint consists of an address, a binding, and a contract. A associação é configurada com um padrão wsHttpBinding , que usa a segurança de mensagem por padrão.The binding is configured with a standard wsHttpBinding, which uses message security by default. Este exemplo define o padrão wsHttpBinding para usar a autenticação de nome de usuário do cliente.This sample sets the standard wsHttpBinding to use client username authentication. O serviço também configura o certificado de serviço usando o comportamento serviceCredentials.The service also configures the service certificate using the serviceCredentials behavior. O comportamento serviceCredentials permite que você configure um certificado de serviço.The serviceCredentials behavior allows you to configure a service certificate. Um certificado de serviço é usado por um cliente para autenticar o serviço e fornecer proteção de mensagem.A service certificate is used by a client to authenticate the service and provide message protection. A configuração a seguir faz referência ao certificado localhost instalado durante a configuração de exemplo, conforme descrito nas instruções de instalação a seguir.The following configuration references the localhost certificate installed during the sample setup as described in the following setup instructions.

<system.serviceModel>
    <services>
      <service
          name="Microsoft.ServiceModel.Samples.CalculatorService"
          behaviorConfiguration="CalculatorServiceBehavior">
        <host>
          <baseAddresses>
            <!-- configure base address provided by host -->
            <add baseAddress ="http://localhost:8000/servicemodelsamples/service"/>
          </baseAddresses>
        </host>
        <!-- use base address provided by host -->
        <endpoint address=""
                  binding="wsHttpBinding"
                  bindingConfiguration="Binding1"
                  contract="Microsoft.ServiceModel.Samples.ICalculator" />
      </service>
    </services>

    <bindings>
      <wsHttpBinding>
        <binding name="Binding1">
          <security mode="Message">
            <message clientCredentialType="UserName" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>

    <behaviors>
      <serviceBehaviors>
        <behavior name="CalculatorServiceBehavior">
          <serviceDebug includeExceptionDetailInFaults="False" />
          <!--
        The serviceCredentials behavior allows one 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>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

A configuração de ponto de extremidade do cliente consiste em um nome de configuração, um endereço absoluto para o ponto de extremidade de serviço, a associação e o contrato.The client endpoint configuration consists of a configuration name, an absolute address for the service endpoint, the binding, and the contract. A associação de cliente é configurada com a Mode mensagem e apropriada clientCredentialType .The client binding is configured with the appropriate Mode and message clientCredentialType.

<system.serviceModel>
  <client>
    <endpoint name=""
              address="http://localhost:8000/servicemodelsamples/service"
              binding="wsHttpBinding"
              bindingConfiguration="Binding1"
              contract="Microsoft.ServiceModel.Samples.ICalculator">
    </endpoint>
  </client>

  <bindings>
    <wsHttpBinding>
      <binding name="Binding1">
        <security mode="Message">
          <message clientCredentialType="UserName" />
        </security>
      </binding>
    </wsHttpBinding>
  </bindings>
</system.serviceModel>

As etapas a seguir mostram como desenvolver um provedor de token personalizado e integrá-lo com a estrutura de segurança do WCF:The following steps show how to develop a custom token provider and integrate it with the WCF security framework:

  1. Escreva um provedor de token personalizado.Write a custom token provider.

    O exemplo implementa um provedor de token personalizado que obtém o nome de usuário e a senha.The sample implements a custom token provider that obtains the username and password. A senha deve corresponder a este nome de usuário.The password must match this username. Esse provedor de token personalizado é apenas para fins de demonstração e não é recomendado para implantação do mundo real.This custom token provider is for demonstration purposes only and is not recommended for real world deployment.

    Para executar essa tarefa, o provedor de token personalizado deriva a SecurityTokenProvider classe e substitui o GetTokenCore(TimeSpan) método.To perform this task, the custom token provider derives the SecurityTokenProvider class and overrides the GetTokenCore(TimeSpan) method. Esse método cria e retorna um novo UserNameSecurityToken .This method creates and returns a new UserNameSecurityToken.

    protected override SecurityToken GetTokenCore(TimeSpan timeout)
    {
        // obtain username and password from the user using console window
        string username = GetUserName();
        string password = GetPassword();
        Console.WriteLine("username: {0}", username);
    
        // return new UserNameSecurityToken containing information obtained from user
        return new UserNameSecurityToken(username, password);
    }
    
  2. Gravar Gerenciador de token de segurança personalizado.Write custom security token manager.

    O SecurityTokenManager é usado para criar SecurityTokenProvider para o específico SecurityTokenRequirement que é passado para ele no CreateSecurityTokenProvider método.The SecurityTokenManager is used to create SecurityTokenProvider for specific SecurityTokenRequirement that is passed to it in CreateSecurityTokenProvider method. O Gerenciador de token de segurança também é usado para criar autenticadores de token e um serializador de token, mas eles não são cobertos por esse exemplo.Security token manager is also used to create token authenticators and a token serializer, but those are not covered by this sample. Neste exemplo, o Gerenciador de token de segurança personalizado herda da ClientCredentialsSecurityTokenManager classe e substitui o CreateSecurityTokenProvider método para retornar o provedor de token de nome de usuário personalizado quando os requisitos de token passados indicam que o provedor de nome de usuário é solicitado.In this sample, the custom security token manager inherits from ClientCredentialsSecurityTokenManager class and overrides the CreateSecurityTokenProvider method to return custom username token provider when the passed token requirements indicate that username provider is requested.

    public class MyUserNameSecurityTokenManager : ClientCredentialsSecurityTokenManager
    {
        MyUserNameClientCredentials myUserNameClientCredentials;
    
        public MyUserNameSecurityTokenManager(MyUserNameClientCredentials myUserNameClientCredentials)
            : base(myUserNameClientCredentials)
        {
            this.myUserNameClientCredentials = myUserNameClientCredentials;
        }
    
        public override SecurityTokenProvider CreateSecurityTokenProvider(SecurityTokenRequirement tokenRequirement)
        {
            // if token requirement matches username token return custom username token provider
            // otherwise use base implementation
            if (tokenRequirement.TokenType == SecurityTokenTypes.UserName)
            {
                return new MyUserNameTokenProvider();
            }
            else
            {
                return base.CreateSecurityTokenProvider(tokenRequirement);
            }
        }
    }
    
  3. Grave uma credencial de cliente personalizada.Write a custom client credential.

    A classe de credenciais de cliente é usada para representar as credenciais que são configuradas para o proxy do cliente e cria o Gerenciador de token de segurança que é usado para obter autenticadores de token, provedores de token e um serializador de token.Client credentials class is used to represent the credentials that are configured for the client proxy and creates security token manager that is used to obtain token authenticators, token providers and a token serializer.

    public class MyUserNameClientCredentials : ClientCredentials
    {
        public MyUserNameClientCredentials()
            : base()
        {
        }
    
        protected override ClientCredentials CloneCore()
        {
            return new MyUserNameClientCredentials();
        }
    
        public override SecurityTokenManager CreateSecurityTokenManager()
        {
            // return custom security token manager
            return new MyUserNameSecurityTokenManager(this);
        }
    }
    
  4. Configure o cliente para usar a credencial de cliente personalizada.Configure the client to use the custom client credential.

    Para que o cliente use a credencial de cliente personalizada, o exemplo exclui a classe de credencial do cliente padrão e fornece a nova classe de credencial do cliente.In order for the client to use the custom client credential, the sample deletes the default client credential class and supplies the new client credential class.

    static void Main()
    {
        // ...
           // Create a client with given client endpoint configuration
          CalculatorClient client = new CalculatorClient();
    
          // set new credentials
           client.ChannelFactory.Endpoint.Behaviors.Remove(typeof(ClientCredentials));
         client.ChannelFactory.Endpoint.Behaviors.Add(new MyUserNameClientCredentials());
       // ...
    }
    

No serviço, para exibir as informações do chamador, use o PrimaryIdentity conforme mostrado no exemplo de código a seguir.On the service, to display the caller's information, use the PrimaryIdentity as shown in the following code example. O Current contém informações de declarações sobre o chamador atual.The Current contains claims information about the current caller.

static void DisplayIdentityInformation()
{
    Console.WriteLine("\t\tSecurity context identity  :  {0}",
        ServiceSecurityContext.Current.PrimaryIdentity.Name);
}

Quando você executa o exemplo, as solicitações de operação e as respostas são exibidas na janela do console do cliente.When you run the sample, the operation requests and responses are displayed in the client console window. Pressione ENTER na janela do cliente para desligar o cliente.Press ENTER in the client window to shut down the client.

Arquivo em lotes de instalaçãoSetup Batch File

O arquivo em lotes Setup.bat incluído com este exemplo permite que você configure o servidor com o certificado relevante para executar um aplicativo auto-hospedado que requer segurança baseada em certificado do servidor.The Setup.bat batch file included with this sample allows you to configure the server with the relevant certificate to run a self-hosted application that requires server certificate-based security. Esse arquivo em lotes deve ser modificado para funcionar em computadores ou para funcionar em um caso não hospedado.This batch file must be modified to work across computers or to work in a non-hosted case.

Veja a seguir uma breve visão geral das diferentes seções dos arquivos em lotes para que eles possam ser modificados para serem executados na configuração apropriada:The following provides a brief overview of the different sections of the batch files so that they can be modified to run in the appropriate configuration:

  • Criando o certificado do servidor.Creating the server certificate.

    As linhas a seguir do arquivo de Setup.bat lote criam o certificado do servidor a ser usado.The following lines from the Setup.bat batch file create the server certificate to be used. A %SERVER_NAME% variável especifica o nome do servidor.The %SERVER_NAME% variable specifies the server name. Altere essa variável para especificar seu próprio nome de servidor.Change this variable to specify your own server name. O valor padrão nesse arquivo em lotes é localhost.The default value in this batch file is localhost.

    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
    
  • Instalando o certificado do servidor no repositório de certificados confiáveis do cliente:Installing the server certificate into the client's trusted certificate store:

    As linhas a seguir no arquivo de Setup.bat lote copiam o certificado do servidor no repositório de pessoas confiáveis do cliente.The following lines in the Setup.bat batch file copy the server certificate into the client trusted people store. Essa etapa é necessária porque os certificados gerados por Makecert.exe não são implicitamente confiáveis pelo sistema cliente.This step is required because certificates generated by Makecert.exe are not implicitly trusted by the client system. Se você já tiver um certificado com raiz em um certificado raiz confiável do cliente — por exemplo, um certificado emitido pela Microsoft — esta etapa de popular o repositório de certificados do cliente com o certificado do servidor não será necessária.If you already have a certificate that is rooted in a client trusted root certificate—for example, a Microsoft issued certificate—this step of populating the client certificate store with the server certificate is not required.

    certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
    

Observação

O arquivo em lotes Setup.bat foi projetado para ser executado em um prompt de comando de SDK do Windows.The Setup.bat batch file is designed to be run from a Windows SDK Command Prompt. Ele requer que a variável de ambiente MSSDK aponte para o diretório em que o SDK está instalado.It requires that the MSSDK environment variable point to the directory where the SDK is installed. Essa variável de ambiente é definida automaticamente em um prompt de comando SDK do Windows.This environment variable is automatically set within a Windows SDK Command Prompt.

Para configurar e compilar o exemploTo set up and build the sample

  1. Verifique se você executou o procedimento de configuração única para os exemplos de Windows Communication Foundation.Ensure that you have performed the One-Time Setup Procedure for the Windows Communication Foundation Samples.

  2. Para compilar a solução, siga as instruções em criando os exemplos de Windows Communication Foundation.To build the solution, follow the instructions in Building the Windows Communication Foundation Samples.

Para executar o exemplo no mesmo computadorTo run the sample on the same computer

  1. Execute Setup.bat da pasta de instalação de exemplo dentro de um prompt de comando do Visual Studio 2012 aberto com privilégios de administrador.Run Setup.bat from the sample installation folder inside a Visual Studio 2012 command prompt opened with administrator privileges. Isso instala todos os certificados necessários para executar o exemplo.This installs all the certificates required for running the sample.

    Observação

    O arquivo em lotes Setup.bat foi projetado para ser executado em um prompt de comando do Visual Studio 2012.The Setup.bat batch file is designed to be run from a Visual Studio 2012 Command Prompt. A variável de ambiente PATH definida no prompt de comando do Visual Studio 2012 aponta para o diretório que contém os executáveis exigidos pelo script Setup.bat.The PATH environment variable set within the Visual Studio 2012 Command Prompt points to the directory that contains executables required by the Setup.bat script.

  2. Iniciar service.exe de service\bin.Launch service.exe from service\bin.

  3. Iniciar Client.exe de \client\bin.Launch Client.exe from \client\bin. A atividade do cliente é exibida no aplicativo de console do cliente.Client activity is displayed on the client console application.

  4. Na solicitação de nome de usuário, digite um nome de utilizador.At the username prompt, type a user name.

  5. No prompt de senha, use a mesma cadeia de caracteres que foi digitada para o prompt de nome de usuário.At the password prompt, use the same string that was typed for the username prompt.

  6. Se o cliente e o serviço não puderem se comunicar, consulte dicas de solução de problemas para exemplos do WCF.If the client and service are not able to communicate, see Troubleshooting Tips for WCF Samples.

Para executar o exemplo entre computadoresTo run the sample across computers

  1. Crie um diretório no computador de serviço para os binários de serviço.Create a directory on the service computer for the service binaries.

  2. Copie os arquivos de programa do serviço para o diretório de serviço no computador do serviço.Copy the service program files to the service directory on the service computer. Copie também os arquivos de Setup.bat e Cleanup.bat para o computador de serviço.Also copy the Setup.bat and Cleanup.bat files to the service computer.

  3. Você deve ter um certificado de servidor com o nome da entidade que contém o nome de domínio totalmente qualificado do computador.You must have a server certificate with the subject name that contains the fully-qualified domain name of the computer. O arquivo de Service.exe.config deve ser atualizado para refletir esse novo nome de certificado.The Service.exe.config file must be updated to reflect this new certificate name. Você pode criar um certificado do servidor modificando o arquivo em lotes Setup.bat.You can create server certificate by modifying the Setup.bat batch file. Observe que o arquivo de setup.bat deve ser executado de um Prompt de Comando do Desenvolvedor para o Visual Studio aberto com privilégios de administrador.Note that the setup.bat file must be run from a Developer Command Prompt for Visual Studio opened with administrator privileges. Você deve definir a %SERVER_NAME% variável para o nome de host totalmente qualificado do computador que é usado para hospedar o serviço.You must set %SERVER_NAME% variable to fully-qualified host name of the computer that is used to host the service.

  4. Copie o certificado do servidor no repositório de CurrentUser-TrustedPeople do cliente.Copy the server certificate into the CurrentUser-TrustedPeople store of the client. Você não precisa fazer isso quando o certificado do servidor é emitido por um emissor confiável do cliente.You do not need to do this when the server certificate is issued by a client trusted issuer.

  5. No arquivo de Service.exe.config no computador de serviço, altere o valor do endereço base para especificar um nome de computador totalmente qualificado em vez de localhost.In the Service.exe.config file on the service computer, change the value of the base address to specify a fully-qualified computer name instead of localhost.

  6. No computador do serviço, execute service.exe em um prompt de comando.On the service computer, run service.exe from a command prompt.

  7. Copie os arquivos de programas do cliente da pasta \client\bin, na pasta específica do idioma, para o computador cliente.Copy the client program files from the \client\bin\ folder, under the language-specific folder, to the client computer.

  8. No arquivo de Client.exe.config no computador cliente, altere o valor de endereço do ponto de extremidade para corresponder ao novo endereço do serviço.In the Client.exe.config file on the client computer, change the address value of the endpoint to match the new address of your service.

  9. No computador cliente, inicie Client.exe a partir de uma janela de prompt de comando.On the client computer, launch Client.exe from a command prompt window.

  10. Se o cliente e o serviço não puderem se comunicar, consulte dicas de solução de problemas para exemplos do WCF.If the client and service are not able to communicate, see Troubleshooting Tips for WCF Samples.

Para limpar após o exemploTo clean up after the sample

  1. Execute Cleanup.bat na pasta Samples depois de concluir a execução do exemplo.Run Cleanup.bat in the samples folder once you have finished running the sample.