Partilhar via


Associação

pela Microsoft

Observação

Desde que este artigo foi escrito, os provedores de associação de ASP.NET foram substituídos por ASP.NET Identity. É altamente recomendável atualizar aplicativos para usar a plataforma ASP.NET Identity em vez dos provedores de associação apresentados no momento em que este artigo foi escrito. ASP.NET Identity tem várias vantagens sobre o sistema de associação ASP.NET, incluindo :

  • Melhor desempenho
  • Extensibilidade e testabilidade aprimoradas
  • Suporte para OAuth, OpenID Connect e autenticação de dois fatores
  • Suporte à identidade baseada em declarações
  • Melhor interoperabilidade com ASP.Net Core

ASP.NET Associação baseia-se no sucesso do modelo de autenticação do Forms do ASP.NET 1.x. ASP.NET a autenticação do Forms fornece uma maneira conveniente de incorporar um formulário de logon em seu aplicativo ASP.NET e validar usuários em um banco de dados ou em outro armazenamento de dados.

ASP.NET Associação baseia-se no sucesso do modelo de autenticação do Forms do ASP.NET 1.x. ASP.NET a autenticação do Forms fornece uma maneira conveniente de incorporar um formulário de logon em seu aplicativo ASP.NET e validar usuários em um banco de dados ou em outro armazenamento de dados. Os membros da classe FormsAuthentication possibilitam manipular cookies para autenticação, marcar para um logon válido, fazer logon de um usuário etc. No entanto, implementar a autenticação de Formulários em um aplicativo ASP.NET 1.x pode exigir uma quantidade justa de código.

A associação no ASP.NET 2.0 é um grande avanço em relação ao uso apenas da autenticação do Forms. (A associação é mais robusta quando associada à autenticação do Forms, mas o uso da autenticação do Forms não é um requisito.) Como você verá em breve, você pode usar ASP.NET Associação e os controles de logon no ASP.NET 2.0 para implementar um sistema de associação avançado sem escrever muito código.

Implementando a associação no ASP.NET 2.0

A associação é implementada seguindo quatro etapas. Tenha em mente que há muitas subconsultas envolvidas, bem como a configuração opcional que também pode ser implementada. Essas etapas servem para ilustrar o quadro geral da configuração da associação.

  1. Crie seu banco de dados de associação (se SQL Server for usado como o repositório de associação.)

  2. Especifique as opções de associação nos arquivos de configuração dos aplicativos. (A associação está habilitada por padrão.)

  3. Determine o tipo de repositório de associação que você deseja usar. As opções são:

    • Microsoft SQL Server (versão 7.0 ou posterior)
    • Repositório active directory
    • Provedor de associação personalizado
  4. Configure o aplicativo para autenticação do ASP.NET Forms. Mais uma vez, a Associação foi projetada para aproveitar a autenticação do Forms, mas usar a autenticação do Forms não é um requisito.

  5. Defina contas de usuário para associação e configure funções, se desejado.

Criando o banco de dados de associação

Se você estiver usando SQL Server 7.0 ou posterior como seu repositório de associação, poderá usar o utilitário aspnet_regsql (disponível com mais facilidade no Prompt de Comando do Visual Studio .NET 2005) para configurar seu banco de dados. O utilitário aspnet_regsql pode ser usado como uma ferramenta de prompt de comando ou por meio de um assistente de GUI. O método do assistente é a maneira mais fácil de configurar seu banco de dados. Para acessar o assistente, basta executar o seguinte comando:

aspnet_regsql W

Depois de executar esse comando, você receberá o Assistente de Instalação do ASP.NET SQL Server, conforme mostrado abaixo.

Captura de tela que mostra um Assistente de Instalação do Servidor Q L do A SP dot NET S.

Figura 1

