Implémentation d'un fournisseur d'appartenances

Mise à jour : novembre 2007

L'appartenance (membership) d'ASP.NET est conçue pour vous permettre d'utiliser facilement plusieurs fournisseurs d'appartenances différents pour vos applications ASP.NET. Vous pouvez utiliser les fournisseurs d'appartenances qui sont inclus avec le .NET Framework, ou vous pouvez implémenter vos propres fournisseurs.

Il y a deux raisons principales pour créer un fournisseur d'appartenances personnalisé.

  • Vous devez stocker des informations d'appartenance dans une source de données qui n'est pas prise en charge par les fournisseurs d'appartenances inclus avec le .NET Framework, tel qu'une base de données FoxPro, une base de données Oracle ou d'autres sources de données.

  • Vous devez gérer des informations d'appartenance à l'aide d'un schéma de base de données qui est différent du schéma utilisé par les fournisseurs inclus avec le .NET Framework. Par exemple, il est courant que des données d'appartenance existent déjà dans une base de données SQL Server pour une société ou un site Web.

Classes requises

Pour implémenter un fournisseur d'appartenances, vous créez une classe qui hérite de la classe abstraite MembershipProvider de l'espace de noms System.Web.Security. Étant donné que la classe abstraite MembershipProvider hérite de la classe abstraite ProviderBase de l'espace de noms System.Configuration.Provider, vous devez implémenter aussi les membres requis de la classe ProviderBase. Les tableaux suivants répertorient et décrivent les propriétés et méthodes que vous devez implémenter depuis les classes abstraites ProviderBase et MembershipProvider. Pour examiner une implémentation de chaque membre, consultez le code fourni pour la rubrique Exemple d'implémentation d'un fournisseur d'appartenances.

Membres ProviderBase obligatoires

Membre

Description

Méthode Initialize

Prend en entrée le nom du fournisseur et un contrôle NameValueCollection des paramètres de configuration. Permet de définir des valeurs de propriété pour l'instance de fournisseur, y compris des valeurs propres à l'implémentation et des options spécifiées dans le fichier de configuration (Machine.config ou Web.config) fourni dans la configuration.

Membres MembershipProvider obligatoires

Membre

Description

Propriété EnablePasswordReset

Valeur Boolean spécifiée dans le fichier de configuration (Web.config).

La propriété EnablePasswordReset indique si les utilisateurs peuvent utiliser la méthode ResetPassword pour remplacer leur mot de passe actuel par un nouveau mot de passe, généré aléatoirement.

Cette propriété est en lecture seule.

Propriété EnablePasswordRetrieval

Valeur Boolean spécifiée dans le fichier de configuration (Web.config).

La propriété EnablePasswordRetrieval indique si les utilisateurs peuvent récupérer leur mot de passe à l'aide de la méthode GetPassword.

Cette propriété est en lecture seule.

Propriété RequiresQuestionAndAnswer

Valeur Boolean spécifiée dans le fichier de configuration (Web.config).

La propriété RequiresQuestionAndAnswer indique si les utilisateurs doivent fournir une réponse de mot de passe pour récupérer leur mot de passe à l'aide de la méthode GetPassword ou pour réinitialiser leur mot de passe à l'aide de la méthode ResetPassword.

Cette propriété est en lecture seule.

Propriété RequiresUniqueEmail

Valeur Boolean spécifiée dans le fichier de configuration (Web.config).

La propriété RequiresUniqueEmail indique si les utilisateurs doivent fournir une valeur d'adresse de messagerie unique lors de la création d'un utilisateur. Si un utilisateur existe déjà dans la source de données pour la propriété ApplicationName actuelle, la méthode CreateUser retourne null (Nothing en Visual Basic) et la valeur d'état DuplicateEmail.

Cette propriété est en lecture seule.

Propriété PasswordFormat

Valeur MembershipPasswordFormat spécifiée dans le fichier de configuration (Web.config).

