Membro e Provedor de Funções

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

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

Nota

O procedimento de configuração e as instruções de compilação para este exemplo estão localizados no final deste tópico.

O exemplo demonstra como:

  • Um cliente pode autenticar usando a combinação username-password.
  • O servidor pode validar as credenciais do cliente em relação ao 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ção ASP.NET.
  • O servidor pode usar o para controlar o PrincipalPermissionAttribute acesso a determinados métodos que são expostos pelo serviço.

Os provedores de associação e função são configurados para usar um repositório apoiado pelo SQL Server. Uma cadeia de conexão e várias opções são especificadas no arquivo de configuração do 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 consiste em um endereço, uma vinculação e um contrato. A associação é configurada com um padrão wsHttpBinding, que usa como padrão a autenticação do Windows. Este exemplo define o padrão wsHttpBinding para usar a autenticação de 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 o SubjectName atributo como o findValue atributo no <elemento de configuração serviceCertificate> . Além disso, o comportamento especifica que a autenticação de pares de nome de usuário e 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. As solicitações e respostas de operação são exibidas na janela do console do cliente. Todas as quatro chamadas feitas como usuário "Alice" devem ter sucesso. O usuário "Bob" deve obter um erro de acesso negado ao tentar chamar o método Divide. O usuário "Charlie" deve obter um erro de acesso negado ao tentar chamar o método Multiply. Pressione ENTER na janela do cliente para desligar o cliente.

Para configurar, compilar e executar o exemplo

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

  2. Verifique se você configurou o banco de dados ASP.NET Application Services.

    Nota

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

    Nota

    A conta do processo de trabalho 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 o exemplo em uma configuração de computador único ou entre computadores, use as instruções a seguir.

Para executar o exemplo no mesmo computador

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

  2. Execute Setup.bat a partir da pasta de instalação de exemplo 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 o exemplo.

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

  4. 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. Crie um diretório no computador de serviço. Crie um aplicativo virtual chamado servicemodelsamples para esse diretório usando a ferramenta de gerenciamento do IIS (Serviços de Informações da Internet).

  2. Copie os arquivos de 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 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.

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

  6. Edite Web.config para refletir o novo nome do certificado (no findValue atributo no <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 no computador cliente, altere o valor de endereço do ponto de extremidade para corresponder ao novo endereço do seu serviço.

  9. No cliente, abra um prompt de comando do desenvolvedor para Visual Studio com privilégios administrativos e execute ImportServiceCert.bat. Isso importa o certificado de serviço do arquivo Service.cer para o repositório CurrentUser - TrustedPeople.

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

O arquivo em lote de instalação

O arquivo em lote Setup.bat incluído neste exemplo permite configurar o servidor com certificados relevantes para executar um aplicativo auto-hospedado que requer segurança baseada em certificado de servidor. Esse arquivo em lotes deve ser modificado para funcionar entre computadores ou para funcionar em um caso não hospedado.

A seguir é fornecida uma breve visão geral das diferentes seções dos arquivos em lote para que eles possam ser modificados para serem executados na configuração apropriada.

  • Criação do certificado do servidor.

    As linhas a seguir do arquivo em lotes 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 seu próprio nome de servidor. Esse arquivo em lotes usa como padrão localhost.

    O certificado é armazenado em Meu armazenamento (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
    
  • Instalando o certificado do servidor no armazenamento de certificados confiáveis do cliente.

    As linhas a seguir no arquivo em lote Setup.bat copiam o certificado do servidor para o armazenamento de pessoas confiáveis do cliente. Esta etapa é necessária porque os certificados gerados por Makecert.exe não são implicitamente confiáveis pelo sistema cliente. Se você já tiver um certificado enraizado em um certificado raiz confiável do cliente, por exemplo, um certificado emitido pela Microsoft, esta etapa de preencher o armazenamento 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