O Assistente de Instalação do ASP.NET SQL Server cria o site na instância especificada no assistente. No entanto, ASP.NET usará a cadeia de conexão no arquivo machine.config para se conectar ao banco de dados. Por padrão, essa cadeia de conexão apontará para uma instância do SQL Server 2005, portanto, se você estiver usando uma instância do SQL Server 2000 ou SQL Server 7.0, será necessário modificar a cadeia de conexão no arquivo machine.config. Essa cadeia de conexão pode estar localizada aqui:

<configuration>
    <connectionStrings>
      <add name="LocalSqlServer"
         connectionString="data source=(local);
         Integrated Security=SSPI;Initial Catalog=aspnetdb;"  
         providerName="System.Data.SqlClient" />
    </connectionStrings>
</configuration>

Infelizmente, se você não modificar a cadeia de conexão, ASP.NET não fornecerá um erro descritivo. Ele continuará reclamando dizendo que você não criou o banco de dados. No caso acima, modifiquei a cadeia de conexão para apontar para minha instância local SQL Server 2000.

Especificando configuração e adição de usuários e funções

A próxima etapa na configuração da Associação é adicionar as informações necessárias ao arquivo web.config do aplicativo. Em ASP.NET 1.x, modificar o arquivo web.config às vezes era difícil devido ao uso de lowerCamelCase e à falta de Intellisense. O Visual Studio .NET 2005 facilita muito a tarefa com o Intellisense para arquivos de configuração, mas ASP.NET 2.0 vai além fornecendo uma interface da Web para editar arquivos de configuração.

Você pode iniciar a interface da Web clicando no botão Configuração do ASP.NET na barra de ferramentas Gerenciador de Soluções, conforme mostrado abaixo. Você também pode iniciar a interface da Web por meio de pop-ups exibidos quando os controles de logon são inseridos.

Captura de tela que mostra uma barra de ferramentas Gerenciador de Soluções com web.config selecionado.

Figura 2

Isso inicia a Ferramenta de Administração de Site ASP.NET mostrada abaixo. O ASP.NET Web Site Administration é uma interface de quatro guias que facilita o gerenciamento das configurações do aplicativo. As seguintes guias estão disponíveis:

  • Início
  • Segurança Configurar usuários, funções e acesso.
  • Aplicativo Definir as configurações do aplicativo.
  • Provedor Configure e teste o provedor de associação de aplicativos.

A Ferramenta de Administração de Site permite que você crie facilmente novos usuários, crie novas funções e gerencie usuários e funções. Essa capacidade não está disponível na interface do Windows. A interface do Windows permite definir facilmente as configurações de autorização e adicionar, excluir e gerenciar provedores, funcionalidades que não estão na Ferramenta de Administração de Site.

Para iniciar a interface do Windows, abra o snap-in dos Serviços de Informações da Internet, clique com o botão direito do mouse em seu aplicativo e escolha Propriedades. Clique na guia ASP.NET e clique no botão Editar Configuração. (O aplicativo deve estar em execução em ASP.NET 2.0 para que o botão Editar Configuração seja habilitado. Você também pode configurar a versão ASP.NET na caixa de diálogo ASP.NET.) A caixa de diálogo ASP.NET Configurações de Configuração é exibida conforme mostrado abaixo.

Captura de tela que mostra uma guia Geral na caixa de diálogo Configurações de Configuração do A SP dot N E T.

Figura 3

Na guia Geral, as cadeias de conexão e as configurações do aplicativo são listadas. Todas as configurações em itálico são definidas em um arquivo de configuração pai (o machine.config ou um web.config em um nível mais alto) e as configurações não em itálico são do arquivo de configuração de aplicativos. Se uma configuração for adicionada, removida ou editada no nível do aplicativo, ASP.NET adicionará, removerá ou modificará a configuração nos níveis do aplicativo web.config em vez de remover a configuração do arquivo de configuração do qual ela é herdada.

A guia Autenticação é mostrada abaixo. É aqui que você definirá suas configurações de associação. As configurações de autenticação de formulários, os provedores de associação e os provedores de função podem ser configurados aqui.