La propriété PasswordFormat indique le format dans lequel les mots de passe sont stockés. Les mots de passe peuvent être stockés dans les formats Clear, Encrypted et Hashed. Les mots de passe Clear sont stockés sous forme de texte brut, ce qui améliore les performances de stockage et de récupération du mot de passe, mais est moins sécurisé, car les mots de passe sont facilement déchiffrés si votre source de données est compromise. Les mots de passe Encrypted sont chiffrés lors de leur stockage et peuvent être déchiffrés pour comparaison ou récupération du mot de passe. Cette méthode exige un traitement supplémentaire pour le stockage et la récupération de mot de passe, mais est plus sécurisée, car les mots de passe ne sont pas facilement décodés si la source de données est compromise. Les mots de passe Hashed sont hachés via un algorithme de hachage unidirectionnel et une valeur salt générée aléatoirement lors du stockage dans la base de données. Lorsqu'un mot de passe est validé, il est haché avec la valeur salt dans la base de données, à des fins de vérification. Les mots de passe hachés ne peuvent pas être récupérés.

Vous pouvez utiliser les méthodes virtuelles EncryptPassword et DecryptPassword de la classe MembershipProvider pour chiffrer et déchiffrer des valeurs de mot de passe, ou vous pouvez fournir votre propre code de chiffrement. Si vous utilisez les méthodes virtuelles EncryptPassword et DecryptPassword de la classe MembershipProvider, les mots de passe Encrypted sont chiffrés à l'aide des informations clés fournies dans l'élément machineKey (Schéma des paramètres ASP.NET) de votre configuration.

Cette propriété est en lecture seule.

Propriété MaxInvalidPasswordAttempts

Valeur Integer spécifiée dans le fichier de configuration (Web.config).

MaxInvalidPasswordAttempts fonctionne avec PasswordAttemptWindow pour éviter qu'une source non autorisée ne découvre, par des tentatives répétées, le mot de passe ou la réponse au mot de passe d'un utilisateur d'appartenance. Si le nombre de mots de passe ou de questions de mot de passe non valides fourni pour un utilisateur d'appartenance dépasse la valeur MaxInvalidPasswordAttempts dans le nombre de minutes identifié par PasswordAttemptWindow, l'utilisateur d'appartenance est alors verrouillé par l'affectation de la valeur true à la propriété IsLockedOut jusqu'à ce qu'il soit déverrouillé à l'aide de la méthode UnlockUser. Si un mot de passe ou une réponse de mot de passe valide est fourni avant que la valeur MaxInvalidPasswordAttempts soit atteinte, le compteur qui assure le suivi du nombre de tentatives non valides est remis à zéro.

Si la propriété RequiresQuestionAndAnswer a la valeur false, aucun suivi des tentatives de réponse de mot de passe non valides n'est effectué.

Le mot de passe et les tentatives de réponse de mot de passe non valides sont suivis dans les méthodes ValidateUser, ChangePassword, ChangePasswordQuestionAndAnswer, GetPassword et ResetPassword.

Cette propriété est en lecture seule.

Propriété PasswordAttemptWindow

Valeur Integer spécifiée dans le fichier de configuration (Web.config).

Pour une description, consultez la description de la propriété MaxInvalidPasswordAttempts.

Cette propriété est en lecture seule.

Propriété ApplicationName

Nom de l'application utilisant les informations d'appartenance spécifiées dans le fichier de configuration (Web.config). La propriété ApplicationName est stockée dans la source de données avec les informations utilisateur connexes et utilisée lorsque ces informations sont demandées. Pour plus d'informations, consultez la section sur la propriété ApplicationName dans la suite de cette rubrique.

Cette propriété est en lecture/écriture et sa valeur par défaut est ApplicationPath si elle n'est pas spécifiée explicitement.

Méthode CreateUser

Prend en entrée le nom d'un nouvel utilisateur, un mot de passe et une adresse de messagerie, et insère un nouvel utilisateur pour l'application dans la source de données. La méthode CreateUser retourne un objet MembershipUser rempli avec les informations du nouvel utilisateur. La méthode CreateUser définit également un paramètre out (en Visual Basic, vous pouvez utiliser ByRef) qui retourne une valeur MembershipCreateStatus indiquant si l'utilisateur a été créé avec succès, ou la raison pour laquelle la création de l'utilisateur a échoué.

La méthode CreateUser déclenche l'événement ValidatingPassword, si un MembershipValidatePasswordEventHandler a été spécifié, et poursuit ou annule l'action de création d'utilisateur en fonction des résultats de l'événement. Vous pouvez utiliser la méthode virtuelle OnValidatingPassword pour exécuter le MembershipValidatePasswordEventHandler spécifié.

