Compartilhar via


Implementando um Provedor de Associação

Associação do ASP.NET é projetada para permitir que você possa usar facilmente vários provedores de associação diferentes em seus aplicativos ASP.NET.Você pode usar os provedores de associação fornecidos com o .NET Framework, ou você pode implementar seus próprios provedores.

Há dois motivos principais para criar um provedor de associação personalizado.

  • Você precisará armazenar informações de associação em uma fonte de dados que não for suportada pelos provedores de associação incluídos no .NET Framework, como em um banco de dados FoxPro, um banco de dados Oracle, ou outras fontes de dados.

  • Você precisará gerenciar informações de associação usando um esquema de banco de dados que seja diferente do esquema do banco de dados usado pelos provedores fornecidos com o .NET Framework.Um exemplo comum disto refere-se a dados de associação que já existem em um banco de dados do SQL Server para uma empresa ou site.

Classes Necessárias

Para implementar um provedor de associação, crie uma classe que herda da classe abstrata MembershipProvider do namespace System.Web.Security.A classe abstrata MembershipProvider herda da classe abstrata ProviderBase do namespace System.Configuration.Provider, portanto você deve implementar os membros necessários da classe ProviderBase também.As tabelas a seguir listam as propriedades e métodos necessários que devem ser implementadas das classes abstratas ProviderBase e MembershipProvider e uma descrição de cada uma.Para revisar uma implementação de cada membro, consulte o código fornecido em Exemplo de Implementação de Provedor de Associação.

Membros ProviderBase Nescessários

Membro

Descrição

Método Initialize

Leva como entrada o nome do provedor e uma NameValueCollection de definições de configuração.Utilizado para definir valores de propriedade para a instância do provedor incluindo valores específicos de implementação e opções especificadas no arquivo de configuração (Machine.config ou Web.config) fornecido com a configuração.

Membros MembershipProvider Nescessários

Membro

Descrição

Propriedade EnablePasswordReset

Um valor Boolean especificado no arquivo de configuração (Web.config).

A propriedade EnablePasswordReset indica se os usuários podem usar o método ResetPassword para substituir a senha atual por uma nova senha gerada aleatoriamente.

Esta propriedade é somente para leitura.

Propriedade EnablePasswordRetrieval

Um valor Boolean especificado no arquivo de configuração (Web.config).

A propriedade EnablePasswordRetrieval indica se os usuários podem recuperar sua senha usando o método GetPassword.

Esta propriedade é somente para leitura.

Propriedade RequiresQuestionAndAnswer

Um valor Boolean especificado no arquivo de configuração (Web.config).

A propriedade RequiresQuestionAndAnswer indica se os usuários devem fornecer uma resposta de senha para recuperar sua senha usando o método GetPassword ou redefinir sua senha usando o método ResetPassword.

Esta propriedade é somente para leitura.

Propriedade RequiresUniqueEmail

Um valor Boolean especificado no arquivo de configuração (Web.config).

A propriedade RequiresUniqueEmail indica se os usuários devem fornecer um valor de email único ao criar um usuário.Se um usuário já existe na fonte de dados para o ApplicationName atual, então o método CreateUser retornará null (Nothing no Visual Basic) e um valor de status DuplicateEmail.

Esta propriedade é somente para leitura.

Propriedade PasswordFormat

Um valor MembershipPasswordFormat especificado no arquivo de configuração (Web.config).

The PasswordFormat propriedade indica o formato que as senhas são armazenadas no. As senhas podem ser armazenadas em Clear, Encrypted, e Hashed formatos de senha. Clear sistema autônomo senhas são armazenadas em texto sem formatação, o que melhora o desempenho do armazenamento de senhas e recuperação, mas é menos segura, pois sistema autônomo senhas são com com facilidade lidos se sua fonte de dados for comprometida. Encrypted as senhas são criptografadas quando armazenadas e poderão ser descriptografados para comparação de senha ou recuperação de senha. Isso requer processamento adicional para o armazenamento de senha e a recuperação, mas é mais seguro, sistema autônomo senhas não são com com facilidade determinadas se a fonte de dados for comprometida.Hashed as senhas são em hash usando um algoritmo de hash unidirecional e um valor falso gerado aleatoriamente quando armazenados no banco de dados. Quando uma senha é validada, ele é codificada com o valor de salt no banco de dados para verificação.As senhas hash não podem ser recuperadas.

