Partager via


Création du schéma d’appartenance dans SQL Server (VB)

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’appartenance 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 pdf

Ce didacticiel 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 de dire à une application ASP.NET quel fournisseur l’infrastructure d’appartenance doit utiliser.

Introduction

Les deux tutoriels 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 sur un site web et de le mémoriser entre les visites de page via l’utilisation de tickets d’authentification. La FormsAuthentication classe inclut des méthodes permettant de générer le ticket et de 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 demande 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 ultérieures, 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 aux comptes 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 .NET Framework qui fournissent une interface programmatique pour l’accomplissement de tâches principales liées au compte d’utilisateur. Cette infrastructure est créée au-dessus du modèle de fournisseur, ce qui permet aux développeurs de connecter une implémentation personnalisée à une API standardisée.

Comme indiqué dans le tutoriel De base sur la sécurité et la prise en charge des ASP.NET , le .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 comme 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 .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 de dire à 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 plusieurs 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 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 maintenance d’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.
  • 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’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 créons depuis le deuxième tutoriel n’a pas encore besoin d’une base de données. Nous en avons besoin maintenant, cependant, pour le magasin d’utilisateurs. Nous allons en créer un, puis y 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’application 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 de SQL Server 2005 ; deuxièmement, SQL Server 2005 Express Edition bases de données peuvent être placées directement dans l’application web de App_Data l’application web , ce qui en fait un outil permettant d’empaqueter la base de données et l’application web dans un seul fichier ZIP et de 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 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 créerons des tables supplémentaires pour capturer nos données d’application.

Ajouter une nouvelle base de données SecurityTutorials.mdf nommée SQL Database au dossier App_Data

Figure 1 : Ajouter une nouvelle SQL Database base de données nommée SecurityTutorials.mdf au App_Data dossier (cliquer pour afficher l’image en taille réelle)

L’ajout d’une base de données au dossier l’inclut App_Data 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 de 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.

La base de données SecurityTutorials est actuellement vide

Figure 2 : La SecurityTutorials base de données est actuellement vide (cliquer pour afficher l’image en taille réelle)

Étape 2 : Ajout duSqlMembershipProvidersché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 permet d’ajouter ou de supprimer ASP.NET services d’application à une base de données SQL Server spécifiée. Les services d’application ASP.NET englobent les schémas pour et SqlMembershipProvider , SqlRoleProviderainsi que les schémas des fournisseurs SQL pour les autres frameworks ASP.NET 2.0. Nous devons fournir deux bits d’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 serveur et du nom 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 impliquée.

La section suivante examine un moyen simple de spécifier le serveur et le nom 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 à la section Installation des services d’application.

Détermination du serveur et du nom de base de données d’une base de données SQL Server 2005 Express Edition dans leApp_Datadossier

