Resumo: O componente Membership do asp.net 2.0 fornece um conjunto de interfaces muito simples e fáceis de usar para que os desenvolvedores realizem o gerenciamento e a verificação de usuários. Este artigo analisará brevemente seu princípio de implementação, apresentará como usá-lo corretamente e como estendê-lo.
1. Classe abstrata MembershipProvider
Em muitos casos, não usamos essa classe diretamente ao usar Membership. A classe MembershipProvider define alguns métodos abstratos e atributos abstratos. São esses métodos e atributos que constituem as especificações básicas da interface Membership, e as funções de uso de Membership dentro da estrutura .NET são todas chamadas por meio desse tipo. As classes herdadas fornecem funções de gerenciamento de usuários em diferentes ambientes, implementando essas interfaces, e não têm impacto na estrutura Membership em si. Vamos dar uma olhada na definição do protótipo de MembershipProvider:
classe abstrata pública MembershipProvider : ProviderBase
...{
// Eventos
public event MembershipValidatePasswordEventHandler ValidatingPassword;
// Métodos
protegidos MembershipProvider();
public abstract bool ChangePassword(string nome de usuário, string oldPassword
, string newPassword)
; senha, string email, string passwordQuestion, string passwordAnswer, bool isApproved, objeto providerUserKey, out MembershipCreateStatus status);
byte virtualprotegido
[] DecryptPassword (byte [] encodedPassword)
; (string pass, int passwordFormat, string salt);
byte
virtual protegido [] EncryptPassword (byte [] senha)
; , int pageIndex, int pageSize, out int totalRecords);
string interna GenerateSalt();
public
abstract
MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords);
resposta);
public
abstract MembershipUser GetUser (objeto ProvideUserKey, bool userIsOnline
)
;
void virtual protegido OnValidatingPassword (ValidatePasswordEventArgs e);
string abstrata pública ResetPassword (string nome de usuário,
string interna UnEncodePassword (string pass, int
public abstract bool UnlockUser) (string
public abstract void UpdateUser (usuário MembershipUser);
public abstract bool ValidateUser(string nome de usuário, string senha);
// Propriedades
public
abstract string ApplicationName ...{ get set;
public abstract bool EnablePasswordReset ...{ get;
public abstract bool EnablePasswordRetrieval ...{ get
;
abstract int MinRequiredNonAlphanumericCharacters ...{ get;
public abstract int MinRequiredPasswordLength ...{ get;
public
abstract int PasswordAttemptWindow ...{ get
;
{ get; }
public abstract bool RequiresQuestionAndAnswer ...{ get
;
// Campos
private
MembershipValidatePasswordEventHandler _EventHandler
;
O modificador interno são vários métodos que são métodos auxiliares para senhas, usados para criptografar, descriptografar e verificar senhas. Mas parece haver alguns problemas com o design aqui. Parece um pouco inapropriado definir esses métodos como escopo interno. Esses métodos são definidos na classe base para que possam ser reutilizados, mas do ponto de vista do efeito, isso é. não é o caso, porque os membros internos só podem ser usados nesta montagem (em circunstâncias normais, outros métodos, como reflexão, não estão incluídos), o que significa que nosso próprio MembershipProvider estendido não pode usar esses métodos. E a julgar pelo escopo atual de aplicação, esses métodos são usados atualmente apenas em SqlMembershipProvider, então acho que esses modificadores de método devem ser alterados para protegidos.
2. Classe estática Membership
Como mencionado acima, em circunstâncias normais não usaremos diretamente a abstração MembershipProvider, porque ela envolve o problema de como instanciar a classe de serviço Membership real e geralmente envolve a configuração e instanciação de objetos. questões difíceis e, para iniciantes, não são fáceis de dominar. Na estrutura .NET, essa camada de relacionamentos complexos é protegida por meio da classe estática Membership (Static Class). Além de proteger os usuários da leitura de arquivos de configuração, objetos iniciais e outras tarefas básicas, Membership (classe estática) também desempenha um papel importante no recarregamento de todos os MembershipProviders, portanto, existem APIs para tornar o uso mais conveniente para os usuários, Membership. (Classe Estática) também recarrega esses métodos Loaded como um método estático e fornece implementações sobrecarregadas mais ricas com base na API básica de MembershipProvider para os usuários chamarem. Isso oferece suporte direto, seja na camada UI ou em outros projetos, basta consultar o namespace System.Web.Security e você poderá aproveitar as diversas conveniências fornecidas pela associação sem se preocupar com detalhes. Vamos dar uma olhada na definição do protótipo de Membership (classe estática): (Use o .NET Reflector de Lutz Roder para visualizar todas as suas implementações.)
public static class Membership
...{
// Eventos
public static event MembershipValidatePasswordEventHandler ValidatingPassword;
// Métodos
static Membership();
public static MembershipUser CreateUser(string nome de usuário, string senha);
public static MembershipUser CreateUser(string nome de usuário, string senha, string email
);
passwordQuestion, string passwordAnswer, bool isApproved, out MembershipCreateStatus status);
public static MembershipUser CreateUser (string nome de usuário, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, objeto providerUserKey, out MembershipCreateStatus status
public static bool DeleteUser (string
); public static bool DeleteUser (stringnome de usuário
, bool deleteAllRelatedData);
public static MembershipUserCollection FindUsersByEmail (string
emailToMatch
);
public static MembershipUserCollectionFindUsersByEmail (string emailToMatch, int pageIndex, int pageSize, out int totalRecords);
,
out int totalRecords);string estática privada GetCurrentUserName();
public
static int GetNumberOfUsersOnline
(
)
;
GetUser
(string nome de usuário);
public staticMembershipUser
GetUser
(objeto provedorUserKey, bool userIsOnline)
;
(usuário MembershipUser);
public static bool ValidateUser (string nome de usuário, string senha);
// Propriedades
public static string ApplicationName ...{ get set;
public static bool EnablePasswordReset ...{ get;
public static bool EnablePasswordRetrieval ...{ get }
public
static string HashAlgorithmType ...{ get;
static bool IsHashAlgorithmFromMembershipConfig ...{ get }
public static int MaxInvalidPasswordAttempts ...{ get }
public
static
int PasswordAttemptWindow ... { get; }
public
static string PasswordStrengthRegularExpression ...{ get;
public static MembershipProvider Provider ...{ get;
public staticMembershipProviderCollection
Providers ...{ get;
int UserIsOnlineTimeWindow...{obter}
// Campos
private static char[] pontuações;
private static bool s_HashAlgorithmFromConfig;
private
static
string s_HashAlgorithmType
; privatestatic
bool s_Initialized
;
linhaTimeWindow;
}
Dito isto, devo dizer algumas palavras. No processo de análise do código de implementação de Membership (classe estática), você pode descobrir que toda sobrecarga da API Membersip acaba chamando o método do atributo Provider. O tipo deste atributo é o tipo MembershipProvider. pode entender Vamos entender o importante papel do MembershipProvider. Existe também um atributo Providers, que serve para obter todas as classes de serviço de Membership configuradas no web.config. Todas são propriedades estáticas, mas como são instanciadas? Ao chamar o método Membership.Initialize(), toda vez que essas duas propriedades forem chamadas, este método será chamado para determinar se a classe de serviço fornecida por Membership foi inicializada. Caso contrário, a classe de serviço de configuração será chamada para ler a configuração. .conteúdo para inicializar. Neste ponto, pode não ser difícil para você entender por que é tão fácil de usar!
3. Introdução e configuração de uso do SqlMembershipProvider
OK Através da introdução acima, você deve ser capaz de entender basicamente a estrutura geral da associação, certo? (Se ainda não o fez, pode ser que você não tenha aberto o .NET Reflector de Lutz Roder para analisar seu código de implementação ou ainda não tenha entendido o papel das classes abstratas). Não importa o que aconteça, nosso objetivo final é aprender como usá-lo.
Antes disso, primeiro quero apresentar as duas classes de implementação MembershipProvider fornecidas no .NET framework: ActiveDirectoryMembershipProvider e SqlMembershipProvider (Como você conhece essas duas classes? Você pode ver todas as classes herdadas em Tipos derivados de MembershipProvider.) O primeiro fornece usuário básico gerenciamento no Active Directory (não pratiquei), e o último é a implementação de gerenciamento de usuários baseada no SqlServer que usamos com mais frequência.
É hora de apresentar como usá-lo. Na verdade, já existem artigos sobre isso no jardim ((Tradução) Como usar Membership no ASP.NET 2.0), então não vou perder mais palavras. Mas aqui quero lhe contar a maneira mais direta de aprender e usá-lo como referência. Encontre e abra machine.config no disco do sistema, encontre o nó AspNetSqlMembershipProvider e veja se você consegue vê-lo. Na verdade, esta é a configuração de associação mais básica, mas falta a especificação do atributo defaultProvider. você pode usar o controle de login, não há necessidade de usar nenhum código para verificação de login do usuário. Se você não acredita, você pode tentar. (Quanto à verificação de formulários, não vou apresentá-la aqui. Você pode consultar informações relevantes. Para obter mais informações sobre SqlMembershipProvider, consulte MSDN).
4. Como personalizar MembershipProvider, outros recursos existentes de MembershipProvider
Então, como personalizamos um MembershipProvider? Na verdade, se você já entende a estrutura do Membership, acredito que não seja difícil para você, porém, considerando que ainda é um certo trabalho e dificuldade escrever um MembershipProvider completo. Para nós, mais lugares podem ser para estender o provedor existente, como SqlMembershipProvider. Na verdade, isso é muito simples. Só precisamos herdar de SqlMembershipProvider (diga-lhe calmamente, o que é salvo no parâmetro de configuração do método Initialize é o nome do atributo e o valor da seção de configuração correspondente do Provedor) e, em seguida, estender e reescreva os métodos necessários. Ao usá-lo, na seção Configuração do provedor, altere o valor do tipo para o nome da sua classe e tudo ficará bem.
Por fim, já existem muitos MembershipProviders em diversos ambientes no mercado, como mysql, Oracle, etc. Aqui está a implementação do Mysql: http://www.codeproject.com/aspnet/mysqlmembershipprovider.asp Existem mais implementações diferentes. Acredito que você possa encontrar mais ajuda do Google.
Ok, já falei demais. Espero que possa ser útil para você que se deu ao trabalho de ler este blog. Obrigado ^_*.