Création du schéma d’appartenance dans SQL Server (VB)
par Scott Mitchell
Remarque
Depuis l’écriture de cet article, les fournisseurs d’appartenance ASP.NET ont été remplacés par ASP.NET Identity. Nous vous recommandons vivement de mettre à jour les applications pour utiliser la plateforme Identity
- Meilleures performances
- Extensibilité et testabilité améliorées
- Prise en charge d’OAuth, OpenID Connect et de l’authentification à deux facteurs
- Support d’identité basée sur les réclamations
- Meilleure interopérabilité avec ASP.Net Core
Télécharger le code ou Télécharger le PDF
Ce tutoriel commence par examiner les techniques d’ajout du schéma nécessaire à la base de données afin d’utiliser SqlMembershipProvider. Nous allons ensuite examiner les tables clés du schéma et discuter de leur objectif et de leur importance. Ce didacticiel se termine par un aperçu de la façon d’indiquer à une application ASP.NET quel fournisseur l’infrastructure d’appartenance doit utiliser.
Introduction
Les deux didacticiels précédents examinaient en utilisant l'authentification par formulaire pour identifier les visiteurs du site web. L’infrastructure d’authentification par formulaire permet aux développeurs de connecter facilement un utilisateur dans un site web et de les mémoriser dans les visites de pages via l’utilisation de tickets d’authentification. La classe FormsAuthentication
inclut des méthodes pour générer le ticket et l’ajouter aux cookies du visiteur. Le FormsAuthenticationModule
examine toutes les demandes entrantes et, pour ceux qui ont un ticket d’authentification valide, crée et associe un GenericPrincipal
et un objet FormsIdentity
à la requête actuelle. L’authentification par formulaire est simplement un mécanisme permettant d’accorder un ticket d’authentification à un visiteur lors de la connexion et, sur les demandes suivantes, l’analyse de ce ticket pour déterminer l’identité de l’utilisateur. Pour qu’une application web prend en charge les comptes d’utilisateur, nous devons toujours implémenter un magasin d’utilisateurs et ajouter des fonctionnalités pour valider les informations d’identification, inscrire de nouveaux utilisateurs et la myriade d’autres tâches liées au compte d’utilisateur.
Avant ASP.NET 2.0, les développeurs devaient prendre en charge l'implémentation de toutes ces tâches liées aux comptes d'utilisateur. Heureusement, l’équipe ASP.NET a reconnu cette lacune et introduit le cadre d’adhésion avec ASP.NET 2.0. L’infrastructure d’appartenance est un ensemble de classes dans le .NET Framework qui fournissent une interface programmatique pour accomplir des tâches principales liées au compte d’utilisateur. Ce framework est conçu en haut du modèle de fournisseur , ce qui permet aux développeurs de brancher une implémentation personnalisée dans une API standardisée.
Comme indiqué dans le didacticiel Sécurité de base et ASP.NET Support, le .NET Framework est fourni avec deux fournisseurs d’appartenance intégrés : ActiveDirectoryMembershipProvider
et SqlMembershipProvider
. Comme son nom l’indique, le SqlMembershipProvider
utilise une base de données Microsoft SQL Server comme dépôt d’utilisateurs. Pour utiliser ce fournisseur dans une application, nous devons indiquer au fournisseur quelle base de données utiliser comme magasin. Comme vous pouvez l’imaginer, le SqlMembershipProvider
s’attend à ce que la base de données du répertoire d’utilisateurs comporte certaines tables, vues et procédures stockées. Nous devons ajouter ce schéma attendu à la base de données sélectionnée.
Ce tutoriel commence par examiner les techniques d’ajout du schéma nécessaire à la base de données afin d’utiliser le SqlMembershipProvider
. Nous allons ensuite examiner les tables clés du schéma et discuter de leur objectif et de leur importance. Ce didacticiel se termine par un aperçu de la façon d’indiquer à une application ASP.NET quel fournisseur l’infrastructure d’appartenance doit utiliser.
Commençons !
Étape 1 : Choix de l’emplacement du magasin d’utilisateurs
Les données d’une application ASP.NET sont généralement stockées dans un certain nombre de tables d’une base de données. Lors de l’implémentation du schéma de base de données SqlMembershipProvider
, nous devons décider s’il faut placer le schéma d’appartenance dans la même base de données que les données d’application ou dans une autre base de données.
Je recommande de localiser le schéma d’appartenance dans la même base de données que les données d’application pour les raisons suivantes :
- la facilité de maintenance une application dont les données sont encapsulées dans une base de données est plus facile à comprendre, gérer et déployer qu’une application qui a deux bases de données distinctes.
- intégrité relationnelle en localisant les tables associées à l’appartenance dans la même base de données que les tables d’application, il est possible d’établir contraintes de clé étrangère entre les clés primaires des tables associées à l’appartenance et les tables d’application associées.
Le découplage du magasin d’utilisateurs et des données d’application dans des bases de données distinctes n’est judicieux que si vous avez plusieurs applications qui utilisent chacune des bases de données distinctes, mais doivent partager un magasin d’utilisateurs commun.
Création d’une base de données
L’application que nous avons généré depuis le deuxième didacticiel n’a pas encore besoin d’une base de données. Nous en avons besoin maintenant pour le magasin d’utilisateurs. Nous allons en créer un, puis l’ajouter au schéma requis par le fournisseur SqlMembershipProvider
(voir l’étape 2).
Remarque
Tout au long de cette série de tutoriels, nous allons utiliser une base de données Microsoft SQL Server 2005 Express Edition App_Data
de l’application web, ce qui en fait une mise en forme pour empaqueter la base de données et l’application web ensemble dans un fichier ZIP et le redéployer sans instructions d’installation ou options de configuration spéciales. Si vous préférez suivre l’utilisation d’une version non Express Edition de SQL Server, n’hésitez pas. Les étapes sont pratiquement identiques. Le schéma SqlMembershipProvider
fonctionne avec n’importe quelle version de Microsoft SQL Server 2000 et ultérieure.
Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le dossier App_Data
et choisissez d’ajouter un nouvel élément. (Si vous ne voyez pas de dossier App_Data
dans votre projet, cliquez avec le bouton droit sur le projet dans l’Explorateur de solutions, sélectionnez Ajouter ASP.NET dossier, puis choisissez App_Data
.) Dans la boîte de dialogue Ajouter un nouvel élément, choisissez d’ajouter une nouvelle base de données SQL nommée SecurityTutorials.mdf
. Dans ce tutoriel, nous allons ajouter le schéma SqlMembershipProvider
à cette base de données ; dans les didacticiels suivants, nous allons créer des tables supplémentaires pour capturer nos données d’application.
Figure 1: ajouter une nouvelle base de données SQL nommée SecurityTutorials.mdf
base de données au dossier App_Data
(Cliquez pour afficher l’image de taille complète)
L’ajout d’une base de données au dossier App_Data
l’inclut automatiquement dans la vue Explorateur de bases de données. (Dans la version non Express Edition de Visual Studio, l’Explorateur de bases de données est appelé l’Explorateur de serveurs.) Accédez à l’Explorateur de bases de données et développez la base de données SecurityTutorials
juste ajoutée. Si vous ne voyez pas l’Explorateur de bases de données à l’écran, accédez au menu Affichage et choisissez Explorateur de bases de données, ou appuyez sur Ctrl+Alt+S. Comme le montre la figure 2, la base de données SecurityTutorials
est vide : elle ne contient aucune table, aucune vue et aucune procédure stockée.
Figure 2: La base de données SecurityTutorials
est actuellement vide (Cliquez pour afficher l’image de taille complète)
Étape 2 : Ajout du schémaSqlMembershipProvider
à la base de données
La SqlMembershipProvider
nécessite qu'un ensemble particulier de tables, de vues et de procédures stockées soit installé dans la base de données des données utilisateur. Ces objets de base de données requis peuvent être ajoutés à l’aide de l’outil aspnet_regsql.exe
. Ce fichier se trouve dans le dossier %WINDIR%\Microsoft.Net\Framework\v2.0.50727\
.
Remarque
L’outil aspnet_regsql.exe
offre à la fois des fonctionnalités de ligne de commande et une interface utilisateur graphique. L’interface graphique est plus conviviale et est ce que nous examinerons dans ce tutoriel. L’interface de ligne de commande est utile lorsque l’ajout du schéma SqlMembershipProvider
doit être automatisé, par exemple dans les scripts de génération ou les scénarios de test automatisé.
L’outil aspnet_regsql.exe
est utilisé pour ajouter ou supprimer des services d’application ASP.NET à une base de données SQL Server spécifiée. Les services d’application ASP.NET englobent les schémas des SqlMembershipProvider
et des SqlRoleProvider
, ainsi que les schémas des fournisseurs basés sur SQL pour d’autres frameworks ASP.NET 2.0. Nous devons fournir deux bits d’informations à l’outil aspnet_regsql.exe
:
- Que nous souhaitions ajouter ou supprimer des services d’application et
- Base de données à partir de laquelle ajouter ou supprimer le schéma des services d’application
Dans l’invite à utiliser la base de données, l’outil aspnet_regsql.exe
nous demande de fournir le nom du serveur sur lequel réside la base de données, les informations d’identification de sécurité pour la connexion à la base de données et le nom de la base de données. Si vous utilisez l’édition non Express de SQL Server, vous devez déjà connaître ces informations, car il s’agit des mêmes informations que celles que vous devez fournir via une chaîne de connexion lors de l’utilisation de la base de données via une page web ASP.NET. La détermination du nom du serveur et de la base de données lors de l’utilisation d’une base de données SQL Server 2005 Express Edition dans le dossier App_Data
est toutefois un peu plus impliquée.
La section suivante examine un moyen simple de spécifier le nom du serveur et de la base de données pour une base de données SQL Server 2005 Express Edition dans le dossier App_Data
. Si vous n’utilisez pas SQL Server 2005 Express Edition, n’hésitez pas à passer à la section Installation des services d’application.
Détermination du nom du serveur et de la base de données pour une base de données SQL Server 2005 Express Edition dans le dossierApp_Data
Pour utiliser l’outil aspnet_regsql.exe
, nous devons connaître les noms du serveur et de la base de données. Le nom du serveur est localhost\InstanceName
. Le InstanceName est probablement SQLExpress
. Toutefois, si vous avez installé SQL Server 2005 Express Edition manuellement (autrement dit, vous ne l’avez pas installé automatiquement lors de l’installation de Visual Studio), il est possible que vous avez sélectionné un autre nom d’instance.
Le nom de la base de données est un peu plus difficile à déterminer. Les bases de données du dossier App_Data
ont généralement un nom de base de données qui inclut un identificateur global unique ainsi que le chemin d’accès au fichier de base de données. Nous devons déterminer ce nom de base de données pour ajouter le schéma des services d’application via aspnet_regsql.exe
.
Le moyen le plus simple de déterminer le nom de la base de données consiste à l’examiner via SQL Server Management Studio. SQL Server Management Studio fournit une interface graphique pour la gestion des bases de données SQL Server 2005, mais elle n’est pas fournie avec l’édition Express de SQL Server 2005. La bonne nouvelle est que vous pouvez télécharger l’édition Express gratuite de SQL Server Management Studio.
Remarque
Si vous disposez également d’une version non Express Edition de SQL Server 2005 installée sur votre bureau, la version complète de Management Studio est probablement installée. Vous pouvez utiliser la version complète pour déterminer le nom de la base de données, en suivant les mêmes étapes que celles décrites ci-dessous pour Express Edition.
Commencez par fermer Visual Studio pour vous assurer que les verrous imposés par Visual Studio sur le fichier de base de données sont fermés. Ensuite, lancez SQL Server Management Studio et connectez-vous à la base de données localhost\InstanceName
pour SQL Server 2005 Express Edition. Comme indiqué précédemment, les chances sont grandes que le nom de l’instance soit SQLExpress
. Pour l’option Authentification, sélectionnez Authentification Windows.
Figure 3: Se connecter à l’instance SQL Server 2005 Express Edition (Cliquer pour afficher l’image de taille complète)
Après la connexion à l’instance SQL Server 2005 Express Edition, Management Studio affiche des dossiers pour les bases de données, les paramètres de sécurité, les objets serveur, et ainsi de suite. Si vous développez l’onglet Bases de données (Databases), vous verrez que la base de données SecurityTutorials.mdf
n’est pas enregistrée dans l’instance de base de données : il faut d’abord l’attacher.
Cliquez avec le bouton droit sur le dossier Bases de données et choisissez Attacher dans le menu contextuel. La boîte de dialogue Attacher des bases de données s’affiche. À partir de là, cliquez sur le bouton Ajouter, accédez à la base de données SecurityTutorials.mdf
, puis cliquez sur OK. La figure 4 montre la boîte de dialogue Attacher des bases de données une fois que la base de données SecurityTutorials.mdf
a été sélectionnée. La figure 5 montre l’Explorateur d’objets de Management Studio une fois que la base de données a été attachée avec succès.
Figure 4: Attacher la base de données SecurityTutorials.mdf
(Cliquer pour afficher l’image de taille complète)
Figure 5: la base de données SecurityTutorials.mdf
apparaît dans le dossier Bases de données (Cliquez pour afficher l’image de taille complète)
Comme le montre la figure 5, la base de données SecurityTutorials.mdf
a un nom plutôt abstruse. Nous allons le remplacer par un nom plus mémorable (et plus facile à taper). Cliquez avec le bouton droit sur la base de données, choisissez Renommer dans le menu contextuel, puis renommez-la SecurityTutorialsDatabase
. Cela ne modifie pas le nom de fichier, simplement le nom de la base de données utilise pour s’identifier à SQL Server.
Figure 6: renommez la base de données en SecurityTutorialsDatabase
(Cliquez pour afficher l’image de taille complète)
À ce stade, nous connaissons les noms du serveur et de la base de données pour le fichier de base de données SecurityTutorials.mdf
: localhost\InstanceName
et SecurityTutorialsDatabase
, respectivement. Nous sommes maintenant prêts à installer les services d’application via l’outil aspnet_regsql.exe
.
Installation des services d’application
Pour lancer l’outil aspnet_regsql.exe
, accédez au menu Démarrer et choisissez Exécuter. Entrez %WINDIR%\Microsoft.Net\Framework\v2.0.50727\aspnet_regsql.exe
dans la zone de texte, puis cliquez sur OK. Vous pouvez également utiliser l’Explorateur Windows pour accéder au dossier approprié et double-cliquez sur le fichier aspnet_regsql.exe
. L’une ou l’autre approche va netter les mêmes résultats.
L’exécution de l’outil aspnet_regsql.exe
sans arguments de ligne de commande lance l’interface utilisateur graphique de l’Assistant Installation de SQL Server ASP.NET. L’Assistant facilite l’ajout ou la suppression des services d’application ASP.NET sur une base de données spécifiée. La première page de l’assistant, illustrée à la figure 7, décrit l’objectif de l’outil.
Schéma 7 : utilisez l’assistant de configuration SQL Server ASP.NET pour ajouter le schéma de membres (Cliquer pour afficher l’image en taille réelle)
La deuxième étape de l’assistant nous demande si nous souhaitons ajouter ou supprimer les services d’application. Étant donné que nous voulons ajouter les tables, vues et procédures stockées nécessaires pour le SqlMembershipProvider
, choisissez l’option Configurer SQL Server pour les services d’application. Plus tard, si vous souhaitez supprimer ce schéma de votre base de données, réexécutez cet Assistant, mais choisissez plutôt l'option Supprimer les informations des services d'application d'une base de données existante.
Figure 8: choisissez l’option Configurer SQL Server pour Application Services (Cliquez pour afficher l’image de taille complète)
La troisième étape invite les informations de base de données : le nom du serveur, les informations d’authentification et le nom de la base de données. Si vous suivez ce didacticiel et que vous avez ajouté la base de données SecurityTutorials.mdf
à App_Data
, attachée à localhost\InstanceName
, puis renommée en SecurityTutorialsDatabase
, utilisez les valeurs suivantes :
- Serveur :
localhost\InstanceName
- Authentification Windows
- Base de données :
SecurityTutorialsDatabase
Figure 9: Entrez les informations de base de données (Cliquez pour afficher l’image de taille complète)
Après avoir entré les informations de base de données, cliquez sur Suivant. La dernière étape récapitule les étapes qui seront effectuées. Cliquez sur Suivant pour installer les services applicatifs, puis sur Terminer pour finaliser l’assistant.
Remarque
Si vous avez utilisé Management Studio pour attacher la base de données et renommer le fichier de base de données, veillez à détacher la base de données et à fermer Management Studio avant de rouvrir Visual Studio. Pour détacher la base de données SecurityTutorialsDatabase
, cliquez avec le bouton droit sur le nom de la base de données et, dans le menu Tâches, choisissez Détacher.
Une fois l’assistant terminé, revenez à Visual Studio et rendez-vous dans l’Explorateur de bases de données. Développez le dossier Tables . Vous devez voir une série de tables dont les noms commencent par le préfixe aspnet_
. De même, vous trouverez plusieurs vues et procédures stockées dans les dossiers Vues et Procédures stockées. Ces objets de base de données constituent le schéma des services d’application. Nous examinerons les objets de base de données spécifiques à l’appartenance et au rôle à l’étape 3.
Figure 10: diverses tables, vues et procédures stockées ont été ajoutées à la base de données (Cliquer pour afficher l’image de taille complète)
Remarque
L’interface utilisateur graphique de l’outil aspnet_regsql.exe
installe l’ensemble du schéma des services d’application. Toutefois, lors de l’exécution de aspnet_regsql.exe
à partir de la ligne de commande, vous pouvez spécifier les composants des services d’application à installer (ou supprimer). Par conséquent, si vous souhaitez ajouter uniquement les tables, vues et procédures stockées nécessaires pour les fournisseurs SqlMembershipProvider
et SqlRoleProvider
, exécutez aspnet_regsql.exe
à partir de la ligne de commande. Vous pouvez également exécuter manuellement le sous-ensemble approprié de scripts de création T-SQL utilisés par aspnet_regsql.exe
. Ces scripts se trouvent dans le dossier WINDIR%\Microsoft.Net\Framework\v2.0.50727\
avec des noms tels que InstallCommon.sql
, InstallMembership.sql
, InstallRoles.sql
, InstallProfile.sql
, InstallSqlState.sql
, et ainsi de suite.
À ce stade, nous avons créé les objets de base de données nécessaires pour le SqlMembershipProvider
. Toutefois, nous devons encore indiquer au framework d’appartenance qu’il doit utiliser la SqlMembershipProvider
(plutôt que, par exemple, la ActiveDirectoryMembershipProvider
) et que le SqlMembershipProvider
doit utiliser la base de données SecurityTutorials
. Nous allons examiner comment spécifier le fournisseur à utiliser et comment personnaliser les paramètres du fournisseur sélectionné à l’étape 4. Mais tout d’abord, examinons plus en détail les objets de base de données qui ont été créés.
Étape 3 : Examiner les tables principales du schéma
Lorsque vous utilisez les frameworks d’appartenance et de rôles dans une application ASP.NET, les détails de l’implémentation sont encapsulés par le fournisseur. Dans les prochains didacticiels, nous allons interagir avec ces frameworks via les classes Membership
et Roles
du .NET Framework. Lorsque nous utilisons ces API de haut niveau, nous n’avons pas besoin de nous soucier des détails de bas niveau, comme les requêtes exécutées ou les tables modifiées par les SqlMembershipProvider
et les SqlRoleProvider
.
Étant donné cela, nous pourrions utiliser en toute confiance les frameworks d’appartenance et de rôles sans avoir exploré le schéma de base de données créé à l’étape 2. Toutefois, lors de la création des tables pour stocker des données d’application, nous pouvons avoir besoin de créer des entités liées aux utilisateurs ou aux rôles. Il permet de connaître les schémas SqlMembershipProvider
et SqlRoleProvider
lors de l’établissement de contraintes de clé étrangère entre les tables de données d’application et ces tables créées à l’étape 2. En outre, dans certaines rares circonstances, nous pouvons avoir besoin d’interagir avec l’utilisateur et les magasins de rôles directement au niveau de la base de données (au lieu de l'Membership
ou des classes Roles
).
Répartition du répertoire d’utilisateurs entre applications
Les frameworks d’appartenance et de rôles sont conçus afin qu’un seul utilisateur et un magasin de rôles puissent être partagés entre de nombreuses applications différentes. Une application ASP.NET qui utilise les frameworks d’appartenance ou de rôles doit spécifier la partition d’application à utiliser. En bref, plusieurs applications web peuvent utiliser les mêmes répertoires d’utilisateurs et de rôles. La figure 11 illustre les magasins d’utilisateurs et de rôles partitionnés en trois applications : HRSite, CustomerSite et SalesSite. Ces trois applications web ont chacun leurs propres utilisateurs et rôles uniques, mais elles stockent tous physiquement leurs informations de compte d’utilisateur et de rôle dans les mêmes tables de base de données.
Figure 11: Les comptes d’utilisateur peuvent être partitionnés sur plusieurs applications (Cliquer pour afficher l’image de taille complète)
La table aspnet_Applications
est ce qui définit ces partitions. Chaque application qui utilise la base de données pour stocker les informations de compte d’utilisateur est représentée par une ligne de cette table. La table aspnet_Applications
comporte quatre colonnes : ApplicationId
, ApplicationName
, LoweredApplicationName
et Description
.ApplicationId
est de type uniqueidentifier
et est la clé primaire de la table ; ApplicationName
fournit un nom convivial unique pour chaque application.
Les autres tables associées à l’appartenance et aux rôles renvoient au champ ApplicationId
dans aspnet_Applications
. Par exemple, la table aspnet_Users
, qui contient un enregistrement pour chaque compte d’utilisateur, a un champ de clé étrangère ApplicationId
; ditto pour la table aspnet_Roles
. Le champ ApplicationId
de ces tables spécifie la partition d’application à laquelle appartient le compte d’utilisateur ou le rôle.
Stockage des informations de compte d’utilisateur
Les informations de compte d’utilisateur sont hébergées dans deux tables : aspnet_Users
et aspnet_Membership
. La table aspnet_Users
contient des champs qui contiennent les informations essentielles du compte d’utilisateur. Les trois colonnes les plus pertinentes sont les suivantes :
UserId
UserName
ApplicationId
UserId
est la clé primaire (et de type uniqueidentifier
). UserName
est de type nvarchar(256)
et, avec le mot de passe, compose les informations d’identification de l’utilisateur. (Le mot de passe d’un utilisateur est stocké dans la table aspnet_Membership
.) ApplicationId
lie le compte d’utilisateur à une application particulière dans aspnet_Applications
. Il existe une contrainte composite de UNIQUE
sur les colonnes UserName
et ApplicationId
. Cela garantit que dans une application donnée, chaque nom d’utilisateur est unique, mais il permet d’utiliser les mêmes UserName
dans différentes applications.
Le tableau aspnet_Membership
inclut des informations de compte d’utilisateur supplémentaires, telles que le mot de passe de l’utilisateur, l’adresse e-mail, la date et l’heure de la dernière connexion, etc. Il existe une correspondance un-à-un entre les enregistrements des tables aspnet_Users
et aspnet_Membership
. Cette relation est assurée par le champ UserId
dans aspnet_Membership
, qui sert de clé primaire de la table. Comme la table aspnet_Users
, aspnet_Membership
inclut un champ ApplicationId
qui lie ces informations à une partition d’application particulière.
Sécurisation des mots de passe
Les informations de mot de passe sont stockées dans la table aspnet_Membership
. Le SqlMembershipProvider
permet de stocker des mots de passe dans la base de données à l’aide de l’une des trois techniques suivantes :
- Effacer : le mot de passe est stocké dans la base de données sous forme de texte brut. Je décourage fortement l’utilisation de cette option. Si la base de données est compromise - qu’il s’agisse d’un pirate informatique qui trouve une faille de sécurité ou d’un employé mécontent qui a accès à la base de données - les informations d’identification de chaque utilisateur sont à portée de main.
- Hashé : les mots de passe sont hachés à l’aide d’un algorithme de hachage unidirectionnel et d’une valeur aléatoire (salt value). Cette valeur hachée (ainsi que le sel) est stockée dans la base de données.
- chiffrée : une version chiffrée du mot de passe est stockée dans la base de données.
La technique de stockage de mot de passe utilisée dépend des paramètres de SqlMembershipProvider
spécifiés dans Web.config
. Nous allons examiner la personnalisation des paramètres de SqlMembershipProvider
à l’étape 4. Le comportement par défaut consiste à stocker le hachage du mot de passe.
Les colonnes responsables du stockage du mot de passe sont Password
, PasswordFormat
et PasswordSalt
. PasswordFormat
est un champ de type int
dont la valeur indique la technique utilisée pour stocker le mot de passe : 0 pour Effacer ; 1 pour hachage ; 2 pour Encrypted. PasswordSalt
est affecté à une chaîne générée de manière aléatoire, quelle que soit la technique de stockage de mot de passe utilisée ; la valeur de PasswordSalt
est utilisée uniquement lors de l’informatique du hachage du mot de passe. Enfin, la colonne Password
contient les données de mot de passe réelles, qu’il s’agit du mot de passe en texte brut, du hachage du mot de passe ou du mot de passe chiffré.
Le tableau 1 illustre ce que ces trois colonnes peuvent ressembler aux différentes techniques de stockage lors du stockage du mot de passe MySecret ! .
Technique de stockage<_o3a_p /> | mot de passe<_o3a_p /> | PasswordFormat<_o3a_p /> | PasswordSalt<_o3a_p /> |
---|---|---|---|
Effacer | MySecret ! | 0 | tTnkPlesqissc2y2SMEygA== |
Hachée | 2oXm6sZHWbTHFgjgkGQsc2Ec9ZM= | 1 | wFgjUfhdUFOCKQiI61vtiQ== |
Encrypted | 62RZgDvhxykkqsMchZ0Yly7HS6onhpaoCYaRxV8g0F4CW56OXUU3e7Inza9j9BKp | 2 | LSRzhGS/aa/oqAXGLHJNBw== |
tableau 1: exemples de valeurs pour les champs Password-Related lors du stockage du mot de passe MySecret !
Remarque
L’algorithme de chiffrement ou de hachage particulier utilisé par l'SqlMembershipProvider
est déterminé par les paramètres de l’élément <machineKey>
.
Stockage des rôles et des associations de rôles
L’infrastructure Rôles permet aux développeurs de définir un ensemble de rôles et de spécifier les utilisateurs qui appartiennent aux rôles. Ces informations sont capturées dans la base de données via deux tables : aspnet_Roles
et aspnet_UsersInRoles
. Chaque enregistrement de la table aspnet_Roles
représente un rôle pour une application particulière. Tout comme le tableau aspnet_Users
, le tableau aspnet_Roles
comporte trois colonnes pertinentes pour notre discussion :
RoleId
RoleName
ApplicationId
RoleId
est la clé primaire (et de type uniqueidentifier
). RoleName
est de type nvarchar(256)
. Et ApplicationId
lie le compte d’utilisateur à une application particulière dans aspnet_Applications
. Il existe une contrainte UNIQUE
composite sur les colonnes RoleName
et ApplicationId
, ce qui garantit que dans une application donnée, chaque nom de rôle est unique.
La table aspnet_UsersInRoles
sert de mappage entre les utilisateurs et les rôles. Il n’existe que deux colonnes - UserId
et RoleId
- et ensemble, elles composent une clé primaire composite.
Étape 4 : Spécification du fournisseur et personnalisation de ses paramètres
Toutes les infrastructures qui prennent en charge le modèle fournisseur , telles que les frameworks d’appartenance et de rôles, manquent de détails d’implémentation eux-mêmes et délèguent plutôt cette responsabilité à une classe de fournisseur. Dans le cas de l’infrastructure d’appartenance, la classe Membership
définit l’API pour la gestion des comptes d’utilisateur, mais elle n’interagit pas directement avec un magasin d’utilisateurs. Au lieu de cela, les méthodes de la classe Membership
renvoient la demande au fournisseur configuré . Nous allons utiliser la SqlMembershipProvider
. Lorsque nous invoquons l’une des méthodes de la classe Membership
, comment le framework d’adhésion (Membership) sait-il déléguer l’appel au SqlMembershipProvider
?
La classe Membership
possède une propriété Providers
qui contient une référence à toutes les classes fournisseurs inscrites disponibles pour le framework de gestion des adhésions. Chaque fournisseur inscrit a un nom et un type associés. Le nom offre un moyen convivial de référencer un fournisseur particulier dans la collection Providers
, tandis que le type identifie la classe de fournisseur. De plus, chaque fournisseur inscrit peut inclure des paramètres de configuration. Les paramètres de configuration du cadre d'appartenance incluent PasswordFormat
et requiresUniqueEmail
, entre autres. Consultez le tableau 2 pour obtenir la liste complète des paramètres de configuration utilisés par le SqlMembershipProvider
.
Le contenu de la propriété Providers
est spécifié via les paramètres de configuration de l’application web. Par défaut, toutes les applications web ont un fournisseur nommé AspNetSqlMembershipProvider
de type SqlMembershipProvider
. Ce fournisseur d’appartenance par défaut est inscrit dans machine.config
(situé à %WINDIR%\Microsoft.Net\Framework\v2.0.50727\CONFIG
) :
Avertissement
Il semble que l’échantillon que vous recherchez a été déplacé ! Nous sommes assurés que nous travaillons à résoudre ce problème.
Comme le montre le balisage ci-dessus, l’élément <membership>
définit les paramètres de configuration de l’infrastructure Membership pendant que l’élément enfant <providers>
spécifie les fournisseurs inscrits. Les fournisseurs peuvent être ajoutés ou supprimés à l’aide des éléments <add>
ou <remove>
; utilisez l’élément <clear>
pour supprimer tous les fournisseurs actuellement inscrits. Comme le montre le balisage ci-dessus, machine.config
ajoute un fournisseur nommé AspNetSqlMembershipProvider
de type SqlMembershipProvider
.
Outre les attributs name
et type
, l’élément <add>
contient des attributs qui définissent les valeurs des différents paramètres de configuration. Le tableau 2 répertorie les paramètres de configuration spécifiques à SqlMembershipProvider
disponibles, ainsi qu'une description de chacun d'eux.
Remarque
Toutes les valeurs par défaut indiquées dans le tableau 2 font référence aux valeurs par défaut définies dans la classe SqlMembershipProvider
. Notez que tous les paramètres de configuration dans AspNetSqlMembershipProvider
ne correspondent pas aux valeurs par défaut de la classe SqlMembershipProvider
. Par exemple, s’il n’est pas spécifié dans un fournisseur d’appartenances, le paramètre requiresUniqueEmail
définit par défaut la valeur true. Toutefois, le AspNetSqlMembershipProvider
remplace cette valeur par défaut en spécifiant explicitement une valeur de false
.
Paramètre<_o3a_p /> | Description<_o3a_p /> |
---|---|
ApplicationName |
Rappelez-vous que le cadre d’appartenance permet à un répertoire d’utilisateurs unique d’être partitionné sur plusieurs applications. Ce paramètre indique le nom de la partition d’application utilisée par le fournisseur d’appartenances. Si cette valeur n’est pas spécifiée explicitement, elle est définie, au moment de l’exécution, sur la valeur du chemin d’accès racine virtuel de l’application. |
commandTimeout |
Spécifie la valeur du délai d’expiration de la commande SQL (en secondes). La valeur par défaut est 30. |
connectionStringName |
Le nom de la chaîne de connexion de l’élément <connectionStrings> à utiliser pour se connecter à la base de données du répertoire d’utilisateurs. Cette valeur est requise. |
description |
Fournit une description conviviale du fournisseur inscrit. |
enablePasswordRetrieval |
Spécifie si les utilisateurs peuvent récupérer leur mot de passe oublié. La valeur par défaut est false . |
enablePasswordReset |
Indique si les utilisateurs sont autorisés à réinitialiser leur mot de passe. La valeur par défaut est true . |
maxInvalidPasswordAttempts |
Nombre maximal de tentatives de connexion infructueuses qui peuvent se produire pour un utilisateur donné pendant la passwordAttemptWindow spécifiée avant que l’utilisateur ne soit verrouillé. La valeur par défaut est 5. |
minRequiredNonalphanumericCharacters |
Nombre minimal de caractères non alphanumériques qui doivent apparaître dans le mot de passe d’un utilisateur. Cette valeur doit être comprise entre 0 et 128 ; la valeur par défaut est 1. |
minRequiredPasswordLength |
Nombre minimal de caractères requis dans un mot de passe. Cette valeur doit être comprise entre 0 et 128 ; la valeur par défaut est 7. |
name |
Nom du fournisseur inscrit. Cette valeur est requise. |
passwordAttemptWindow |
Nombre de minutes pendant lesquelles les tentatives de connexion ayant échoué sont suivies. Si un utilisateur fournit des informations d’identification de connexion non valides maxInvalidPasswordAttempts fois dans cette fenêtre spécifiée, ils sont verrouillés. La valeur par défaut est 10. |
PasswordFormat |
Format de stockage de mot de passe : Clear , Hashed ou Encrypted . La valeur par défaut est Hashed . |
passwordStrengthRegularExpression |
Si elle est fournie, cette expression régulière est utilisée pour évaluer la force du mot de passe sélectionné par l’utilisateur lors de la création d’un compte ou lors de la modification de son mot de passe. La valeur par défaut est une chaîne vide. |
requiresQuestionAndAnswer |
Spécifie si un utilisateur doit répondre à sa question de sécurité lors de la récupération ou de la réinitialisation de son mot de passe. La valeur par défaut est true . |
requiresUniqueEmail |
Indique si tous les comptes d’utilisateur d’une partition d’application donnée doivent avoir une adresse e-mail unique. La valeur par défaut est true . |
type |
Spécifie le type du fournisseur. Cette valeur est requise. |
Tableau 2: Paramètres d’appartenance et de configuration SqlMembershipProvider
Outre AspNetSqlMembershipProvider
, d’autres fournisseurs d’appartenances peuvent être inscrits sur une base application par application en ajoutant un balisage similaire au fichier Web.config
.
Remarque
L’infrastructure rôles fonctionne de la même façon : il existe un fournisseur de rôles inscrit par défaut dans machine.config
et les fournisseurs inscrits peuvent être personnalisés sur une base d’application par application dans Web.config
. Nous allons examiner l’infrastructure des rôles et son balisage de configuration en détail dans un didacticiel ultérieur.
Personnalisation des paramètres deSqlMembershipProvider
Le SqlMembershipProvider
par défaut (AspNetSqlMembershipProvider
) a son attribut connectionStringName
défini sur LocalSqlServer
. Comme le fournisseur AspNetSqlMembershipProvider
, le nom de chaîne de connexion LocalSqlServer
est défini dans machine.config
.
Avertissement
Il semble que l’échantillon que vous recherchez a été déplacé ! Nous sommes assurés que nous travaillons à résoudre ce problème.
Comme vous pouvez le voir, cette chaîne de connexion définit une base de données SQL 2005 Express Edition située à |DataDirectory|aspnetdb.mdf. La chaîne |DataDirectory| est traduite pendant l'exécution pour pointer vers le répertoire ~/App_Data/
, de sorte que le chemin de la base de données |DataDirectory|aspnetdb.mdf se traduit par ~/App_Data
/aspnet.mdf
.
Si nous n’avons pas spécifié d’informations sur le fournisseur d’appartenances dans le fichier Web.config
de notre application, l’application utilise le fournisseur d’appartenances inscrit par défaut, AspNetSqlMembershipProvider
. Si la base de données ~/App_Data/aspnet.mdf
n’existe pas, le runtime ASP.NET le crée automatiquement et ajoute le schéma des services d’application. Toutefois, nous ne voulons pas utiliser la base de données aspnet.mdf
; nous voulons plutôt utiliser la base de données SecurityTutorials.mdf
que nous avons créée à l’étape 2. Cette modification peut être effectuée de deux façons :
- Spécifiez une valeur pour le nom de chaîne de connexion
LocalSqlServer
dansWeb.config
. En remplaçant la valeur de nom de chaîne de connexionLocalSqlServer
dansWeb.config
, nous pouvons utiliser le fournisseur d’appartenances inscrit par défaut (AspNetSqlMembershipProvider
) et utiliser correctement la base de donnéesSecurityTutorials.mdf
. Cette approche est appropriée si vous êtes satisfait des paramètres de configuration spécifiés parAspNetSqlMembershipProvider
. Pour plus d’informations sur cette technique, consultez billet de blog de Scott Guthrie, Configuration ASP.NET 2.0 Application Services pour utiliser SQL Server 2000 ou SQL Server 2005. - Ajouter un nouveau fournisseur inscrit de type
SqlMembershipProvider
et configurer son paramètre deconnectionStringName
pour pointer vers la base de donnéesSecurityTutorials.mdf
. Cette approche est utile dans les scénarios où vous souhaitez personnaliser d’autres propriétés de configuration en plus de la chaîne de connexion de base de données. Dans mes propres projets, j’utilise toujours cette approche en raison de sa flexibilité et de sa lisibilité.
Avant de pouvoir ajouter un nouveau fournisseur inscrit qui référence la base de données SecurityTutorials.mdf
, nous devons d’abord ajouter une valeur de chaîne de connexion appropriée dans la section <connectionStrings>
de Web.config
. Le balisage suivant ajoute une nouvelle chaîne de connexion nommée SecurityTutorialsConnectionString
qui fait référence à la base de données SecurityTutorials.mdf
SQL Server 2005 Express Edition dans le dossier App_Data
.
Avertissement
Il semble que l’échantillon que vous recherchez a été déplacé ! Nous sommes assurés que nous travaillons à résoudre ce problème.
Remarque
Si vous utilisez un autre fichier de base de données, mettez à jour la chaîne de connexion si nécessaire. Pour plus d’informations sur la création de la chaîne de connexion correcte, veuillez consulter ConnectionStrings.com.
Ensuite, ajoutez le balisage de configuration d’appartenance suivant au fichier Web.config
. Ce balisage inscrit un nouveau fournisseur nommé SecurityTutorialsSqlMembershipProvider
.
Avertissement
Il semble que l’échantillon que vous recherchez s’est déplacé ! Nous sommes assurés que nous travaillons à résoudre ce problème.
Outre l’inscription du fournisseur SecurityTutorialsSqlMembershipProvider
, le balisage ci-dessus définit la SecurityTutorialsSqlMembershipProvider
comme fournisseur par défaut (via l’attribut defaultProvider
dans l’élément <membership>
). Rappelez-vous que plusieurs fournisseurs peuvent être enregistrés dans le framework d’adhésion. Étant donné que AspNetSqlMembershipProvider
est inscrit en tant que premier fournisseur dans machine.config
, il sert de fournisseur par défaut, sauf indication contraire.
Actuellement, notre application a deux fournisseurs inscrits : AspNetSqlMembershipProvider
et SecurityTutorialsSqlMembershipProvider
. Toutefois, avant d’inscrire le fournisseur de SecurityTutorialsSqlMembershipProvider
, nous pourrions avoir effacé tous les fournisseurs précédemment inscrits en ajoutant un élément <clear />
immédiatement avant notre élément <add>
. Cela supprimerait le AspNetSqlMembershipProvider
de la liste des fournisseurs inscrits, ce qui signifie que le SecurityTutorialsSqlMembershipProvider
serait le seul fournisseur d'adhésion inscrit. Si nous avons utilisé cette approche, nous n’aurions pas besoin de marquer l'SecurityTutorialsSqlMembershipProvider
comme fournisseur par défaut, car il s’agirait du seul fournisseur d’appartenance inscrit. Pour en savoir plus sur l’utilisation de <clear />
, consultez Utiliser (Using) <clear />
lors de l’ajout de fournisseurs.
Notez que le paramètre connectionStringName
pour SecurityTutorialsSqlMembershipProvider
fait référence au nom de la chaîne de connexion SecurityTutorialsConnectionString
qui vient d’être ajoutée et que son paramètre pour applicationName
a été défini à SecurityTutorials. En outre, le paramètre requiresUniqueEmail
a été défini sur true
. Toutes les autres options de configuration sont identiques aux valeurs de AspNetSqlMembershipProvider
. N’hésitez pas à apporter des modifications de configuration ici, si vous le souhaitez. Par exemple, vous pouvez renforcer la force du mot de passe en exigeant deux caractères non alphanumériques au lieu d’un, ou en augmentant la longueur du mot de passe à huit caractères au lieu de sept.
Remarque
Sachez que le cadre de gestion des membres permet à un seul magasin d’utilisateurs d’être partitionné sur plusieurs applications. Le paramètre applicationName
du fournisseur d'adhésion indique l'application que le fournisseur utilise lors de l'interaction avec le magasin d'utilisateurs. Il est important de définir explicitement une valeur pour le paramètre de configuration applicationName
, car si le applicationName
n’est pas défini explicitement, il est affecté au chemin racine virtuel de l’application web au moment de l’exécution. Cela fonctionne correctement tant que le chemin d’accès racine virtuel de l’application ne change pas, mais si vous déplacez l’application vers un autre chemin, le paramètre applicationName
change également. Lorsque cela se produit, le fournisseur d’appartenances commence à utiliser une partition d’application différente de celle utilisée précédemment. Les comptes d’utilisateur créés avant le déplacement résideront dans une partition d’application différente et ces utilisateurs ne pourront plus se connecter au site. Pour une discussion plus approfondie sur le sujet, consultez Toujours définir la propriété applicationName
lors de la configuration de l’adhésion ASP.NET 2.0 et d’autres fournisseurs.
Résumé
À ce stade, nous disposons d’une base de données avec les services d’application configurés (SecurityTutorials.mdf
) et avons configuré notre application web afin que l’infrastructure d’appartenance utilise le fournisseur de SecurityTutorialsSqlMembershipProvider
que nous venons d’inscrire. Ce fournisseur inscrit est de type SqlMembershipProvider
et a son connectionStringName
défini sur la chaîne de connexion appropriée (SecurityTutorialsConnectionString
) et sa valeur de applicationName
explicitement définie.
Nous sommes maintenant prêts à utiliser l’infrastructure d’appartenance à partir de notre application. Dans le tutoriel suivant, nous allons examiner comment créer de nouveaux comptes d’utilisateur. Nous allons ensuite explorer l’authentification des utilisateurs, l’exécution d’une autorisation basée sur l’utilisateur et le stockage d’informations supplémentaires relatives à l’utilisateur dans la base de données.
Bonne programmation !
Lecture plus poussée
Pour plus d’informations sur les sujets abordés dans ce tutoriel, consultez les ressources suivantes :
- Toujours définir la propriété
applicationName
lors de la configuration de l’adhésion ASP.NET 2.0 et d’autres fournisseurs - Configuration de ASP.NET 2.0 Application Services pour utiliser SQL Server 2000 ou SQL Server 2005
- Télécharger SQL Server Management Studio
- Analyse du système d'appartenance, des rôles et des profils dans ASP.NET 2.0
- L’élément
<add>
pour les fournisseurs d’adhésion - L’élément
<membership>
- L’élément
<providers>
pour l’adhésion - Utilisation de
<clear />
lors de l’ajout de fournisseurs - Travailler directement avec le
SqlMembershipProvider
Formation vidéo sur les rubriques contenues dans ce didacticiel
À propos de l’auteur
Scott Mitchell, auteur de plusieurs livres ASP/ASP.NET et fondateur de 4GuysFromRolla.com, travaille avec les technologies Web Microsoft depuis 1998. Scott travaille en tant que consultant indépendant, formateur et écrivain. Son dernier livre est Sams Teach Yourself ASP.NET 2.0 en 24 heures. Scott peut être accessible à mitchell@4guysfromrolla.com ou via son blog à http://ScottOnWriting.NET.
Merci spécial à
Cette série de tutoriels a été examinée par de nombreux réviseurs utiles. Le réviseur principal pour ce tutoriel était Alicja Maziarz. Vous souhaitez consulter mes prochains articles MSDN ? Si c’est le cas, envoyez-moi un message à mitchell@4GuysFromRolla.com.
précédent suivant