Você pode usar os métodos virtuais EncryptPassword e DecryptPassword da classe MembershipProvider para criptografar e descriptografar valores de senha, ou você podem fornecer seu próprio código de criptografia.Se você usar os métodos virtuais EncryptPassword e DecryptPassword da classe MembershipProvider, senhas Encrypted são criptografadas usando as principais informações fornecidas em machineKey element (esquema configurações ASP.NET) de sua configuração.

Esta propriedade é somente para leitura.

Propriedade MaxInvalidPasswordAttempts

Um valor Integer especificado no arquivo de configuração (Web.config).

O MaxInvalidPasswordAttempts funciona em conjunto com o PasswordAttemptWindow para proteção contra uma fonte indesejada tentando adivinhar a senha ou resposta de senha de uma usuário da associação através de tentativas repetidas.Se o número de senhas inválidas ou senha perguntas fornecidas para um usuário da associação excede a MaxInvalidPasswordAttempts dentro do número de minutos identificado por PasswordAttemptWindow, então o usuário da associação é bloqueado definindo a propriedade IsLockedOut para true até que o usuário esteja desbloqueado usando o método UnlockUser.Se uma senha ou resposta de senha válida for fornecida antes de MaxInvalidPasswordAttempts ser alcançado, o contador que controla o número de tentativas inválidas é redefinido para zero.

Se a propriedade RequiresQuestionAndAnswer é definida como false, tentativas de resposta de senha inválidas não são rastreadas.

Tentativas de senha e de senha de resposta inválidas são controladas nos métodos ValidateUser, ChangePassword, ChangePasswordQuestionAndAnswer, GetPassword e ResetPassword.

Esta propriedade é somente para leitura.

Propriedade PasswordAttemptWindow

Um valor Integer especificado no arquivo de configuração (Web.config).

Para obter uma descrição, consulte a descrição da propriedade MaxInvalidPasswordAttempts.

Esta propriedade é somente para leitura.

Propriedade ApplicationName

O nome do aplicativo que está usando as informações de associação especificadas no arquivo de configuração (Web.config).O ApplicationName é armazenado na fonte de dados com informações do usuário relacionados e usadas quando ocorrem consultas a essas informações.Consulte a seção em ApplicationName neste tópico para obter mais informações.

Esta propriedade é leitura/gravação e o padrões é a ApplicationPath se não for especificada explicitamente.

Método CreateUser

Obtém, como entrada, o nome de um novo usuário, uma senha, e um endereço de email e insere um novo usuário para o aplicativo na fonte de dados.O método CreateUser retorna um objeto MembershipUser preenchido com as informações para o usuário recém-criado.O método CreateUser também define um parâmetro out (em Visual Basic, você pode usar ByRef) que retorna um valor MembershipCreateStatus que indica se o usuário foi criado com êxito, ou um motivo pelo qual o usuário não foi criado com êxito.

O método CreateUser gera o evento ValidatingPassword, se um MembershipValidatePasswordEventHandler tiver sido especificado e continua ou cancela a ação criar-usuário com base nos resultados do evento.Você pode usar o método virtual OnValidatingPassword para executar o MembershipValidatePasswordEventHandler especificado.

Método UpdateUser

Leva, como entrada, um objeto MembershipUser preenchida com informações do usuário e atualiza o fonte de dados com os valores fornecidos.

Método DeleteUser