Méthode UpdateUser

Prend en entrée un objet MembershipUser rempli avec les informations utilisateur et met à jour la source de données avec les valeurs fournies.

Méthode DeleteUser

Prend en entrée le nom d'un utilisateur et supprime les informations de cet utilisateur de la source de données. La méthode DeleteUser retourne true si l'utilisateur a été supprimé avec succès ; sinon, false. Un paramètre Boolean supplémentaire est inclus pour indiquer si les informations connexes de l'utilisateur, telles que le rôle ou le profil sont également supprimées.

Méthode ValidateUser

Prend en entrée un nom d'utilisateur et un mot de passe et vérifie que les valeurs correspondent à celles de la source de données. La méthode ValidateUser retourne true si le nom d'utilisateur et le mot de passe concordent ; sinon, false.

Méthode GetUser

Prend en entrée un identificateur d'utilisateur unique et une valeur Boolean qui indique s'il faut mettre à jour la valeur LastActivityDate pour l'utilisateur, afin d'indiquer que celui-ci est actuellement en ligne. La méthode GetUser retourne un objet MembershipUser rempli avec les valeurs actuelles de la source de données pour l'utilisateur spécifié. Si le nom d'utilisateur n'est pas trouvé dans la source de données, la méthode GetUser retourne null (Nothing en Visual Basic).

Méthode GetUser

Prend en entrée un nom d'utilisateur et une valeur Boolean qui indique s'il faut mettre à jour la valeur LastActivityDate pour l'utilisateur, afin d'indiquer que celui-ci est actuellement en ligne. La méthode GetUser retourne un objet MembershipUser rempli avec les valeurs actuelles de la source de données pour l'utilisateur spécifié. Si le nom d'utilisateur n'est pas trouvé dans la source de données, la méthode GetUser retourne null ( (Nothing en Visual Basic).

Méthode GetAllUsers

Retourne un MembershipUserCollection rempli avec les objets MembershipUser de tous les utilisateurs de la source de données.

Les résultats retournés par GetAllUsers sont limités par les paramètres pageIndex et pageSize. Le paramètre pageSize identifie le nombre maximal d'objets MembershipUser à retourner dans MembershipUserCollection. Le paramètre pageIndex identifie la page de résultats à retourner, 1 correspondant à la première page. Le paramètre totalRecords est un paramètre out dont la valeur est égale au nombre total des utilisateurs d'appartenance. Par exemple, si treize utilisateurs figuraient dans la base de données pour l'application et que la valeur pageIndex était 2 avec un paramètre pageSize égal à 5, le MembershipUserCollection retourné contiendrait du sixième au dixième utilisateurs retournés. totalRecords prendrait alors la valeur 13.

Méthode GetNumberOfUsersOnline

Retourne une valeur entière qui est le décompte de tous les utilisateurs de la source de données pour lesquels la valeur de la propriété LastActivityDate est supérieure à la date et à l'heure courantes moins la valeur de propriété UserIsOnlineTimeWindow. La propriété UserIsOnlineTimeWindow est une valeur entière spécifiant le nombre de minutes à utiliser pour déterminer si un utilisateur est en ligne.

Méthode ResetPassword

Prend en entrée un nom d'utilisateur et une réponse de mot de passe et génère un nouveau mot de passe aléatoire pour l'utilisateur spécifié. La méthode ResetPassword met à jour les informations utilisateur dans la source de données avec la nouvelle valeur de mot de passe et retourne le nouveau mot de passe sous forme de string. Un mécanisme commode pour générer un mot de passe aléatoire est la méthode GeneratePassword de la classe Membership.

La méthode ResetPassword vérifie que la propriété EnablePasswordReset a la valeur true avant d'exécuter toute action. Si la propriété EnablePasswordReset a la valeur false, NotSupportedException est levé. La méthode ResetPassword vérifie aussi la valeur de la propriété RequiresQuestionAndAnswer. Si la propriété RequiresQuestionAndAnswer a la valeur true, la méthode ResetPassword compare la valeur du paramètre de réponse fourni à la réponse au mot de passe stockée dans la source de données. Si ces valeurs ne concordent pas, MembershipPasswordException est levé.

