Compartilhar via


Provedor de função e associação

O exemplo de Provedor de função e associação demonstra como um serviço pode usar a associação ASP.NET e os provedores de função para autenticar e autorizar clientes.

Nesta amostra, o cliente é um aplicativo de console (.exe) e o serviço é hospedado pelos Serviços de Informações da Internet (IIS).

Observação

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

O exemplo demonstra como:

  • Um cliente pode autenticar usando a combinação de nome de usuário e senha.
  • O servidor pode validar as credenciais do cliente no provedor de associação ASP.NET.
  • O servidor pode ser autenticado usando o certificado X.509 do servidor.
  • O servidor pode mapear o cliente autenticado para uma função usando o provedor de funções ASP.NET.
  • O servidor pode usar o PrincipalPermissionAttribute para controlar o acesso a determinados métodos expostos pelo serviço.

Os provedores de função e associação são configurados para usar um repositório apoiado por SQL Server. Uma cadeia de conexão e várias opções são especificadas no arquivo de configuração de serviço. O provedor de associação recebe o nome SqlMembershipProvider enquanto o provedor de função recebe o nome SqlRoleProvider.

<!-- Set the connection string for SQL Server -->
<connectionStrings>
  <add name="SqlConn"
       connectionString="..." />
</connectionStrings>

<system.web>
  <!-- Configure the Sql Membership Provider -->
  <membership defaultProvider="SqlMembershipProvider" userIsOnlineTimeWindow="15">
    <providers>
      <clear />
      <add
        name="SqlMembershipProvider"
        type="System.Web.Security.SqlMembershipProvider"
        connectionStringName="SqlConn"
        applicationName="MembershipAndRoleProviderSample"
        enablePasswordRetrieval="false"
        enablePasswordReset="false"
        requiresQuestionAndAnswer="false"
        requiresUniqueEmail="true"
        passwordFormat="Hashed" />
    </providers>
  </membership>

  <!-- Configure the Sql Role Provider -->
  <roleManager enabled ="true"
               defaultProvider ="SqlRoleProvider" >
    <providers>
      <add name ="SqlRoleProvider"
           type="System.Web.Security.SqlRoleProvider"
           connectionStringName="SqlConn"
           applicationName="MembershipAndRoleProviderSample"/>
    </providers>
  </roleManager>
</system.web>

O serviço expõe um único ponto de extremidade para comunicação com o serviço, que é definido usando o arquivo de configuração Web.config. O ponto de extremidade é composto por um endereço, uma associação e um contrato. A associação é configurada com um padrão wsHttpBinding, cujo padrão é usar a autenticação do Windows. Este exemplo define o padrão wsHttpBinding para usar a autenticação do nome de usuário. O comportamento especifica que o certificado do servidor deve ser usado para autenticação de serviço. O certificado do servidor deve conter o mesmo valor para SubjectName que o atributo findValue no elemento de configuração <serviceCertificate>. Além disso, o comportamento especifica que a autenticação de pares de nome de usuário-senha é executada pelo provedor de associação ASP.NET e o mapeamento de função é executado pelo provedor de função ASP.NET especificando os nomes definidos para os dois provedores.

<system.serviceModel>

  <protocolMapping>
    <add scheme="http" binding="wsHttpBinding" />
  </protocolMapping>

  <bindings>
    <wsHttpBinding>
      <!-- Set up a binding that uses Username as the client credential type -->
      <binding>
        <security mode ="Message">
          <message clientCredentialType ="UserName"/>
        </security>
      </binding>
    </wsHttpBinding>
  </bindings>

  <behaviors>
    <serviceBehaviors>
      <behavior>
        <!-- Configure role based authorization to use the Role Provider -->
        <serviceAuthorization principalPermissionMode ="UseAspNetRoles"
                              roleProviderName ="SqlRoleProvider" />
        <serviceCredentials>
          <!-- Configure user name authentication to use the Membership Provider -->
          <userNameAuthentication userNamePasswordValidationMode ="MembershipProvider"
                                  membershipProviderName ="SqlMembershipProvider"/>
          <!-- Configure the service certificate -->
          <serviceCertificate storeLocation ="LocalMachine"
                              storeName ="My"
                              x509FindType ="FindBySubjectName"
                              findValue ="localhost" />
        </serviceCredentials>
        <!--For debugging purposes set the includeExceptionDetailInFaults attribute to true-->
        <serviceDebug includeExceptionDetailInFaults="false" />
        <serviceMetadata httpGetEnabled="true"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