Captura de tela que mostra uma guia Autenticação na caixa de diálogo Configurações do A SP dot N E T.

Figura 4

Implementando a associação em seu aplicativo

A maneira mais fácil de implementar ASP.NET associação 2.0 em seu aplicativo é usar os controles de Logon fornecidos. Esse método permite implementar as noções básicas de ASP.NET associação 2.0 sem escrever nenhum código.

Os seguintes controles de logon estão disponíveis no ASP.NET 2.0:

Controle de logon

O controle Logon fornece uma interface para alguém fazer logon em seu sistema de associação. Ele fornece uma caixa de texto de nome de usuário e senha e um botão de logon. Muitos outros recursos comuns, como um link para se registrar para pessoas que ainda não fizeram isso, uma caixa de seleção que permite que o usuário faça logon automaticamente em visitas subsequentes, um link para um lembrete de senha etc. Todos os recursos do controle login são personalizáveis por meio das propriedades do controle.

No ASP.NET 1.x, os desenvolvedores tiveram que escrever uma boa quantidade de código para fazer uma pesquisa ao usar a autenticação do Forms. Com ASP.NET associação 2.0, você pode validar os usuários sem escrever nenhum código. ASP.NET fará automaticamente a pesquisa do usuário para você. (Se você estiver usando o controle Login sem usar ASP.NET associação, poderá usar o método OnAuthenticate para validar o usuário.)

Controle LoginView

O controle LoginView é um controle de modelo que fornece dois modelos por padrão; o AnonymousTemplate e o LoggedInTemplate. O modelo exibido é determinado por se o usuário está conectado ou não ao sistema de associação. Esse controle normalmente é usado para exibir um controle de logon quando um usuário ainda não fez logon e um controle LoginStatus e/ou outros controles de logon quando o usuário tiver feito logon. Se você estiver usando o gerenciamento de função em seu aplicativo ASP.NET, o controle LoginView poderá exibir um modelo específico com base na função de usuários. (Mais informações sobre ASP.NET gerenciamento de funções serão abordados posteriormente.)

Controle PasswordRecovery

O controle PasswordRecovery permite que os usuários recebam um email com sua senha atual ou redefinam sua senha. Texto sem formatação e senhas criptografadas podem ser recuperados e enviados por email aos usuários. Se a senha for hash, ela não poderá ser recuperada. Em vez disso, o usuário será obrigado a executar uma redefinição de senha.

Controle LoginStatus

O controle LoginStatus é usado para exibir um indicador de logon para usuários que não estão conectados e um indicador de logoff para os usuários que estão conectados no momento. A propriedade Request.IsAuthenticated é usada para determinar qual indicador exibir. O indicador exibido pelo controle LoginStatus pode ser texto (implementado por meio das propriedades LoginText e LogoutText ) ou imagens (implementadas por meio das propriedades LoginImageUrl e LogoutImageUrl .)

Quando um usuário faz logoff por meio do controle LoginStatus, ele é redirecionado para a URL especificada pela propriedade LogoutPageUrl . Se essa propriedade não estiver definida, a página atual será atualizada. Como o site provavelmente está protegido pela autenticação do Forms, a atualização da página atual redirecionará o usuário para a página de logon do site.

Controle LoginName

O controle LoginName exibe o nome de usuário do usuário conectado no momento ao site.

Controle CreateUserWizard

O controle CreateUserWizard fornece aos usuários uma maneira conveniente de se registrar em seu sistema de associação. Você pode adicionar etapas (implementadas como uma coleção de WizardSteps) por meio da interface mostrada abaixo.

Captura de tela que mostra uma caixa de diálogo Criar Tarefas do Assistente de Usuário com um menu suspenso para Inscrever-se para sua nova conta.

Figura 5