La méthode ResetPassword déclenche l'événement ValidatingPassword, si MembershipValidatePasswordEventHandler a été spécifié, pour valider le nouveau mot de passe généré, et poursuit ou annule l'action de réinitialisation du mot de passe en fonction des résultats de l'événement. Vous pouvez utiliser la méthode virtuelle OnValidatingPassword pour exécuter le MembershipValidatePasswordEventHandler spécifié.

Méthode GetPassword

Prend en entrée un nom d'utilisateur et une réponse de mot de passe et récupère le mot de passe de cet utilisateur depuis la source de données, puis retourne le mot de passe sous forme de string.

La méthode GetPassword vérifie que la propriété EnablePasswordRetrieval a la valeur true avant d'exécuter toute action. Si la propriété EnablePasswordRetrieval a la valeur false, ProviderException est levé.

La méthode GetPassword vérifie aussi la valeur de la propriété RequiresQuestionAndAnswer. Si la propriété RequiresQuestionAndAnswer a la valeur true, la méthode GetPassword compare la valeur du paramètre de réponse fourni à la réponse au mot de passe stockée dans la source de données. Si ces valeurs ne concordent pas, MembershipPasswordException est levé.

Méthode GetUserNameByEmail

Prend en entrée une adresse de messagerie et retourne le premier nom d'utilisateur de la source de données dont l'adresse de messagerie correspond à la valeur de paramètre email fournie.

Si aucun nom d'utilisateur n'est trouvé avec une adresse de messagerie correspondante, une chaîne vide est retournée.

Si plusieurs noms d'utilisateurs correspondant à une adresse de messagerie particulière sont trouvés, seul le premier nom est retourné.

Méthode ChangePassword

Prend en entrée un nom d'utilisateur, un mot de passe actuel et un nouveau mot de passe, et met à jour le mot de passe dans la source de données si le nom d'utilisateur et le mot de passe actuel fournis sont valides. La méthode ChangePassword retourne true si la mise à jour du mot de passe a abouti ; sinon, false.

La méthode ChangePassword déclenche l'événement ValidatingPassword, si un MembershipValidatePasswordEventHandler a été spécifié, et poursuit ou annule l'action de changement de mot de passe en fonction des résultats de l'événement. Vous pouvez utiliser la méthode virtuelle OnValidatingPassword pour exécuter le MembershipValidatePasswordEventHandler spécifié.

Méthode ChangePasswordQuestionAndAnswer

Prend en entrée un nom d'utilisateur, un mot de passe, une question de mot de passe et une réponse de mot de passe, et met à jour la question et la réponse dans la source de données si le nom d'utilisateur et le mot de passe fournis sont valides. La méthode ChangePasswordQuestionAndAnswer retourne true si la mise à jour de la question et de la réponse de mot de passe aboutit ; sinon, false.

Si le nom d'utilisateur et le mot de passe fournis ne sont pas valides, la valeur false est retournée.

Méthode FindUsersByName

Retourne une liste des utilisateurs d'appartenance dont le nom correspond au usernameToMatch fourni pour la propriété ApplicationName configurée. Par exemple, si le paramètre usernameToMatch a la valeur "utilisateur", les utilisateurs "utilisateur1", "utilisateur2", "utilisateur3", etc. sont retournés. La prise en charge des caractères génériques est incluse selon la source de données. Les utilisateurs sont retournés dans l'ordre alphabétique en fonction de leur nom.

Les résultats retournés par FindUsersByName sont limités par les paramètres pageIndex et pageSize. Le paramètre pageSize identifie le nombre d'objets MembershipUser à retourner dans MembershipUserCollection. Le paramètre pageIndex identifie la page de résultats à retourner, 1 correspondant à la première page. Le paramètre totalRecords est un paramètre out dont la valeur est égale au nombre total des utilisateurs d'appartenance ayant la valeur usernameToMatch. Par exemple, si treize utilisateurs étaient trouvés pour lesquels usernameToMatch correspondait à tout ou partie du nom d'utilisateur, et si la valeur pageIndex était 2 avec un pageSize de 5, l'objet MembershipUserCollection retourné contiendrait du sixième au dixième utilisateurs retournés. totalRecords prendrait alors la valeur 13.