Utiliza, como entrada, o nome de um usuário e exclui as informações do usuário da fonte de dados.O método DeleteUser retorna true se o usuário foi excluído com êxito; caso contrário, false.Um parâmetro Boolean adicional é incluído para indicar se informações relacionadas ao usuário, como função ou informações do perfil também serão excluídos.

Método ValidateUser

Aceita, como entrada, um nome de usuário e uma senha e verifica se os valores coincidem com aqueles da fonte de dados.O método ValidateUser retorna true para um nome de usuário e a senha correspondente bem-sucedidos; caso contrário, false.

Método GetUser

Leva, como entrada, um identificador de usuário exclusivo e um valor Boolean indicando se deseja atualizar o valor LastActivityDate para o usuário, para mostrar que o usuário está online no momento.O método GetUser retorna um objeto MembershipUser preenchido com valores atuais da fonte de dados para o usuário especificado.Se o nome de usuário não for encontrado na fonte de dados, o método GetUser retornará null (Nothing no Visual Basic).

Método GetUser

Leva, como entrada, um nome de usuário e um valor Boolean indicando se deseja atualizar o valor LastActivityDate para o usuário, para mostrar que o usuário está online no momento.O método GetUser retorna um objeto MembershipUser preenchido com valores atuais da fonte de dados para o usuário especificado.Se o nome de usuário não for encontrado na fonte de dados, o método GetUser retornará null (Nothing no Visual Basic).

Método GetAllUsers

Retorna um MembershipUserCollection preenchido com objetos MembershipUser de todos os usuários da fonte de dados.

Os resultados retornados por GetAllUsers são restritos pelos parâmetros pageIndex e pageSize.O parâmetro pageSize identifica o número máximo de objetos MembershipUser para retornar na MembershipUserCollection.O parâmetro pageIndex identifica qual página de resultados a retornar, onde 1 identifica a primeira página.O parâmetro totalRecords é um parametro out que é definido para o número total de usuários da associação.Por exemplo, se 13 usuários estivessem no banco de dados para o aplicativo e o pageIndex valor fosse 2 com um pageSize de 5, o MembershipUserCollection retornado conteria o sexto até o décimo usuários retornado. totalRecords seria conjunto 13.

Método GetNumberOfUsersOnline

Retorna um valor inteiro que é a contagem de todos os usuários da fonte de dados em que o LastActivityDate é maior que a data e hora atuais menos a propriedade UserIsOnlineTimeWindow.A propriedade UserIsOnlineTimeWindow é um valor inteiro especificando o número de minutos para usar ao determinar se um usuário está online.

Método ResetPassword

Aceita, como entrada, um nome de usuário e uma resposta de senha e gera uma nova e aleatória senha para o usuário especificado.O método ResetPassword atualiza as informações do usuário na fonte de dados com o novo valor de senha e retorna a nova senha como um string.Um mecanismo conveniente para gerar uma senha aleatória é o método GeneratePassword da classe Membership.

O método ResetPassword verifica se a propriedade EnablePasswordReset é definida como true antes de executar qualquer ação.Se a propriedade EnablePasswordReset é false, uma NotSupportedException será apresentada.O método ResetPassword também verifica o valor da propriedade RequiresQuestionAndAnswer.Se a propriedade RequiresQuestionAndAnswer é true, o método ResetPassword verifica o valor do parâmetro de resposta fornecido em relação a resposta de senha armazenada na fonte de dados.Se eles não coincidirem, uma MembershipPasswordException será apresentada.

O método ResetPassword gera o evento ValidatingPassword, se um MembershipValidatePasswordEventHandler tiver sido especificado, para validar a senha recém-gerada e continua ou cancela a ação redefinição-senha com base nos resultados do evento.Você pode usar o método virtual OnValidatingPassword para executar o MembershipValidatePasswordEventHandler especificado.

Método GetPassword

Aceita, como entrada, um nome de usuário e uma resposta de senha e recupera a senha para esse usuário a partir da fonte de dados e retorna a senha como uma string.

