Résumé : Le composant Membership d'asp.net 2.0 fournit un ensemble d'interfaces très simples et faciles à utiliser permettant aux développeurs d'effectuer la gestion et la vérification des utilisateurs. Cet article analysera brièvement son principe de mise en œuvre, présentera comment l'utiliser correctement et comment l'étendre.
1. Classe abstraite MembershipProvider
Dans de nombreux cas, nous n'utilisons pas cette classe directement lors de l'utilisation de Membership. La classe MembershipProvider définit certaines méthodes abstraites et attributs abstraits. Ce sont ces méthodes et attributs qui constituent les spécifications de base de l'interface Membership, et les fonctions d'utilisation de Membership dans le framework .NET sont toutes appelées via ce type. Les classes héritées fournissent des fonctions de gestion des utilisateurs dans différents environnements en implémentant ces interfaces et n'ont aucun impact sur le framework Membership lui-même. Jetons un coup d'œil à la définition du prototype de MembershipProvider :
classe abstraite publique MembershipProvider : ProviderBase
...{
// Événements
événement public MembershipValidatePasswordEventHandler ValidatingPassword;
// Méthodes
protégées MembershipProvider();
public abstract bool ChangePassword(string username, string oldPassword,
string public
abstract bool ChangePasswordQuestionAndAnswer(string username, string userQuestion, string newPasswordAnswer);
mot de passe, chaîne email, chaîne passwordQuestion, chaîne passwordAnswer, bool isApproved, objet supplierUserKey, out MembershipCreateStatus status);
octet
virtuel
protégé[] DecryptPassword(byte[] encodedPassword);
(string pass, int passwordFormat, string salt);
octet virtuel protégé [] EncryptPassword (byte [] password);
public abstract MembershipUserCollection FindUsersByName (string usernameToMatch
);
, int pageIndex, int pageSize, out int totalRecords);
chaîne interne GenerateSalt();
public abstract MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int
public
abstract int GetNumberOfUsersOnline();
réponse);
public abstrait MembershipUser GetUser (object supplierUserKey, bool
public abstract MembershipUser GetUser (string userIsOnline);
internal MembershipUser (string userIsOnline, bool throwOnError)
;
void virtuel protégé OnValidatingPassword (ValidatePasswordEventArgs e);
chaîne abstraite publique ResetPassword (nom d'utilisateur de chaîne, réponse de chaîne)
; chaîneinterne UnEncodePassword
(passe de chaîne, int passwordFormat)
;
public abstract bool ValidateUser (nom d'utilisateur de chaîne, mot de passe de chaîne) ;
// Propriétés
public abstract string ApplicationName ...{ get; set; }
public abstract bool EnablePasswordReset ...{ get; }
public abstract bool EnablePasswordRetrieval ...{ get; }
public abstract int MaxInvalidPasswordAttempts ...{ get }
public
;abstract int MinRequiredNonAlphanumericCharacters ...{ get; }
public abstract int MinRequiredPasswordLength ...{ get; }
public abstract int PasswordAttemptWindow ...{ get
; } public abstract MembershipPasswordFormat PasswordFormat ...{ get }
public abstract string PasswordStrengthRegularExpression ... { get; }
public abstract bool RequiresQuestionAndAnswer ...{ get; }
public abstract bool RequiresUniqueEmail ...{ get }
// Champs
privés MembershipValidatePasswordEventHandler _EventHandler ;
private const int SALT_SIZE_IN_BYTES = 0x10
;
Le modificateur interne regroupe plusieurs méthodes qui sont des méthodes auxiliaires pour les mots de passe, utilisées pour crypter, déchiffrer et vérifier les mots de passe. Mais il semble y avoir quelques problèmes de conception ici. Il semble un peu inapproprié de définir ces méthodes comme portée interne. Ces méthodes sont définies dans la classe de base afin qu'elles puissent être réutilisées, mais du point de vue des effets, c'est le cas. ce n'est pas le cas, car les membres internes ne peuvent être utilisés qu'au sein de cette assemblée (dans des circonstances normales, d'autres méthodes telles que la réflexion ne sont pas incluses), ce qui signifie que notre propre MembershipProvider étendu ne peut pas utiliser ces méthodes. Et à en juger par le champ d'application actuel, ces méthodes ne sont actuellement utilisées que dans SqlMembershipProvider, je pense donc que ces modificateurs de méthode devraient être remplacés par protégés.
2. Classe statique d'adhésion
Comme mentionné ci-dessus, dans des circonstances normales, nous n'utiliserons pas directement l'abstraction MembershipProvider, car elle implique le problème de l'instanciation de la véritable classe de service Membership, et implique généralement la configuration et l'instanciation des objets. des questions difficiles, et pour les débutants, elles ne sont pas faciles à maîtriser. Dans le framework .NET, cette couche de relations complexes est protégée par l'appartenance à une classe statique (Classe statique). En plus d'empêcher les utilisateurs de lire les fichiers de configuration, les objets initiaux et d'autres tâches de base, l'adhésion (classe statique) joue également un rôle important dans le rechargement de tous les MembershipProviders, il existe donc des API afin de faciliter l'utilisation des utilisateurs. (Static Class) recharge également ces méthodes Loaded en tant que méthode statique et fournit des implémentations surchargées plus riches basées sur l'API de base de MembershipProvider que les utilisateurs peuvent appeler. Cela prend directement en charge qu'il s'agisse de la couche d'interface utilisateur ou d'autres projets, reportez-vous simplement à l'espace de noms System.Web.Security et vous pourrez profiter des diverses commodités fournies par l'adhésion sans vous soucier des détails. Jetons un coup d'œil à la définition du prototype d'adhésion (classe statique) : (Utilisez le réflecteur .NET de Lutz Roder pour afficher toutes ses implémentations.)
public static class Membership
...{
// Événements
public static event MembershipValidatePasswordEventHandler ValidatingPassword;
// Méthodes
static Membership ();
public static MembershipUser CreateUser (string username, string password);
public static MembershipUser
CreateUser (string username, string password, string public static MembershipUser CreateUser) passwordQuestion, chaîne passwordAnswer, bool isApproved, out MembershipCreateStatus status
)
;
public static bool DeleteUser (stringusername
, bool deleteAllRelatedData);
public static MembershipUserCollectionFindUsersByEmail (string emailToMatch
);
public static MembershipUserCollection FindUsersByName (string usernameToMatch
;);
,
out int totalRecords);chaîne statique privée GetCurrentUserName();
public static int GetNumberOfUsersOnline();
public static MembershipUser()
; public static MembershipUser(bool
public
static MembershipUser(object supplierUserKey);
GetUser (string username);
public static MembershipUser (object supplierUserKey, bool userIsOnline);
public static MembershipUser (string userIsOnline, bool
public
static
string GetUserNameByEmail (string emailToMatch);
(utilisateur MembershipUser);
public static bool ValidateUser (nom d'utilisateur de chaîne, mot de passe de chaîne);
// Propriétés
public static string ApplicationName ...{ get; set; }
public static bool EnablePasswordReset ...{ get; }
public static bool EnablePasswordRetrieval ...{ get; }
public static string HashAlgorithmType ...{ get }
internal
;static bool IsHashAlgorithmFromMembershipConfig ...{ get; }
public static int MaxInvalidPasswordAttempts ...{ get; }
publicstatic int MinRequiredNonAlphanumericCharacters ...{ get; }
public static int MinRequiredPasswordLength ...{ get }
public static int PasswordAttemptWindow ... { get; }
public static string PasswordStrengthRegularExpression ...{ get; }
public static MembershipProvider Provider ...{ get; }
public static MembershipProviderCollection Providers ...{ get; }
public static bool RequiresQuestionAndAnswer ...{ get }
public static int UserIsOnlineTimeWindow ... { obtenir }
// Champs
private static char[] ponctuations;
private static bool s_HashAlgorithmFromConfig;
private
static
bool s_Initialized
;private
static Exception s_InitializeException;
sOnlineTimeWindow
;
}
Cela dit, je dois dire quelques mots. En examinant le code d'implémentation de l'adhésion (classe statique), vous pouvez constater que chaque surcharge de l'API Membersip finit par appeler la méthode du fournisseur d'attribut. Le type de cet attribut est le type MembershipProvider. peut comprendre Comprenons le rôle important de MembershipProvider. Il existe également un attribut Fournisseurs, qui permet d'obtenir toutes les classes de service d'adhésion configurées dans web.config. Ce sont toutes des propriétés statiques, mais comment sont-elles instanciées ? En appelant la méthode Membership.Initialize(), à chaque appel de ces deux propriétés, cette méthode sera appelée pour déterminer si la classe de service fournie par Membership a été initialisée. Sinon, la classe de service de configuration sera appelée pour lire la configuration. . contenu à initialiser. À ce stade, il ne vous sera peut-être pas difficile de comprendre pourquoi il est si simple à utiliser pour nous !
3. Introduction et configuration de l'utilisation de SqlMembershipProvider
OK Grâce à l'introduction ci-dessus, vous devriez être en mesure de comprendre fondamentalement la structure globale de l'adhésion, n'est-ce pas ? (Si vous ne l'avez pas encore fait, il se peut que vous n'ayez pas ouvert le .NET Reflector de Lutz Roder pour analyser son code d'implémentation, ou que vous n'ayez pas encore compris le rôle des classes abstraites). Quoi qu’il en soit, notre objectif ultime est d’apprendre à l’utiliser.
Avant cela, je souhaite d'abord présenter les deux classes d'implémentation de MembershipProvider fournies dans le framework .NET : ActiveDirectoryMembershipProvider et SqlMembershipProvider (Comment connaissez-vous ces deux classes ? Vous pouvez voir toutes les classes héritées dans les types dérivés de MembershipProvider.) La première fournit aux utilisateurs de base gestion sous Active Directory (je ne l'ai pas pratiqué), et cette dernière est l'implémentation de gestion des utilisateurs basée sur SqlServer que nous utilisons le plus souvent.
Il est temps de présenter comment l'utiliser. En fait, il existe déjà des articles à ce sujet dans le jardin ((Traduction) Comment utiliser l'adhésion dans ASP.NET 2.0), donc je ne perdrai plus de mots. Mais ici, je veux vous expliquer la manière la plus directe de l'apprendre et de l'utiliser comme référence. Recherchez et ouvrez machine.config sur le disque système, recherchez le nœud AspNetSqlMembershipProvider et voyez si vous pouvez le voir. En fait, il s'agit de la configuration d'adhésion la plus basique, mais il lui manque la spécification de l'attribut defaultProvider. vous pouvez utiliser le contrôle de connexion, il n'est pas nécessaire d'utiliser de code pour la vérification de la connexion de l'utilisateur. Si vous n'y croyez pas, vous pouvez l'essayer. (En ce qui concerne la vérification des formulaires, je ne la présenterai pas ici. Vous pouvez vous référer aux informations pertinentes. Pour plus d'informations sur SqlMembershipProvider, veuillez vous référer à MSDN).
4. Comment personnaliser MembershipProvider, d'autres ressources MembershipProvider existantes
Alors, comment personnaliser un MembershipProvider ? En fait, si vous comprenez déjà la structure des adhésions, je pense que ce n'est pas difficile pour vous, cependant, étant donné qu'écrire un MembershipProvider complet représente encore une certaine quantité de travail et de difficulté. Pour nous, davantage d'emplacements pourraient être nécessaires pour étendre le fournisseur existant, tel que SqlMembershipProvider. En fait, c'est très simple. Il suffit d'hériter de SqlMembershipProvider (vous dites tranquillement que ce qui est enregistré dans le paramètre de configuration de la méthode Initialize est le nom de l'attribut et la valeur de la section de configuration correspondante du fournisseur), puis d'étendre et réécrivez les méthodes requises. Lorsque vous l'utilisez, dans la section Configuration du fournisseur, remplacez la valeur de type par le nom de votre classe et tout ira bien.
Enfin, il existe déjà de nombreux MembershipProviders dans différents environnements sur le marché, comme mysql, Oracle, etc. Voici l'implémentation de Mysql : http://www.codeproject.com/aspnet/mysqlmembershipprovider.asp Il existe d'autres implémentations différentes, je pense que vous pouvez trouver plus d'aide auprès de Google.
D'accord, j'en ai trop dit. J'espère que cela pourra être utile à vous qui avez pris la peine de lire ce blog. Merci ^_*.