Création du schéma d’appartenance dans SQL Server (C#)
par Scott Mitchell
Notes
Depuis la rédaction 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 d’identité ASP.NET plutôt que les fournisseurs d’appartenances proposés au moment de la rédaction de cet article. ASP.NET Identity présente un certain nombre d’avantages par rapport au système d’appartenance ASP.NET, notamment :
- Meilleures performances
- Extensibilité et testabilité améliorées
- Prise en charge d’OAuth, OpenID Connect et de l’authentification à deux facteurs
- Prise en charge des identités basées sur les revendications
- Meilleure interopérabilité avec ASP.Net Core
Télécharger le code ou télécharger un FICHIER PDF
Ce tutoriel commence par examiner les techniques permettant d’ajouter le schéma nécessaire à la base de données afin d’utiliser SqlMembershipProvider. Ensuite, nous examinerons les tables clés du schéma et discuterons de leur objectif et de leur importance. Ce tutoriel 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 ont examiné l’utilisation de 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 à un site web et de le mémoriser à travers les visites de page grâce à l’utilisation de tickets d’authentification. La FormsAuthentication
classe inclut des méthodes pour générer le ticket et l’ajouter aux cookies du visiteur. Le FormsAuthenticationModule
examine toutes les requêtes entrantes et, pour celles qui ont un ticket d’authentification valide, crée et associe un GenericPrincipal
objet et un FormsIdentity
objet à 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, d’analyser 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 aux comptes d’utilisateur.
Avant ASP.NET 2.0, les développeurs étaient sur le point d’implémenter toutes ces tâches liées au compte d’utilisateur. Heureusement, l’équipe ASP.NET a reconnu cette lacune et a 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 permettant d’accomplir les principales tâches liées au compte d’utilisateur. Cette infrastructure est générée sur le modèle du fournisseur, ce qui permet aux développeurs de brancher une implémentation personnalisée dans une API standardisée.
Comme indiqué dans le didacticiel De base sur la sécurité et la prise en charge des ASP.NET , .NET Framework est fourni avec deux fournisseurs d’appartenance intégrés : ActiveDirectoryMembershipProvider
et SqlMembershipProvider
. Comme son nom l’indique, utilise SqlMembershipProvider
une base de données Microsoft SQL Server comme magasin d’utilisateurs. Pour utiliser ce fournisseur dans une application, nous devons indiquer au fournisseur quelle base de données utiliser en tant que magasin. Comme vous pouvez l’imaginer, le SqlMembershipProvider
s’attend à ce que la base de données du magasin d’utilisateurs dispose de certaines tables de base de données, 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 permettant d’ajouter le schéma nécessaire à la base de données afin d’utiliser le SqlMembershipProvider
. Ensuite, nous examinerons les tables clés du schéma et discuterons de leur objectif et de leur importance. Ce tutoriel se termine par un aperçu de la façon d’indiquer à une application ASP.NET quel fournisseur l’infrastructure d’appartenance doit utiliser.
C’est parti !
Étape 1 : Décider où placer le 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 SqlMembershipProvider
schéma de base de données, nous devons décider de 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 vous 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 :
- Maintenabilité ' 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 liées à l’appartenance dans la même base de données que les tables d’application, il est possible d’établir des contraintes de clé étrangère entre les clés primaires des tables liées à l’appartenance et les tables d’application associées.
Le découplage du magasin d’utilisateurs et des données d’application en bases de données distinctes n’a de sens que si vous avez plusieurs applications qui utilisent chacune des bases de données distinctes, mais qui doivent partager un magasin d’utilisateurs commun.
Création d’une base de données
L’application que nous créons 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 lui ajouter le schéma requis par le SqlMembershipProvider
fournisseur (voir Étape 2).
Notes
Tout au long de cette série de tutoriels, nous allons utiliser une base de données Microsoft SQL Server 2005 Express Edition pour stocker nos tables d’applications et le SqlMembershipProvider
schéma. Cette décision a été prise pour deux raisons : premièrement, en raison de son coût - gratuit - l’édition Express est la version la plus accessible en lecture de SQL Server 2005 ; deuxièmement, les bases de données SQL Server 2005 Express Edition peuvent être placées directement dans l’application web de App_Data
l’application web , ce qui permet d’empaqueter la base de données et l’application web dans un fichier ZIP et de le redéployer sans instructions d’installation ou options de configuration spéciales. Si vous préférez utiliser une version non Express Edition de SQL Server, n’hésitez pas. Les étapes sont pratiquement identiques. Le SqlMembershipProvider
schéma fonctionne avec n’importe quelle version de Microsoft SQL Server 2000 et versions ultérieures.
À partir du Explorateur de solutions, cliquez avec le bouton droit sur le App_Data
dossier et choisissez Ajouter un nouvel élément. (Si vous ne voyez pas de App_Data
dossier dans votre projet, cliquez avec le bouton droit sur le projet dans Explorateur de solutions, sélectionnez Ajouter ASP.NET dossier, puis sélectionnez App_Data
.) Dans la boîte de dialogue Ajouter un nouvel élément, choisissez d’ajouter un nouveau SQL Database nommé SecurityTutorials.mdf
. Dans ce tutoriel, nous allons ajouter le SqlMembershipProvider
schéma à cette base de données ; dans les tutoriels 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 nommée SecurityTutorials.mdf
SQL Database au App_Data
dossier (cliquez pour afficher l’image en taille réelle)
L’ajout d’une base de données au App_Data
dossier l’inclut automatiquement dans la vue Explorer de base de données. (Dans la version non Express Edition de Visual Studio, le Explorer de base de données est appelé server Explorer.) Accédez à l’Explorer base de données et développez la base de données qui vient d’être ajoutéeSecurityTutorials
. Si vous ne voyez pas le Explorer de base de données à l’écran, accédez au menu Affichage et choisissez Explorer base de données, ou appuyez sur Ctrl+Alt+S. Comme le montre la figure 2, la SecurityTutorials
base de données est vide : elle ne contient ni tables, ni vues, ni procédures stockées.
Figure 2 : La SecurityTutorials
base de données est actuellement vide (cliquez pour afficher l’image en taille réelle)
Étape 2 : Ajout duSqlMembershipProvider
schéma à la base de données
Nécessite SqlMembershipProvider
l’installation d’un ensemble particulier de tables, de vues et de procédures stockées dans la base de données du magasin d’utilisateurs. Ces objets de base de données requis peuvent être ajoutés à l’aide de l’outilaspnet_regsql.exe
. Ce fichier se trouve dans le %WINDIR%\Microsoft.Net\Framework\v2.0.50727\
dossier .
Notes
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 c’est ce que nous allons examiner dans ce tutoriel. L’interface de ligne de commande est utile lorsque l’ajout du SqlMembershipProvider
schéma doit être automatisé, par exemple dans les scripts de build ou les scénarios de test automatisé.
L’outil aspnet_regsql.exe
est utilisé pour ajouter ou supprimer ASP.NET services d’application dans une base de données SQL Server spécifiée. Les services d’application ASP.NET englobent les schémas des SqlMembershipProvider
et , SqlRoleProvider
ainsi que les schémas des fournisseurs SQL pour d’autres frameworks ASP.NET 2.0. Nous devons fournir deux informations à l’outil aspnet_regsql.exe
:
- Si nous voulons 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
En invitant la base de données à utiliser, 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 un chaîne de connexion lorsque vous utilisez la base de données via une page web ASP.NET. Toutefois, 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 App_Data
dossier est un peu plus complexe.
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 App_Data
dossier. Si vous n’utilisez pas SQL Server 2005 Express Edition n’hésitez pas à passer directement à la section Installation des services d’application.
Détermination du nom du serveur et de la base de données d’une base de données SQL Server 2005 Express Edition dans leApp_Data
dossier
Pour utiliser l’outil aspnet_regsql.exe
, nous devons connaître les noms des serveurs et des bases de données. Le nom du serveur est localhost\InstanceName
. Très probablement, instanceName est SQLExpress
. Toutefois, si vous avez installé SQL Server 2005 Express Edition manuellement (c’est-à-dire que 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 de instance.
Le nom de la base de données est un peu plus difficile à déterminer. Les bases de données dans le App_Data
dossier 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 gratuitement Express Edition de SQL Server Management Studio.
Notes
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 tous 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 localhost\InstanceName
base de données pour SQL Server 2005 Express Edition. Comme indiqué précédemment, il est probable que le nom 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 en taille réelle)
Une fois connecté au SQL Server 2005 Express Edition instance, Management Studio affiche les dossiers pour les bases de données, les paramètres de sécurité, les objets serveur, etc. Si vous développez l’onglet Bases de données, vous verrez que la SecurityTutorials.mdf
base de données n’est pas inscrite dans la base de données instance . Nous devons d’abord attacher la base de données.
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 SecurityTutorials.mdf
base de données, puis cliquez sur OK. La figure 4 montre la boîte de dialogue Attacher des bases de données une fois la SecurityTutorials.mdf
base de données sélectionnée. La figure 5 montre l’Explorateur d'objets de Management Studio une fois que la base de données a été correctement attachée.
Figure 4 : Attacher la SecurityTutorials.mdf
base de données (cliquer pour afficher l’image en taille réelle)
Figure 5 : La SecurityTutorials.mdf
base de données apparaît dans le dossier Bases de données (cliquez pour afficher l’image en taille réelle)
Comme le montre la figure 5, la SecurityTutorials.mdf
base de données a un nom plutôt abscons. Changeons-le en 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 du fichier, mais simplement le nom utilisé par la base de données pour s’identifier pour SQL Server.
Figure 6 : Renommer la base de données SecurityTutorialsDatabase
en (Cliquer pour afficher l’image en taille réelle)
À ce stade, nous connaissons les noms du serveur et de la base de données pour le SecurityTutorials.mdf
fichier de base de données : 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 Windows Explorer pour accéder au dossier approprié et double-cliquer sur le aspnet_regsql.exe
fichier. Les deux approches obtiendront 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 ASP.NET SQL Server. L’Assistant facilite l’ajout ou la suppression des services d’application ASP.NET sur une base de données spécifiée. Le premier écran de l’Assistant, illustré à la figure 7, décrit l’objectif de l’outil.
Figure 7 : Utiliser la ASP.NET SQL Server’Assistant Installation permet d’ajouter le schéma d’appartenance (cliquer pour afficher l’image en taille réelle)
La deuxième étape de l’Assistant nous demande si nous voulons ajouter les services d’application ou les supprimer. Étant donné que nous voulons ajouter les tables, les vues et les procédures stockées nécessaires pour , 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 les services d’application (cliquez pour afficher l’image en taille réelle)
La troisième étape invite à entrer 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 avez suivi ce didacticiel et que vous avez ajouté la SecurityTutorials.mdf
base de données à App_Data
, l’avez attachée à localhost\InstanceName
et renommée en SecurityTutorialsDatabase
, utilisez les valeurs suivantes :
- Serveur :
localhost\InstanceName
- Authentification Windows
- Base de données :
SecurityTutorialsDatabase
Figure 9 : Entrer les informations de base de données (cliquer pour afficher l’image en taille réelle)
Après avoir entré les informations de base de données, cliquez sur Suivant. L’étape finale récapitule les étapes qui seront effectuées. Cliquez sur Suivant pour installer les services d’application, puis sur Terminer pour terminer l’Assistant.
Notes
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 SecurityTutorialsDatabase
base de données, 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 accédez à l’Explorer de base 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 une variété d’affichages et de procédures stockées sous les dossiers Affichages et Procédures stockées. Ces objets de base de données constituent le schéma des services d’application. Nous allons examiner 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 (cliquez pour afficher l’image en taille réelle)
Notes
L’interface aspnet_regsql.exe
utilisateur graphique de l’outil installe l’ensemble du schéma des services d’application. Toutefois, lors de l’exécution aspnet_regsql.exe
à partir de la ligne de commande, vous pouvez spécifier les composants des services d’application particuliers à installer (ou supprimer). Par conséquent, si vous souhaitez ajouter uniquement les tables, les vues et les procédures stockées nécessaires pour les SqlMembershipProvider
fournisseurs 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 avec des WINDIR%\Microsoft.Net\Framework\v2.0.50727\
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 à .SqlMembershipProvider
Toutefois, nous devons toujours indiquer à l’infrastructure d’appartenance qu’elle doit utiliser le SqlMembershipProvider
(par exemple, le ActiveDirectoryMembershipProvider
) et que le SqlMembershipProvider
doit utiliser la SecurityTutorials
base de données. Nous allons voir 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 viennent d’être créés.
Étape 3 : Aperçu des tables principales du schéma
Lorsque vous utilisez les frameworks Appartenance et Rôles dans une application ASP.NET, les détails de l’implémentation sont encapsulés par le fournisseur. Dans les prochains tutoriels, nous interfacerons avec ces frameworks via les classes et Roles
.Membership
NET Framework. Lorsque vous utilisez ces API de haut niveau, nous n’avons pas besoin de nous préoccuper des détails de bas niveau, tels que les requêtes exécutées ou les tables modifiées par et SqlMembershipProvider
SqlRoleProvider
.
Dans ce cas, nous pourrions utiliser en toute confiance les frameworks Appartenance et 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 devrons peut-être créer des entités liées à des utilisateurs ou à des rôles. Il permet de se familiariser avec les schémas et SqlRoleProvider
lors de l’établissement de contraintes de clé étrangère entre les tables de données d’application et les tables créées à l’étape SqlMembershipProvider
2. En outre, dans certaines rares circonstances, nous pouvons avoir besoin d’interagir avec les magasins d’utilisateurs et de rôles directement au niveau de la base de données (au lieu des Membership
classes ou Roles
).
Partitionnement du magasin d’utilisateurs dans des applications
Les frameworks Appartenance et Rôles sont conçus de telle sorte qu’un seul magasin d’utilisateurs et de rôles puisse être partagé entre de nombreuses applications différentes. Une application ASP.NET qui utilise les frameworks Membership ou Roles doit spécifier la partition d’application à utiliser. En bref, plusieurs applications web peuvent utiliser les mêmes magasins d’utilisateurs et de rôles. La figure 11 illustre les magasins d’utilisateurs et de rôles qui sont partitionnés en trois applications : HRSite, CustomerSite et SalesSite. Ces trois applications web ont chacune leurs propres utilisateurs et rôles uniques, mais elles stockent toutes 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 entre plusieurs applications (cliquer pour afficher l’image en taille réelle)
La aspnet_Applications
table 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 dans cette table. La aspnet_Applications
table 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 unique convivial pour chaque application.
Les autres tables liées à l’appartenance et au rôle renvoient au ApplicationId
champ dans aspnet_Applications
. Par exemple, la aspnet_Users
table, qui contient un enregistrement pour chaque compte d’utilisateur, a un ApplicationId
champ de clé étrangère ; idem pour la aspnet_Roles
table. Le ApplicationId
champ 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 aspnet_Users
table 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, constitue les informations d’identification de l’utilisateur. (Le mot de passe d’un utilisateur est stocké dans la aspnet_Membership
table.) ApplicationId
lie le compte d’utilisateur à une application particulière dans aspnet_Applications
. Il existe une contrainte composite UNIQUE
sur les UserName
colonnes et .ApplicationId
Cela garantit que dans une application donnée, chaque nom d’utilisateur est unique, tout en autorisant l’utilisation du même UserName
dans différentes applications.
Le aspnet_Membership
tableau inclut des informations supplémentaires sur le compte d’utilisateur, 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 dans les aspnet_Users
tableaux et aspnet_Membership
. Cette relation est garantie par le UserId
champ dans aspnet_Membership
, qui sert de clé primaire de la table. À l’instar de la aspnet_Users
table, aspnet_Membership
inclut un ApplicationId
champ 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 aspnet_Membership
table. Permet SqlMembershipProvider
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 en texte brut. Je déconseille fortement d’utiliser cette option. Si la base de données est compromise, que ce soit par un pirate informatique qui trouve une porte dérobée ou par un employé mécontent qui a accès à la base de données, les informations d’identification de chaque utilisateur sont là pour la prise.
- Hachage : les mots de passe sont hachés à l’aide d’un algorithme de hachage unidirectionnel et d’une valeur salt générée de manière aléatoire. Cette valeur hachée (avec le sel) est stockée dans la base de données.
- Chiffré : 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 SqlMembershipProvider
paramètres spécifiés dans Web.config
. Nous allons examiner la personnalisation des paramètres à l’étape SqlMembershipProvider
4. Le comportement par défaut consiste à stocker le hachage du mot de passe.
Les colonnes chargées de stocker le 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 Clear ; 1 pour Hachage ; 2 pour Encrypted. PasswordSalt
se voit attribuer 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 du calcul du hachage du mot de passe. Enfin, la Password
colonne 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 à quoi ces trois colonnes peuvent ressembler pour les 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== |
Chiffré | 62RZgDvhxykkqsMchZ0Yly7HS6onhpaoCYaRxV8g0F4CW56OXUU3e7Inza9j9BKp | 2 | LSRzhGS/aa/oqAXGLHJNBw== |
Tableau 1 : Exemples de valeurs pour les champs Password-Related lors du stockage du mot de passe MySecret !
Notes
L’algorithme de chiffrement ou de hachage particulier utilisé par est SqlMembershipProvider
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 à quels 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 aspnet_Roles
table représente un rôle pour une application particulière. Tout comme le aspnet_Users
tableau, le aspnet_Roles
tableau 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 composite UNIQUE
sur les RoleName
colonnes et ApplicationId
, garantissant que dans une application donnée, chaque nom de rôle est unique.
La aspnet_UsersInRoles
table sert de mappage entre les utilisateurs et les rôles. Il n’y a que deux colonnes - UserId
et RoleId
- et ensemble, elles constituent 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 de fournisseur, telles que les infrastructures Appartenance et Rôles, ne disposent pas elles-mêmes des détails d’implémentation et délèguent cette responsabilité à une classe de fournisseur. Dans le cas de l’infrastructure Membership, la Membership
classe 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 Membership
classe renvoient la requête au fournisseur configuré . Nous allons utiliser le SqlMembershipProvider
. Quand nous invoquons l’une des méthodes de la Membership
classe , comment l’infrastructure d’appartenance sait-elle déléguer l’appel à ?SqlMembershipProvider
La Membership
classe a une Providers
propriété qui contient une référence à toutes les classes de fournisseur inscrites pouvant être utilisées par l’infrastructure Membership. 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 Providers
collection, 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 de l’infrastructure 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 .SqlMembershipProvider
Le Providers
contenu de la propriété 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’appartenances par défaut est inscrit dans machine.config
(situé à l’emplacement suivant %WINDIR%\Microsoft.Net\Framework\v2.0.50727\CONFIG)
:
<membership>
<providers>
<add name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="LocalSqlServer"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
applicationName="/"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="7"
minRequiredNonalphanumericCharacters="1"
passwordAttemptWindow="10"
passwordStrengthRegularExpression=""/>
</providers>
</membership>
Comme le montre le balisage ci-dessus, l’élément<membership>
définit les paramètres de configuration de l’infrastructure Membership tandis que l’élément<providers>
enfant spécifie les fournisseurs inscrits. Les fournisseurs peuvent être ajoutés ou supprimés à l’aide des <add>
éléments 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
.
En plus des name
attributs et type
, l’élément <add>
contient des attributs qui définissent les valeurs de différents paramètres de configuration. Le tableau 2 répertorie les paramètres de configuration spécifiques disponibles SqlMembershipProvider
, ainsi qu’une description de chacun d’eux.
Notes
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 SqlMembershipProvider
classe . Notez que tous les paramètres de configuration dans AspNetSqlMembershipProvider
ne correspondent pas aux valeurs par défaut de la SqlMembershipProvider
classe . Par exemple, s’il n’est pas spécifié dans un fournisseur d’appartenances, la valeur par défaut est requiresUniqueEmail
true. Toutefois, le AspNetSqlMembershipProvider
remplace cette valeur par défaut en spécifiant explicitement la valeur .false
Paramètre< _o3a_p /> | Description< _o3a_p /> |
---|---|
ApplicationName |
Rappelez-vous que l’infrastructure d’appartenance permet de partitionner un seul magasin d’utilisateurs entre 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 |
Nom du chaîne de connexion dans l’élément <connectionStrings> à utiliser pour se connecter à la base de données du magasin 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 le spécifié passwordAttemptWindow 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 heures d’identification de connexion non valides maxInvalidPasswordAttempts dans cette fenêtre spécifiée, elles sont verrouillées. La valeur par défaut est 10. |
PasswordFormat |
Format de stockage du mot de passe : Clear , Hashed ou Encrypted . Par défaut, il s’agit de Hashed . |
passwordStrengthRegularExpression |
Si elle est fournie, cette expression régulière est utilisée pour évaluer la force du mot de passe sélectionné de 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 SqlMembershipProvider
de configuration
En plus de AspNetSqlMembershipProvider
, d’autres fournisseurs d’appartenance peuvent être inscrits application par application en ajoutant un balisage similaire au Web.config
fichier.
Notes
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 application par application dans Web.config
. Nous examinerons en détail l’infrastructure de rôles et son balisage de configuration dans un prochain tutoriel.
Personnalisation desSqlMembershipProvider
paramètres
L’attribut par défaut SqlMembershipProvider
(AspNetSqlMembershipProvider
) a la connectionStringName
valeur LocalSqlServer
. Comme le AspNetSqlMembershipProvider
fournisseur, le nom LocalSqlServer
chaîne de connexion est défini dans machine.config
.
<connectionStrings>
<add name="LocalSqlServer"
connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
providerName="System.Data.SqlClient"/>
</connectionStrings>
Comme vous pouvez le voir, cette chaîne de connexion définit une base de données SQL 2005 Express Edition située à l’adresse |DataDirectory|aspnetdb.mdf'. Chaîne |DataDirectory| est traduit au moment de l’exécution pour pointer vers le ~/App_Data/
répertoire, donc le chemin de la base de données |DataDirectory|aspnetdb.mdf » se ~/App_Data
/aspnet.mdf
traduit par .
Si nous n’avons spécifié aucune information sur le fournisseur d’appartenance dans le fichier de Web.config
notre application, l’application utilise le fournisseur d’appartenance inscrit par défaut, AspNetSqlMembershipProvider
. Si la ~/App_Data/aspnet.mdf
base de données n’existe pas, le runtime ASP.NET la crée automatiquement et ajoute le schéma des services d’application. Toutefois, nous ne voulons pas utiliser la aspnet.mdf
base de données ; nous voulons plutôt utiliser la base de données que nous avons créée à l’étape SecurityTutorials.mdf
2. Cette modification peut être effectuée de l’une des deux façons suivantes :
- Spécifiez une valeur pour le
LocalSqlServer
chaîne de connexion nom dansWeb.config
. En remplaçant laLocalSqlServer
valeur de nom chaîne de connexion dansWeb.config
, nous pouvons utiliser le fournisseur d’appartenance inscrit par défaut (AspNetSqlMembershipProvider
) et le faire fonctionner correctement avec laSecurityTutorials.mdf
base de données. Cette approche est correcte si vous vous contentez des paramètres de configuration spécifiés parAspNetSqlMembershipProvider
. Pour plus d’informations sur cette technique, consultez le billet de blog de Scott Guthrie, Configuring ASP.NET 2.0 Application Services to Use SQL Server 2000 ou SQL Server 2005. - Ajouter un nouveau fournisseur inscrit de type
SqlMembershipProvider
et configurez sonconnectionStringName
paramètre pour pointer vers leSecurityTutorials.mdf
Base. Cette approche est utile dans les scénarios où vous souhaitez personnaliser d’autres propriétés de configuration en plus de la base de données chaîne de connexion. 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 fait référence à la SecurityTutorials.mdf
base de données, nous devons d’abord ajouter une valeur de chaîne de connexion appropriée dans la <connectionStrings>
section 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 SQL Server 2005 Express Edition SecurityTutorials.mdf
dans le App_Data
dossier .
<configuration>
<connectionStrings>
<add name="SecurityTutorialsConnectionString"
connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\SecurityTutorials.mdf;Integrated Security=True;User Instance=True"
providerName="System.Data.SqlClient"/>
</connectionStrings>
<system.web>
... Configuration markup removed for brevity ...
</system.web>
</configuration>
Notes
Si vous utilisez un autre fichier de base de données, mettez à jour le chaîne de connexion si nécessaire. Pour plus d’informations sur la formation des chaîne de connexion correctes, reportez-vous à ConnectionStrings.com.
Ensuite, ajoutez le balisage de configuration d’appartenance suivant au Web.config
fichier. Ce balisage inscrit un nouveau fournisseur nommé SecurityTutorialsSqlMembershipProvider
.
<configuration>
<connectionStrings>
<add name="SecurityTutorialsConnectionString"
connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\SecurityTutorials.mdf;Integrated Security=True;User Instance=True"
providerName="System.Data.SqlClient"/>
</connectionStrings>
<system.web>
<membership defaultProvider="SecurityTutorialsSqlMembershipProvider">
<providers>
<!--Add a customized SqlMembershipProvider -->
<add name="SecurityTutorialsSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="SecurityTutorialsConnectionString"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
applicationName="SecurityTutorials"
requiresUniqueEmail="true"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="7"
minRequiredNonalphanumericCharacters="1"
passwordAttemptWindow="10"
passwordStrengthRegularExpression=""/>
</providers>
</membership>
... Configuration markup removed for brevity ...
</system.web>
</configuration>
En plus d’inscrire le SecurityTutorialsSqlMembershipProvider
fournisseur, le balisage ci-dessus définit comme SecurityTutorialsSqlMembershipProvider
fournisseur par défaut (via l’attribut defaultProvider
dans l’élément <membership>
). Rappelez-vous que l’infrastructure d’appartenance peut avoir plusieurs fournisseurs inscrits. Étant AspNetSqlMembershipProvider
donné que 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 SecurityTutorialsSqlMembershipProvider
fournisseur, nous aurions pu effacer tous les fournisseurs précédemment inscrits en ajoutant un <clear />
élément juste avant notre <add>
élément. Cela effacerait le AspNetSqlMembershipProvider
de la liste des fournisseurs inscrits, ce qui signifie que le SecurityTutorialsSqlMembershipProvider
serait le seul fournisseur d’appartenance inscrit. Si nous utilisions cette approche, nous n’aurions pas besoin de marquer le SecurityTutorialsSqlMembershipProvider
comme fournisseur par défaut, car il s’agirait du seul fournisseur d’appartenance inscrit. Pour plus d’informations sur l’utilisation de <clear />
, consultez Utilisation <clear />
lors de l’ajout de fournisseurs.
Notez que le SecurityTutorialsSqlMembershipProvider
paramètre fait connectionStringName
référence au nom de chaîne de connexion qui vient d’être ajouté SecurityTutorialsConnectionString
et que sa applicationName
valeur a été définie sur SecurityTutorials. En outre, le requiresUniqueEmail
paramètre a été défini sur true
. Toutes les autres options de configuration sont identiques aux valeurs dans AspNetSqlMembershipProvider
. N’hésitez pas à apporter des modifications à la 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.
Notes
Rappelez-vous que l’infrastructure d’appartenance permet de partitionner un seul magasin d’utilisateurs entre plusieurs applications. Le paramètre du applicationName
fournisseur d’appartenances indique l’application utilisée par le fournisseur lors de l’utilisation du magasin d’utilisateurs. Il est important de définir explicitement une valeur pour le applicationName
paramètre de configuration, car si le applicationName
n’est pas explicitement défini, 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 applicationName
paramètre change également. Dans ce cas, 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 autre partition d’application et ces utilisateurs ne pourront plus se connecter au site. Pour une discussion plus approfondie à ce sujet, consultez Always Set the applicationName
Property When Configuring ASP.NET 2.0 Membership and Other Providers.
Résumé
À ce stade, nous avons une base de données avec les services d’application configurés (SecurityTutorials.mdf
) et nous avons configuré notre application web afin que l’infrastructure d’appartenance utilise le SecurityTutorialsSqlMembershipProvider
fournisseur que nous venons d’inscrire. Ce fournisseur inscrit est de type SqlMembershipProvider
et a son connectionStringName
chaîne de connexion approprié (SecurityTutorialsConnectionString
) et sa applicationName
valeur 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 des 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 !
En savoir plus
Pour plus d’informations sur les sujets abordés dans ce didacticiel, consultez les ressources suivantes :
- Toujours définir la
applicationName
propriété lors de la configuration de l’appartenance ASP.NET 2.0 et d’autres fournisseurs - Configuration des services d’application ASP.NET 2.0 pour utiliser SQL Server 2000 ou SQL Server 2005
- Télécharger SQL Server Management Studio
- Examen de l’appartenance, des rôles et du profil de ASP.NET 2.0
- Élément
<add>
pour les fournisseurs pour l’appartenance - Élément
<membership>
- Élément
<providers>
pour l’appartenance - Utilisation de
<clear />
lors de l’ajout de fournisseurs - Utilisation directe du
SqlMembershipProvider
Vidéo de formation sur les sujets contenus dans ce tutoriel
À 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 comme consultant indépendant, formateur et écrivain. Son dernier livre est Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Scott peut être joint à l’adresse mitchell@4guysfromrolla.com ou via son blog à l’adresse http://ScottOnWriting.NET.
Remerciements spéciaux à
Cette série de tutoriels a été examinée par de nombreux réviseurs utiles. Le réviseur principal de ce tutoriel était Alicja Maziarz. Vous souhaitez consulter mes prochains articles MSDN ? Si c’est le cas, déposez-moi une ligne à mitchell@4GuysFromRolla.com.