Méthode FindUsersByEmail

Retourne une liste des utilisateurs d'appartenance dont le nom correspond au emailToMatch fourni pour la propriété ApplicationName configurée. Par exemple, si le paramètre emailToMatch a la valeur "adresse@exemple.com", les utilisateurs possédant les adresses de messagerie "adresse1@exemple .com", "adresse2@exemple .com", etc. sont retournés. La prise en charge des caractères génériques est incluse selon la source de données. Les utilisateurs sont retournés dans l'ordre alphabétique en fonction de leur nom.

Les résultats retournés par FindUsersByEmail sont limités par les paramètres pageIndex et pageSize. Le paramètre pageSize identifie le nombre d'objets MembershipUser à retourner dans la collection MembershipUserCollection. Le paramètre pageIndex identifie la page de résultats à retourner, 1 correspondant à la première page. Le paramètre totalRecords est un paramètre out dont la valeur est égale au nombre total des utilisateurs d'appartenance ayant la valeur emailToMatch. Par exemple, si treize utilisateurs étaient trouvés pour lesquels emailToMatch correspondait à tout ou partie du nom d'utilisateur, et si la valeur pageIndex était 2 avec un pageSize de 5, l'objet MembershipUserCollection retourné contiendrait du sixième au dixième utilisateurs retournés. totalRecords prendrait alors la valeur 13.

Méthode UnlockUser

Prend en entrée un nom d'utilisateur et met à jour le champ dans la source de données qui stocke la propriété IsLockedOut en lui affectant la valeur false. La méthode UnlockUser retourne true si la mise à jour de l'enregistrement de l'utilisateur d'appartenance aboutit ; sinon false.

ApplicationName

Les fournisseurs d'appartenances stockent les informations utilisateur de façon unique pour chaque application. Cela permet à plusieurs applications ASP.NET d'utiliser la même source de données sans entrer en conflit si des noms d'utilisateurs sont créés en double. Ou bien, plusieurs applications ASP.NET peuvent utiliser la même source de données utilisateur en spécifiant la même propriété ApplicationName.

Comme les fournisseurs d'appartenances stockent des informations utilisateur de façon unique pour chaque application, vous devrez vous assurer que votre schéma de données, ainsi que les requêtes et mises à jour, incluent le nom de l'application. Par exemple, la commande suivante permet de récupérer un nom d'utilisateur depuis une base de données, à partir de l'adresse de messagerie, et vérifie que la propriété ApplicationName est incluse dans la requête.

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

Membres personnalisés

Il peut s'avérer nécessaire de renforcer les interfaces des fournisseurs d'appartenances par des fonctionnalités supplémentaires non fournies par les classes abstraites ProviderBase et MembershipProvider. Les membres publics que vous ajoutez à votre fournisseur d'appartenances seront accessibles à l'aide de la propriété Provider ou Providers de la classe Membership.

Par exemple, il peut s'agir d'une méthode LockUser qui affecte à la propriété IsLockedOut la valeur true. L'exemple suivant indique comment effectuer un cast de la propriété Provider qui expose le fournisseur d'appartenances par défaut pour une application comme type de fournisseur personnalisé afin d'appeler la méthode LockUser personnalisée.

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

Sécurité des threads

Pour chaque fournisseur d'appartenances spécifié dans la configuration d'une application, ASP.NET instancie une instance de fournisseur d'appartenances unique qui est utilisée pour toutes les demandes desservies par un objet HttpApplication. En conséquence, plusieurs demandes peuvent être exécutées en même temps. ASP.NET ne garantit pas la sécurité des threads des appels à votre fournisseur. Pour assurer cette sécurité, vous devrez écrire le code de votre fournisseur. Par exemple, il convient de créer une connexion à une base de données ou d'ouvrir un fichier pour édition dans le membre qui est appelé, tel que CreateUser, au lieu d'ouvrir un fichier ou une connexion de base de données lorsque la méthode Initialize est appelée.

Voir aussi

Concepts

Exemple d'implémentation d'un fournisseur d'appartenances

Sécurisation de la navigation de site ASP.NET

Référence

ValidatePasswordEventArgs

OnValidatingPassword

Autres ressources

Gestion des utilisateurs à l'aide de l'appartenance

Sécurisation de sites Web ASP.NET