Pour utiliser l’outil, nous devons connaître les aspnet_regsql.exe noms du serveur et de la base 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 (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 instance.

Le nom de la base de données est un peu plus difficile à déterminer. Les bases de données du 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 afin d’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 il n’est pas fourni 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.

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.

Se connecter à l’instance SQL Server 2005 Express Edition

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.

Attacher la base de données SecurityTutorials.mdf

Figure 4 : Attacher la SecurityTutorials.mdf base de données (cliquer pour afficher l’image en taille réelle)

La base de données SecurityTutorials.mdf s’affiche dans le dossier Bases de données

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.

Renommer la base de données en SecurityTutorialsDatabase

Figure 6 : Renommer la base de données SecurityTutorialsDatabaseen (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.

Utiliser la ASP.NET SQL Server l’Assistant Installation fait pour ajouter le schéma d’appartenance

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 , SqlMembershipProviderchoisissez 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.

Choisissez l’option Configurer SQL Server pour les services d’application

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\InstanceNameet renommée en SecurityTutorialsDatabase, utilisez les valeurs suivantes :

  • Serveur : localhost\InstanceName
  • Authentification Windows
  • Base de données : SecurityTutorialsDatabase

Entrez les informations de base de données

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.

Diverses tables, vues et procédures stockées ont été ajoutées à la base de données

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.sqlet 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 .MembershipNET 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 SqlMembershipProviderSqlRoleProvider.

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.

Les comptes d’utilisateur peuvent être partitionnés entre plusieurs applications

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, LoweredApplicationNameet 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 UserName est unique, mais qu’il permet d’utiliser le même UserName dans différentes applications.

Le aspnet_Membership tableau inclut des informations supplémentaires sur le compte d’utilisateur, comme 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 tables et aspnet_Membership . Cette relation est garantie par le UserId champ dans aspnet_Membership, qui sert de clé primaire de la table. Comme 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 sous forme de texte brut. Je déconseille vivement d’utiliser cette option. Si la base de données est compromise, que ce soit par un pirate informatique qui trouve une porte déroutante 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 de sel générée aléatoirement. Cette valeur de hachage (ainsi que 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 responsables du stockage du mot de passe sont Password, PasswordFormatet 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, que ce soit le mot de passe en texte brut, le hachage du mot de passe ou le 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 quels utilisateurs 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 , ce qui garantit 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 frameworks Appartenance et Rôles, ne sont pas elles-mêmes détaillées sur l’implémentation et délèguent cette responsabilité à une classe de fournisseur. Dans le cas de l’infrastructure d’appartenance, 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 demande 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 disponibles pour une utilisation par l’infrastructure d’appartenance. 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, parmi bien d’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’appartenance par défaut est inscrit dans machine.config (situé à l’adresse %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 noté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’appartenance, la requiresUniqueEmail valeur par défaut est 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 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’appartenance. 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 racine virtuel de l’application.
commandTimeout Spécifie la valeur de délai d’expiration de la commande SQL (en secondes). La valeur par défaut est 30.
connectionStringName Le 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 informations d’identification de connexion non valides maxInvalidPasswordAttempts 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, Hashedou 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 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 manière : il existe un fournisseur de rôle 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 Rôles et son balisage de configuration dans un prochain tutoriel.

Personnalisation desSqlMembershipProviderparamè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 traduit ~/App_Data/aspnet.mdfen .

Si nous n’avons pas spécifié d’informations 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 manières suivantes :

  • Spécifiez une valeur pour leLocalSqlServerchaîne de connexion nom dansWeb.config. En remplaçant la LocalSqlServer valeur de nom chaîne de connexion dans Web.config, nous pouvons utiliser le fournisseur d’appartenance inscrit par défaut (AspNetSqlMembershipProvider) et le faire fonctionner correctement avec la SecurityTutorials.mdf base de données. Cette approche est correcte si vous êtes satisfait des paramètres de configuration spécifiés par AspNetSqlMembershipProvider. Pour plus d’informations sur cette technique, consultez le billet de blog de Scott Guthrie, Configuration de ASP.NET 2.0 Application Services to Use SQL Server 2000 ou SQL Server 2005.
  • Ajouter un nouveau fournisseur inscrit de typeSqlMembershipProvideret configurer sonconnectionStringNameparamètre pour pointer vers leSecurityTutorials.mdfBase. 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 d’ajouter un nouveau fournisseur inscrit qui fait référence à la SecurityTutorials.mdf base de données, nous devons d’abord ajouter une valeur chaîne de connexion appropriée dans la <connectionStrings> section de Web.config. Le balisage suivant ajoute un nouveau chaîne de connexion nommé 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 du bon chaîne de connexion, 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 le SecurityTutorialsSqlMembershipProvider comme 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 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 immédiatement 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 SecurityTutorialsSqlMembershipProviderparamètre de connectionStringName référence au nom du chaîne de connexion qui vient d’être ajouté SecurityTutorialsConnectionString , et que son applicationName paramètre a été défini sur une valeur 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 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.

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’appartenance 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 paramètre de applicationName configuration, 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 applicationName paramètre change également. Dans ce cas, le fournisseur d’appartenance commence à travailler avec 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 sur cette question, consultez Toujours définir la propriété lors de la applicationName configuration de ASP.NET 2.0 appartenance et d’autres fournisseurs.

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 sa connectionStringName valeur définie sur le 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 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 !

En savoir plus

Pour plus d’informations sur les sujets abordés dans ce tutoriel, reportez-vous aux ressources suivantes :

Formation vidéo sur les rubriques contenues 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 Heures. Scott peut être contacté à mitchell@4guysfromrolla.com ou via son blog à l’adresse http://ScottOnWriting.NET.

Un merci spécial à

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.