Partager via


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

  1. Connectez-vous au portail Azure.

  2. Cliquez sur NOUVEAU en bas de la page, puis sélectionnez STORE :

    Capture d’écran du menu du portail Azure avec l’élément de menu Store mis en surbrillance en bas et encadré d’un rectangle rouge.

  3. 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 :

    [Cliquez sur l’image suivante pour la développer. ] Capture d’écran de l’Assistant Choisir un module complémentaire, avec Clear D B My S QL Database mis en surbrillance avec un rectangle rouge.

  4. 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 l’image suivante pour la développer. ] Capture d’écran de la boîte de dialogue Personnaliser le module complémentaire montrant l’option Plan Gratuit et les champs Nom et région sélectionnés et mis en surbrillance avec un rectangle rouge.

  5. Cliquez sur la coche PURCHASE pour terminer la création de la base de données.

    [Cliquez sur l’image suivante pour la développer. ] Capture d’écran de la boîte de dialogue Vérifier l’achat montrant le bouton Acheter mis en surbrillance avec un rectangle rouge.

  6. 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 :

    [Cliquez sur l’image suivante pour la développer. ] Capture d’écran du portail de gestion avec l’onglet Ajouter, l’élément Identifier ma base de données QL et le bouton Informations de connexion mis en évidence en rouge.

  7. 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 :

    [Cliquez sur l’image suivante pour la développer. ] Capture d’écran de la boîte de dialogue Informations de connexion avec le bouton Copier mis en surbrillance à droite du champ Chaîne de connexion.

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 :

  1. Ouvrez Visual Studio 2103.

  2. Cliquez sur Nouveau projet dans la page Démarrer , ou vous pouvez cliquer sur le menu Fichier , puis sur Nouveau projet :

    [Cliquez sur l’image suivante pour la développer. ] Capture d’écran de la page de démarrage de Visual Studio montrant l’option Nouveau projet mise en surbrillance avec un rectangle rouge.

  3. 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 :

    [Cliquez sur l’image suivante pour la développer. ] Capture d’écran de la boîte de dialogue Nouveau projet, avec le signe de hachage Visual C développé à gauche et le web mis en surbrillance. Application web ASP dot NET sélectionnée à droite avec le nom du projet Identity My S Q L Demo dans le champ nom en bas.

  4. 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 :

    [Cliquez sur l’image suivante pour la développer. ] Capture d’écran de la boîte de dialogue New A S P P dot NET Project, avec le modèle MV C sélectionné et les options par défaut activées.

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.

  1. Ouvrez votre projet MVC dans Visual Studio.

  2. Cliquez sur Outils, sur Gestionnaire de package NuGet, puis sur Console du Gestionnaire de package :

    [Cliquez sur l’image suivante pour la développer. ] Capture d’écran du projet MV C dans Visual Studio, avec Outils sélectionnés dans le menu supérieur, Gestionnaire de package de bibliothèque sélectionné à gauche et Console du Gestionnaire de package sélectionné à droite.

  3. 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 :

    [Cliquez sur l’image suivante pour la développer. ] Capture d’écran de la console du Gestionnaire de package dans la section inférieure de Visual Studio, avec l’instruction Update Package Entity Framework affichée sur la ligne de commande.

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.]

Capture d’écran de la console du Gestionnaire de package dans la section inférieure de Visual Studio, avec Install-Package Mon point de données Point de données Entity dash Pre instruction affichée sur la ligne de commande.

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.

  1. Ouvrez le fichier Web.config de votre projet dans Visual Studio 2013.

  2. 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>
    
  3. 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>
    
  4. 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 :

  1. 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();
        }
      }
    }
    
  2. 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 :

  1. 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();
            }
          }
        }
      }
    }
    
  2. 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 :

  1. Appuyez sur Ctrl + F5 pour générer et exécuter l’application web.

  2. Cliquez sur l’onglet Inscrire en haut de la page :

    [Cliquez sur l’image suivante pour la développer. ] Capture d’écran du site web A S P dot NET, avec l’onglet Inscrire mis en évidence dans le menu en haut à droite.

  3. Entrez un nouveau nom d’utilisateur et un nouveau mot de passe, puis cliquez sur Inscrire :

    [Cliquez sur l’image suivante pour la développer. ] Capture d’écran de la boîte de dialogue d’inscription par point NET d’un fournisseur de services, avec les champs nom d’utilisateur, mot de passe et confirmer le mot de passe terminés et bouton Inscrire mis en évidence ci-dessous.

  4. À 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 :

    [Cliquez sur l’image suivante pour la développer. ] Capture d’écran d’un site web S P dot NET une fois que l’utilisateur a terminé l’inscription. L’onglet avec salutation Hello, suivi du nom d’utilisateur, est mis en surbrillance dans le menu en haut à droite.

Installation de l’outil MySQL Workbench pour vérifier les données

  1. Installer l’outil MySQL Workbench à partir de la page de téléchargements MySQL

  2. Dans l’Assistant Installation : onglet Sélection des fonctionnalités , sélectionnez MySQL Workbench sous la section Applications .

  3. 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.

  4. Après avoir établi la connexion, inspectez les tables d’identité ASP.NET créées sur IdentityMySQLDatabase.

  5. Vous verrez que toutes les tables requises ASP.NET Identity sont créées comme indiqué dans l’image ci-dessous :

    [Cliquez sur l’image suivante pour la développer. ] Capture d’écran de la boîte de dialogue de l’outil My S Q L Workbench. Les tables S P dot NET Identity créées sur la base de données Identity My QL sont mises en surbrillance en bas à gauche.

  6. Inspectez la table aspnetusers pour instance pour case activée les entrées lorsque vous inscrivez de nouveaux utilisateurs.

    [Cliquez sur l’image suivante pour la développer. ] Capture d’écran d’une table d’utilisateurs s p net, avec des entrées affichant les colonnes ID, Nom d’utilisateur, Hachage de mot de passe, Empreinte de sécurité et Discriminator.