O método GetPassword verifica se a propriedade EnablePasswordRetrieval é definida como true antes de executar qualquer ação.Se a propriedade EnablePasswordRetrieval é false, uma ProviderException será apresentada.

O método GetPassword também verifica o valor da propriedade RequiresQuestionAndAnswer.Se a propriedade RequiresQuestionAndAnswer é true, o método GetPassword verifica o valor do parâmetro de resposta fornecido em relação a resposta de senha armazenada na fonte de dados.Se eles não coincidirem, uma MembershipPasswordException será apresentada.

Método GetUserNameByEmail

Aceita, como entrada, um endereço de email e retorna o primeiro nome de usuário da fonte de dados, na qual o endereço de email corresponde ao valor do parâmetro email fornecido.

Se nenhum nome de usuário com um endereço de email correspondente for localizado , uma sequência de caracteres vazia é retornada.

Se vários nomes de usuários forem encontrados que correspondam a um endereço de e-mail específico, somente o primeiro nome usuário encontrado será retornado.

Método ChangePassword

Utiliza, como entrada, um nome de usuário, uma senha atual, e uma nova senha, e atualiza a senha na fonte de dados se o nome do usuário e da senha atual fornecidos forem válidos.O método ChangePassword retorna true se a senha foi atualizada com êxito; caso contrário, false.

O método ChangePassword gera o evento ValidatingPassword, se um MembershipValidatePasswordEventHandler tiver sido especificado e continua ou cancela a ação alterar-senha com base nos resultados do evento.Você pode usar o método virtual OnValidatingPassword para executar o MembershipValidatePasswordEventHandler especificado.

Método ChangePasswordQuestionAndAnswer

Obtém, como entrada, um nome de usuário, uma senha,uma pergunta de senha, e uma resposta de senha, e atualiza as perguntas e respostas de senha na fonte de dados se o nome de usuário e senha fornecidos forem válidos.O método ChangePasswordQuestionAndAnswer retorna true se a pergunta e resposta de senha são atualizados com êxito; caso contrário, false.

Se o nome de usuário fornecido e senha não são válidos, false será retornado.

Método FindUsersByName

Retorna uma lista de usuários de associação onde o nome de usuário contém uma correspondência ao usernameToMatch fornecido para o ApplicationName configurado.Por exemplo, se o parâmetro usernameToMatch é definido como "usuário", em seguida, os usuários "usuário1", "usuário2", "usuário3", e assim por diante são retornados.Por exemplo, se o parâmetroemailToMatch for definido como " Address@example.com ", os usuários com o endereço de email " address1@example.com, " " address2@example.com ", e assim por diante são retornados.O suporte ao caractere curinga é incluído com base na fonte de dados.Os usuários são retornados em ordem alfabética por nome de usuário.

Os resultados retornados por FindUsersByName são restritos pelos parâmetros pageIndex e pageSize.O parâmetro pageSize identifica o número máximo de objetos MembershipUser para retornar na MembershipUserCollection.O parâmetro pageIndex identifica qual página de resultados a retornar, onde 1 identifica a primeira página.O parâmetro totalRecords é um parametro out que é definido para o número total de usuários da associação que correspondem ao valor usernameToMatch.Por exemplo, se 13 usuários foram encontrados onde usernameToMatch correspondência parte ou o nome de usuário inteira e o pageIndex valor era 2 com um pageSize de 5, o MembershipUserCollection contém o sexto até o décimo usuários retornado. totalRecords seria conjunto 13.

Método FindUsersByEmail

Retorna uma lista de usuários de associação onde o nome de usuário contém uma correspondência ao emailToMatch fornecido para o ApplicationName configurado.Por exemplo, se o parâmetro emailToMatch for definido para "Address@example.com", então os usuários com endereços de email "address1@example.com," "address2@example.com" e assim por diante serão retornados.Por exemplo, se o parâmetroemailToMatch for definido como " Address@example.com ", os usuários com o endereço de email " address1@example.com, " " address2@example.com ", e assim por diante são retornados.O suporte ao caractere curinga é incluído com base na fonte de dados.Os usuários são retornados em ordem alfabética por nome de usuário.

