ASP.NET Identity : Utilisation du stockage MySQL avec un fournisseur MySQL Entity Framework (C#)
par Maurycy Markowski, Raquel Soares De Almeida, Robert McMurray
Ce tutoriel vous montre comment remplacer le mécanisme de stockage de données par défaut pour ASP.NET Identity par EntityFramework (fournisseur de client SQL) par un fournisseur MySQL.
Les rubriques suivantes seront traitées dans ce tutoriel :
- Création d’une base de données MySQL sur Azure
- Création d’une application MVC à l’aide Visual Studio 2013 modèle MVC
- Configuration d’EntityFramework pour qu’il fonctionne avec un fournisseur de base de données MySQL
- Exécution de l’application pour vérifier les résultats
À la fin de ce tutoriel, vous disposerez d’une application MVC avec le magasin d’identités ASP.NET qui utilise une base de données MySQL hébergée dans Azure.
Création d’une base de données MySQL instance sur Azure
Connectez-vous au portail Azure.
Cliquez sur NOUVEAU en bas de la page, puis sélectionnez STORE :
Dans l’Assistant Choisir un module complémentaire , sélectionnez Base de données ClearDB MySQL, puis cliquez sur la flèche Suivant en bas du cadre :
Conservez le plan Gratuit par défaut, remplacez le NOM par IdentityMySQLDatabase, sélectionnez la région la plus proche de vous, puis cliquez sur la flèche Suivant en bas du cadre :
Cliquez sur la coche PURCHASE pour terminer la création de la base de données.
Une fois la base de données créée, vous pouvez la gérer à partir de l’onglet ADD-ONS du portail de gestion. Pour récupérer les informations de connexion de votre base de données, cliquez sur INFORMATIONS DE CONNEXION en bas de la page :
Copiez la chaîne de connexion en cliquant sur le bouton copier par le champ CONNECTIONSTRING et enregistrez-la ; Vous utiliserez ces informations plus loin dans ce tutoriel pour votre application MVC :
Création d’un projet d’application MVC
Pour suivre les étapes de cette section du didacticiel, vous devez d’abord installer Visual Studio Express 2013 pour le web ou Visual Studio 2013. Une fois Visual Studio installé, procédez comme suit pour créer un projet d’application MVC :
Ouvrez Visual Studio 2103.
Cliquez sur Nouveau projet dans la page Démarrer , ou vous pouvez cliquer sur le menu Fichier , puis sur Nouveau projet :
Lorsque la boîte de dialogue Nouveau projet s’affiche, développez Visual C# dans la liste des modèles, puis cliquez sur Web, puis sélectionnez ASP.NET application web. Nommez votre projet IdentityMySQLDemo , puis cliquez sur OK :
Dans la boîte de dialogue Nouveau projet ASP.NET , sélectionnez le modèle MVC avec les options par défaut ; cette opération configure les comptes d’utilisateur individuels comme méthode d’authentification. Cliquez sur OK :
Configurer EntityFramework pour qu’il fonctionne avec une base de données MySQL
Mettre à jour l’assembly Entity Framework pour votre projet
L’application MVC créée à partir du modèle Visual Studio 2013 contient une référence au package EntityFramework 6.0.0, mais des mises à jour ont été apportées à cet assembly depuis sa publication, qui contiennent des améliorations significatives des performances. Pour utiliser ces dernières mises à jour dans votre application, procédez comme suit.
Ouvrez votre projet MVC dans Visual Studio.
Cliquez sur Outils, sur Gestionnaire de package NuGet, puis sur Console du Gestionnaire de package :
La console du Gestionnaire de package s’affiche dans la section inférieure de Visual Studio. Tapez « Update-Package EntityFramework », puis appuyez sur Entrée :
Installer le fournisseur MySQL pour EntityFramework
Pour qu’EntityFramework se connecte à la base de données MySQL, vous devez installer un fournisseur MySQL. Pour ce faire, ouvrez la console du Gestionnaire de package et tapez « Install-Package MySql.Data.Entity -Pre », puis appuyez sur Entrée.
Notes
Il s’agit d’une version préliminaire de l’assembly et, en tant que telle, elle peut contenir des bogues. Vous ne devez pas utiliser une version préliminaire du fournisseur en production.
[Cliquez sur l’image suivante pour la développer.]
Modification de la configuration du projet dans le fichier Web.config de votre application
Dans cette section, vous allez configurer Entity Framework pour utiliser le fournisseur MySQL que vous venez d’installer, inscrire la fabrique de fournisseur MySQL et ajouter votre chaîne de connexion à partir d’Azure.
Notes
Les exemples suivants contiennent une version d’assembly spécifique pour MySql.Data.dll. Si la version de l’assembly change, vous devez modifier les paramètres de configuration appropriés avec la version correcte.
Ouvrez le fichier Web.config de votre projet dans Visual Studio 2013.
Recherchez les paramètres de configuration suivants, qui définissent le fournisseur de base de données et la fabrique par défaut pour Entity Framework :
<entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="v11.0" /> </parameters> </defaultConnectionFactory> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> </providers> </entityFramework>
Remplacez ces paramètres de configuration par les éléments suivants, ce qui configure Entity Framework pour utiliser le fournisseur MySQL :
<entityFramework> <providers> <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity"/> </providers> </entityFramework> <system.data> <DbProviderFactories> <remove invariant="MySql.Data.MySqlClient"></remove> <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.7.2.0"/> </DbProviderFactories> </system.data>
Recherchez la <section connectionStrings> et remplacez-la par le code suivant, qui définit la chaîne de connexion pour votre base de données MySQL hébergée sur Azure (notez que la valeur providerName a également été modifiée par rapport à l’original) :
<connectionStrings> <add name="DefaultConnection" providerName="MySql.Data.MySqlClient" connectionString="[Insert your ConnectionString from Azure here]"/> </connectionStrings>
Ajout d’un contexte MigrationHistory personnalisé
Entity Framework Code First utilise une table MigrationHistory pour effectuer le suivi des modifications de modèle et garantir la cohérence entre le schéma de base de données et le schéma conceptuel. Toutefois, cette table ne fonctionne pas pour MySQL par défaut, car la clé primaire est trop grande. Pour remédier à cette situation, vous devez réduire la taille de la clé de cette table. Pour cela, utilisez les étapes suivantes :
Les informations de schéma de cette table sont capturées dans un HistoryContext, qui peut être modifié comme n’importe quel autre DbContext. Pour ce faire, ajoutez un nouveau fichier de classe nommé MySqlHistoryContext.cs au projet et remplacez son contenu par le code suivant :
using System.Data.Common; using System.Data.Entity; using System.Data.Entity.Migrations.History; namespace IdentityMySQLDemo { public class MySqlHistoryContext : HistoryContext { public MySqlHistoryContext( DbConnection existingConnection, string defaultSchema) : base(existingConnection, defaultSchema) { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<HistoryRow>().Property(h => h.MigrationId).HasMaxLength(100).IsRequired(); modelBuilder.Entity<HistoryRow>().Property(h => h.ContextKey).HasMaxLength(200).IsRequired(); } } }
Ensuite, vous devez configurer Entity Framework pour utiliser historyContext modifié, plutôt que par défaut. Pour ce faire, vous pouvez tirer parti des fonctionnalités de configuration basées sur le code. Pour ce faire, ajoutez un nouveau fichier de classe nommé MySqlConfiguration.cs à votre projet et remplacez son contenu par :
using System.Data.Entity; namespace IdentityMySQLDemo { public class MySqlConfiguration : DbConfiguration { public MySqlConfiguration() { SetHistoryContext( "MySql.Data.MySqlClient", (conn, schema) => new MySqlHistoryContext(conn, schema)); } } }
Création d’un initialiseur EntityFramework personnalisé pour ApplicationDbContext
Le fournisseur MySQL présenté dans ce didacticiel ne prend actuellement pas en charge les migrations Entity Framework. Vous devez donc utiliser des initialiseurs de modèle pour vous connecter à la base de données. Étant donné que ce tutoriel utilise un instance MySQL sur Azure, vous devez créer un initialiseur Entity Framework personnalisé.
Notes
Cette étape n’est pas obligatoire si vous vous connectez à un SQL Server instance sur Azure ou si vous utilisez une base de données hébergée localement.
Pour créer un initialiseur Entity Framework personnalisé pour MySQL, procédez comme suit :
Ajoutez un nouveau fichier de classe nommé MySqlInitializer.cs au projet et remplacez son contenu par le code suivant :
using IdentityMySQLDemo.Models; using System.Data.Entity; using System.Data.Entity.Infrastructure; using System.Linq; namespace IdentityMySQLDemo { public class MySqlInitializer : IDatabaseInitializer<ApplicationDbContext> { public void InitializeDatabase(ApplicationDbContext context) { if (!context.Database.Exists()) { // if database did not exist before - create it context.Database.Create(); } else { // query to check if MigrationHistory table is present in the database var migrationHistoryTableExists = ((IObjectContextAdapter)context).ObjectContext.ExecuteStoreQuery<int>( "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'IdentityMySQLDatabase' AND table_name = '__MigrationHistory'"); // if MigrationHistory table is not there (which is the case first time we run) - create it if (migrationHistoryTableExists.FirstOrDefault() == 0) { context.Database.Delete(); context.Database.Create(); } } } } }
Ouvrez le fichier IdentityModels.cs de votre projet, qui se trouve dans le répertoire Models , et remplacez son contenu par ce qui suit :
using Microsoft.AspNet.Identity.EntityFramework; using System.Data.Entity; namespace IdentityMySQLDemo.Models { // You can add profile data for the user by adding more properties to your ApplicationUser // class, please visit https://go.microsoft.com/fwlink/?LinkID=317594 to learn more. public class ApplicationUser : IdentityUser { } public class ApplicationDbContext : IdentityDbContext<ApplicationUser> { static ApplicationDbContext() { Database.SetInitializer(new MySqlInitializer()); } public ApplicationDbContext() : base("DefaultConnection") { } } }
Exécution de l’application et vérification de la base de données
Une fois que vous avez effectué les étapes des sections précédentes, vous devez tester votre base de données. Pour cela, utilisez les étapes suivantes :
Appuyez sur Ctrl + F5 pour générer et exécuter l’application web.
Cliquez sur l’onglet Inscrire en haut de la page :
Entrez un nouveau nom d’utilisateur et un nouveau mot de passe, puis cliquez sur Inscrire :
À ce stade, les tables d’identité ASP.NET sont créées sur la base de données MySQL, et l’utilisateur est inscrit et connecté à l’application :
Installation de l’outil MySQL Workbench pour vérifier les données
Installer l’outil MySQL Workbench à partir de la page de téléchargements MySQL
Dans l’Assistant Installation : onglet Sélection des fonctionnalités , sélectionnez MySQL Workbench sous la section Applications .
Lancez l’application et ajoutez une nouvelle connexion à l’aide des données de chaîne de connexion de la base de données Azure MySQL que vous avez créée au début de ce didacticiel.
Après avoir établi la connexion, inspectez les tables d’identité ASP.NET créées sur IdentityMySQLDatabase.
Vous verrez que toutes les tables requises ASP.NET Identity sont créées comme indiqué dans l’image ci-dessous :
Inspectez la table aspnetusers pour instance pour case activée les entrées lorsque vous inscrivez de nouveaux utilisateurs.