O CreateUserWizard é um controle de modelo que deriva da classe Assistente e fornece os seguintes modelos:

  • Headertemplate Esse modelo controla a aparência do cabeçalho do assistente.
  • Sidebartemplate Esse modelo controla a aparência da barra lateral do assistente.
  • Startnavigationtemplate Esse modelo controla a aparência da navegação do assistente na etapa inicial.
  • Stepnavigationtemplate Esse modelo controla a aparência da área de navegação quando não está na etapa de início ou de término.
  • Finishnavigationtemplate Esse modelo controla a aparência da área de navegação quando estiver na etapa de término.

Além disso, para cada etapa que você adicionar ao Assistente, ASP.NET criará um modelo personalizado que contém um ContentTemplate e um CustomNavigationTemplate para essa etapa. Para obter detalhes completos sobre como personalizar o CreateUserWizard, consulte a documentação do VS.NET 2005:

Controle ChangePassword

O controle ChangePassword permite que os usuários alterem sua senha. Se a propriedade DisplayUserName for verdadeira (é falsa por padrão), o usuário poderá alterar sua senha quando não estiver conectado. Se o usuário já estiver conectado e a propriedade DisplayUserName for verdadeira, o usuário poderá alterar a senha de outro usuário que não está conectado, desde que saiba a ID do usuário.

Tenha em mente que, se você quiser que os usuários possam alterar senhas sem precisar fazer logon, será necessário garantir que a página na qual o controle ChangePassword seja exibido permita acesso anônimo. Obviamente, os usuários terão que fornecer sua senha antiga para alterar sua senha.

Gerenciamento de funções

O gerenciamento de função permite que você atribua usuários a uma função específica e, em seguida, restrinja o acesso a determinados arquivos ou pastas com base nessa função. O gerenciamento de função também fornece uma API para que você possa determinar programaticamente a função de alguém ou determinar todos os usuários em uma função específica e responder adequadamente.

O gerenciamento de função não é um requisito em ASP.NET associação, nem a associação é um requisito para usar o gerenciamento de funções. No entanto, os dois complementam bem um ao outro e é provável que os desenvolvedores os usem em conjunto um com o outro.

Para habilitar o gerenciamento de função em seu aplicativo, faça a seguinte alteração no arquivo web.config:

<roleManager enabled="true" cacheRolesInCookie="true" cookieProtection="All" />

Quando o atributo cacheRolesInCookie é definido como true, ASP.NET armazena em cache uma associação de função de usuários em um cookie no cliente. Isso permite que pesquisas de função ocorram sem chamadas para o RoleProvider. Ao usar esse atributo, os desenvolvedores são incentivados a garantir que o atributo cookieProtection esteja definido como Todos. (Essa é a configuração padrão.) Isso garante que os dados de cookie sejam criptografados e ajuda a garantir que o conteúdo dos cookies não tenha sido alterado. As funções podem ser adicionadas usando a Ferramenta de Administração de Site. Ele permite que você defina facilmente funções, configure o acesso a partes do site com base nessas funções e atribua usuários a funções.

Captura de tela que mostra uma Ferramenta de Administração de Site do A SP ponto N E T com o botão Adicionar Função.

Figura 6

Conforme mostrado acima, novas funções podem ser adicionadas simplesmente inserindo o nome da função e clicando em Adicionar Função. As funções existentes podem ser gerenciadas ou excluídas clicando no link apropriado na lista de funções existentes.

Ao gerenciar uma função, você pode adicionar ou remover usuários, conforme mostrado abaixo.

Captura de tela que mostra uma Ferramenta de Administração de Site do A SP ponto N E T com o botão Localizar Usuário.

Figura 7

Ao verificar a caixa de seleção Usuário Está na Função, você pode adicionar facilmente um usuário a uma função específica. ASP.NET atualizará automaticamente seu banco de dados de associação com as entradas apropriadas. Você também deseja configurar regras de acesso para seu aplicativo. ASP.NET desenvolvedores 1.x estão familiarizados com isso por meio do <elemento de autorização> no arquivo web.config e essa opção ainda está disponível no ASP.NET 2.0. No entanto, é mais fácil gerenciar regras de acesso usando a Ferramenta de Administração de Site, conforme mostrado abaixo.