Quando você executa o exemplo, o cliente chama as várias operações de serviço em três contas de usuário diferentes: Alice, Bob e Charlie. Quando você executa o exemplo, as solicitações de operação e as respostas são exibidas na janela do console do cliente. Todas as quatro chamadas feitas como usuário "Alice" devem ser bem-sucedidas. O usuário "Bob" deve receber um erro de acesso negado ao tentar chamar o método Divide. O usuário "Bob" deve receber um erro de acesso negado ao tentar chamar o método Dividir. Pressione ENTER na janela do cliente para desligar o cliente.

Para configurar, compilar, e executar o exemplo

  1. Para compilar a edição C# ou Visual Basic .NET da solução, siga as instruções em Executando os exemplos do Windows Communication Foundation.

  2. Certifique-se de ter configurado o banco de dados de serviços de aplicativo ASP.NET.

    Observação

    Se você estiver executando o SQL Server Express Edition, o nome do servidor será .\SQLEXPRESS. Este servidor deve ser usado ao configurar o banco de dados ASP.NET Application Services, bem como na cadeia de conexão Web.config.

    Observação

    A conta do processo de trabalho do ASP.NET deve ter permissões no banco de dados criado nesta etapa. Use o utilitário sqlcmd ou o SQL Server Management Studio para fazer isso.

  3. Para executar a amostra em uma configuração de computador único ou entre computadores, use as instruções a seguir.

Para executar a amostra no mesmo computador

  1. Certifique-se de que o caminho inclua a pasta em que Makecert.exe está localizado.

  2. Execute Setup.bat na pasta de instalação da amostra em um Prompt de Comando do Desenvolvedor para Visual Studio executado com privilégios de administrador. Isso instala os certificados de serviço necessários para executar a amostra.

  3. Inicialize o Client.exe a partir do \client\bin. A atividade do cliente é exibida no aplicativo do console do cliente.

  4. 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 a amostra em vários computadores

  1. Criar 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 (IIS).

  2. 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, GetComputerName.vbs e Cleanup.bat para o computador de serviço.

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

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

  5. No servidor, abra um Prompt de Comando do Desenvolvedor para Visual Studio com privilégios administrativos e execute setup.bat service. 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.

  6. Edite Web.config para que ele reflita o novo nome do certificado (no atributo findValue em <serviceCertificate>), que é o mesmo que o nome de domínio totalmente qualificado do computador.

  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.

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

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

O arquivo de configuração em lote

O arquivo Setup.bat em lote, incluído com esta amostra, permite que você configure o servidor com os certificados relevantes para executar um aplicativo auto-hospedado que exige segurança baseada em certificado do servidor. Esse arquivo em lote precisa ser modificado para funcionar em computadores ou em um caso não hospedado.

A seguir, oferecemos uma visão geral das diferentes seções dos arquivos em lote que podem ser modificadas para executar a configuração apropriada.

  • Criação do certificado do servidor.

    As linhas a seguir do arquivo em lote Setup.bat criam o certificado do servidor a ser usado. A variável %SERVER_NAME% especifica o nome do servidor. Altere essa variável para especificar o nome do seu próprio servidor. Este arquivo em lotes assume como padrão localhost.

    O certificado é armazenado no repositório Meu (Pessoal) no local de armazenamento LocalMachine.

    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
    
  • Instalação do certificado do servidor no repositório de certificados confiáveis do cliente.

    As linhas a seguir no arquivo em lote Setup.bat copiam 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 do 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 preenchimento do 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