Os resultados retornados por FindUsersByEmail são restritos pelos parâmetros pageIndex e pageSize.O parâmetro pageSize identifica o número de objetos MembershipUser para retornar na coleção MembershipUserCollection.O parâmetro pageIndex identifica qual página de resultados a retornar, onde 1 identifica a primeira página.O parâmetro totalRecords é um parametro out que é definido para o número total de usuários da associação que correspondem ao valor emailToMatch.Por exemplo, se 13 usuários foram encontrados onde emailToMatch correspondência parte ou o nome de usuário inteira e o pageIndex valor era 2 com um pageSize de 5, o MembershipUserCollection contém o sexto até o décimo usuários retornado. totalRecords seria conjunto 13.

Método UnlockUser

Aceita, como entrada, um nome de usuário e atualiza o campo da fonte de dados que armazena a propriedade IsLockedOut para false.O método UnlockUser retorna true se o registro para o usuário da associação é atualizado com êxito; caso contrário, false.

Nome do Aplicativo

Provedores de associação armazenam informações de usuários exclusivamente para cada aplicativo.Isso permite que vários aplicativos ASP.NET usem a mesma fonte de dados sem entrar em conflito se forem criados nomes de usuários duplicados.Como alternativa, vários aplicativos ASP.NET podem usar o mesma fonte de dados de usuários, especificando o mesmo ApplicationName.

Como provedores de associação armazenam informações de usuários exclusivamente para cada aplicativo,você precisará garantir que o seu esquema de dados inclua o nome do aplicativo e que consultas e atualizações também incluam o nome do aplicativo.Por exemplo, o comando a seguir é usado para recuperar um nome de usuário de um banco de dados, com base no email e garante que o ApplicationName esteja incluído na consulta.

SELECT Username FROM MyUserTable 
  WHERE Email = 'someone@example.com' AND ApplicationName = 'MyApplication'

Membros Personalizados

Talvez você precise estender as interfaces do provedor de associação com funcionalidade adicional não fornecida pelas classes abstratas ProviderBase e MembershipProvider.Qualquer membro público que você adicionar ao seu provedor de associação poderá ser acessado usando a propriedade Provider ou Providers da classe Membership.

Um exemplo desse poderia ser um método LockUser que define a propriedade IsLockedOut como true.O exemplo a seguir mostra como invocar a propriedade Provider, que expõe o provedor de associação padrão para um aplicativo, como um tipo provedor-personalizado para chamar o método personalizado LockUser.

Dim p As MyCustomProvider = CType(Membership.Provider, MyCustomProvider)
p.LockUser(username)
MyCustomProvider p = (MyCustomProvider)Membership.Provider;
p.LockUser(username);

Acesso thread-safe

Para cada provedor de associação especificado na configuração de um aplicativo, o ASP.NET instancia uma única instância do provedor de associação que é usada para todas as solicitações servidas por um objeto HttpApplication.Como resultado, você pode ter várias solicitações em execução simultaneamente.O ASP.NET não garante a segurança de segmentos das chamadas para o seu provedor.Você precisará escrever seu código de provedor para segurança de segmento.Por exemplo, criar uma conexão com um banco de dados ou abrir um arquivo para edição deve ser feita dentro do membro que é chamado, como CreateUser,em vez de abrir um arquivo ou conexão de banco de dados quando o método Initialize é chamado.

Consulte também

Conceitos

Exemplo de Implementação de Provedor de Associação

Tornando navegação em sites do ASP.NET seguro

Referência

ValidatePasswordEventArgs

OnValidatingPassword

Outros recursos

Gerenciando usuários usando Associação

Protegendo sites da Web ASP.NET