Captura de tela que mostra a ferramenta administração de sites do A SP dot N E T com itens selecionados em Usuários e Funções.

Figura 8

Nesse caso, a pasta Administração é realçada (é difícil de ver porque a ferramenta a realça em cinza claro) e a função Administradores recebeu acesso. Todos os outros usuários são negados. Você pode clicar no ícone de cabeçalho para selecionar uma regra e, em seguida, usar os botões Mover para Cima e Mover para Baixo para organizar as regras. Assim como acontece com o elemento de autorização> ASP.NET<, as regras são processadas na ordem em que aparecem. Em outras palavras, se a ordem das regras na captura acima fosse invertida, ninguém teria acesso à pasta Administração porque a primeira regra que ASP.NET encontraria seria a regra que nega a todos à pasta.

ASP.NET 2.0 adiciona um arquivo web.config à pasta para a qual você está especificando uma regra de acesso. As regras de acesso podem ser editadas por meio do arquivo de configuração ou por meio da Ferramenta de Administração de Site. Em outras palavras, a Ferramenta de Administração de Site é simplesmente uma interface por meio da qual o arquivo de configuração pode ser editado em um ambiente amigável.

Usando funções no código

A API para gerenciamento de função não foi alterada desde a versão 1.x. O método IsInRole é usado para determinar se um usuário está em uma função específica.

if (User.IsInRole(Administrators)) {
    btnManageSite.Visible = true;
}

ASP.NET também cria uma instância RolePrincipal como membro do contexto atual. O objeto RolePrincipal pode ser usado para obter todas as funções às quais o usuário pertence da seguinte maneira:

string[] userRoles = ((RolePrincipal)User).GetRoles();

Usando RoleGroups com o controle LoginView

Agora que você tem uma compreensão do gerenciamento de funções e da associação, vamos discutir brevemente como o controle LoginView aproveita essa funcionalidade no ASP.NET 2.0. Conforme discutido anteriormente, o controle LoginView é um controle de modelo que contém dois modelos por padrão; o AnonymousTemplate e o LoggedInTemplate. Na caixa de diálogo Tarefas de LoginView há um link (mostrado abaixo) que permite editar RoleGroups.

Captura de tela que mostra o controle Exibição de Logon na caixa de diálogo Tarefas de Exibição de Logon com uma lista suspensa e Grupo de Funções selecionado.

Figura 9

Cada objeto RoleGroup contém uma matriz de cadeias de caracteres que define a quais funções RoleGroup se aplica. Para adicionar um novo RoleGroup ao controle LoginView, clique no link Editar RoleGroups. Na imagem acima, você pode ver que adicionei um novo RoleGroup para Administradores. Ao selecionar esse RoleGroup (RoleGroup[0]) na lista suspensa Exibições, posso configurar um modelo que só será exibido para membros da função Administradores. Na imagem abaixo, adiciono um novo RoleGroup que se aplica aos membros da função Vendas e à função Distribuição. Isso adiciona um segundo RoleGroup à lista suspensa Exibições na caixa de diálogo Tarefas de LoginView e qualquer coisa adicionada a esse modelo ficará visível por qualquer usuário na função Vendas ou Distribuição.

Captura de tela que mostra uma caixa de diálogo Editor de Coleção de Grupos de Funções com uma lista suspensa selecionando Administradores.

Figura 10

Substituindo o provedor de associação existente

Há algumas maneiras de estender a funcionalidade de associação ASP.NET. Em primeiro lugar, você pode, obviamente, alterar a funcionalidade existente da classe SqlMembershipProvider herdando-a e substituindo seus métodos. Por exemplo, se você quiser implementar sua própria funcionalidade quando os usuários forem criados, você poderá criar sua própria classe que herda de SqlMembershipProvider da seguinte maneira:

public class jForumMembershipProvider : SqlMembershipProvider {
    public jForumMembershipProvider() {

    }
    public override MembershipUser CreateUser(
    string username,
    string password,
    string email,
    string passwordQuestion,
    string passwordAnswer,
    bool isApproved,
    object providerUserKey,
    out MembershipCreateStatus status) {
        // your own implementation
        return base.CreateUser(
        username,
        password,
        email,
        passwordQuestion,
        passwordAnswer,
        isApproved,
        providerUserKey,
        out status);
    }
}

Se, por outro lado, você quiser criar seu próprio provedor (para armazenar suas informações de associação em um banco de dados do Access, por exemplo), poderá criar seu próprio provedor.

Criando seu próprio provedor de associação

Para criar seu próprio provedor de associação, primeiro você precisará criar uma classe herdada da classe MembershipProvider. Se você estiver usando VB.NET, o Visual Studio 2005 adicionará os stubs para todos os métodos que você precisa substituir. Se você estiver usando C#, cabe a você adicionar os stubs.

Você precisará substituir o seguinte:

  • Propriedade ApplicationName
  • Função ChangePassword
  • Função ChangePasswordQuestionAndAnswer
  • Função CreateUser
  • Função DeleteUser
  • Propriedade EnablePasswordReset
  • Propriedade EnablePasswordRetrieval
  • Função FindUsersByEmail
  • Função FindUsersByName
  • Função GetAllUsers
  • Função GetNumberOfUsersOnline
  • Função GetPassword
  • Função GetUser
  • Função GetUserNameByEmail
  • Propriedade MaxInvalidPasswordAttempts
  • Propriedade MinRequiredNonAlphanumericCharacters
  • Propriedade MinRequiredPasswordLength
  • Propriedade PasswordAttemptWindow
  • Propriedade PasswordFormat
  • Propriedade PasswordStrengthRegularExpression
  • Propriedade RequiresQuestionAndAnswer
  • Propriedade RequiresUniqueEmail
  • Função ResetPassword
  • Desbloquear função de usuário
  • Função UpdateUser
  • Função ValidateUser

Isso é uma lista e tanto a ser implementada como um desenvolvedor de C#. Talvez seja mais fácil criar a classe em VB.NET sem nenhuma implementação e, em seguida, usar o Refletor do .NET ou uma ferramenta semelhante para converter o código em C#.

A cadeia de conexão e outras propriedades devem ser definidas como seus padrões no método Initialize. (O método Initialize é acionado quando o provedor é carregado em runtime.) O segundo parâmetro para o método Initialize é do tipo System.Collections.Specialized.NameValueCollection e é uma referência ao <elemento add> associado ao seu provedor personalizado no arquivo web.config. Essa entrada é semelhante à seguinte:

<system.web>
  <authentication mode="Forms"/>
  <membership
  defaultProvider="jForumCustomMembershipProvider" >
    <providers>
      <add name="jForumCustomMembershipProvider"
      type="jForumCustomMembershipProvider"
      requiresQuestionAndAnswer="true"
      connectionString="Provider=Microsoft.Jet.
        OLEDB.4.0;Data Source=C:\jForumCustomMembershipProvider\
        App_Data\Members.mdb;Persist Security
        Info=False"
        />
    </providers>
  </membership>
</system.web>

Aqui está um exemplo do método Initialize.

public override void Initialize(string name,
    System.Collections.Specialized.NameValueCollection config) {

    if (config["requiresQuestionAndAnswer"])
        _requiresQuestionAndAnswer = true;
    _connString = config["connectionString"];
    base.Initialize(name, config);
}

Para validar o usuário quando ele enviar seu formulário de logon, você precisará usar o método ValidateUser. Esse método é acionado quando o usuário clica no botão de logon no controle Logon. Você colocará o código que faz a pesquisa do usuário nesse método.

Como você pode ver, escrever seu próprio provedor de associação não é difícil e permite estender essa funcionalidade poderosa de ASP.NET 2.0.