ASP.NET-identiteit: MySQL-opslag gebruiken met een EntityFramework MySQL-provider (C#)

door Maurycy Markowski, Raquel Soares De Almeida, Robert McMurray

In deze zelfstudie leert u hoe u het standaardmechanisme voor gegevensopslag voor ASP.NET Identiteit vervangt door EntityFramework (SQL-clientprovider) door een MySQL-provider.

In deze zelfstudie worden de volgende onderwerpen behandeld:

  • Een MySQL-database maken in Azure
  • Een MVC-toepassing maken met visual Studio 2013 MVC-sjabloon
  • EntityFramework configureren voor gebruik met een MySQL-databaseprovider
  • De toepassing uitvoeren om de resultaten te controleren

Aan het einde van deze zelfstudie hebt u een MVC-toepassing met het ASP.NET Identity-archief dat gebruikmaakt van een MySQL-database die wordt gehost in Azure.

Een MySQL-database-exemplaar maken in Azure

  1. Meld u aan bij de Azure Portal.

  2. Klik onder aan de pagina op NIEUW en selecteer STORE:

    Schermopname van het Azure Portal-menu met de menuoptie Winkel onderaan gemarkeerd en omgeven door een rode rechthoek.

  3. In de wizard 'Een invoegtoepassing kiezen' selecteer de optie ClearDB MySQL-database, en klik vervolgens op de Volgende-pijl onder aan het frame.

    [Klik op de volgende afbeelding om deze uit te vouwen. ] Schermopname van de wizard 'Kies een invoegtoepassing', met 'ClearDB MySQL Database' gemarkeerd met een rode rechthoek.

  4. Behoud het standaard gratis abonnement, wijzig de naam in IdentityMySQLDatabase, selecteer de regio die het dichtst bij u ligt en klik vervolgens op de pijl Volgende onder aan het frame:

    [Klik op de volgende afbeelding om deze uit te vouwen. ] Schermopname van het dialoogvenster Personaliseer invoegtoepassing met de optie Gratis abonnementsplan en de velden Naam en Regio worden geselecteerd en gemarkeerd met een rode rechthoek.

  5. Klik op het vinkje PURCHASE om het maken van de database te voltooien.

    [Klik op de volgende afbeelding om deze uit te vouwen. ] Schermopname van het dialoogvenster Aankoopoverzicht waarbij de knop Kopen is gemarkeerd met een rode rechthoek.

  6. Nadat uw database is gemaakt, kunt u deze beheren via het tabblad ADD-ONS in de beheerportal. Als u de verbindingsgegevens voor uw database wilt ophalen, klikt u onder aan de pagina op VERBINDINGSGEGEVENS :

    [Klik op de volgende afbeelding om deze uit te vouwen. ] Schermopname van de beheerportal met het tabblad Add Ons, the Identify My S Q L database item en the Connection Info button gemarkeerd in rood.

  7. Kopieer de verbindingsreeks door te klikken op de knop Kopiëren door het veld CONNECTIONSTRING en sla deze op; u gebruikt deze informatie verderop in deze zelfstudie voor uw MVC-toepassing:

    [Klik op de volgende afbeelding om deze uit te vouwen. ] Schermopname van het dialoogvenster Verbindingsgegevens met de knop Kopiëren gemarkeerd rechts van het veld Verbindingsreeks.

Een MVC-toepassingsproject maken

Als u de stappen in deze sectie van de zelfstudie wilt voltooien, moet u eerst Visual Studio Express 2013 voor Web of Visual Studio 2013 installeren. Nadat Visual Studio is geïnstalleerd, gebruikt u de volgende stappen om een nieuw MVC-toepassingsproject te maken:

  1. Open Visual Studio 2103.

  2. Klik op Nieuw projectop de startpagina of klik op het menu Bestand en vervolgens op Nieuw project:

    [Klik op de volgende afbeelding om deze uit te vouwen. ] Schermopname van de startpagina van Visual Studio met de optie Nieuw project gemarkeerd met een rode rechthoek.

  3. Wanneer het dialoogvenster Nieuw project wordt weergegeven, vouwt u Visual C# uit in de lijst met sjablonen, klikt u op Web en selecteert u ASP.NET Webtoepassing. Geef uw project de naam IdentityMySQLDemo en klik vervolgens op OK:

    [Klik op de volgende afbeelding om deze uit te vouwen. ] Schermopname van het dialoogvenster Nieuw project, met links de Visual C-hashtag en het web gemarkeerd. ASP.NET-webapplicatie rechts geselecteerd met projectnaam Identity MySQL Demo in het naamveld onderaan.

  4. Selecteer in het dialoogvenster Nieuw ASP.NET Project de MVC-sjabloon met de standaardopties; Hiermee configureert u afzonderlijke gebruikersaccounts als verificatiemethode. Klik op OK:

    [Klik op de volgende afbeelding om deze uit te vouwen. ] Schermopname van het dialoogvenster New A S P DOT NET Project, waarbij de M V C-sjabloon is geselecteerd en de standaardopties zijn ingeschakeld.

EntityFramework configureren voor gebruik met een MySQL-database

De Entity Framework-assembly voor uw project bijwerken

De MVC-toepassing die is gemaakt op basis van de Visual Studio 2013-sjabloon bevat een verwijzing naar het EntityFramework 6.0.0-pakket , maar er zijn updates voor die assembly sinds de release die aanzienlijke prestatieverbeteringen bevatten. Gebruik de volgende stappen om deze nieuwste updates in uw toepassing te gebruiken.

  1. Open uw MVC-project in Visual Studio.

  2. Klik op Extra, klik vervolgens op NuGet Package Manager en klik vervolgens op Package Manager Console:

    [Klik op de volgende afbeelding om deze uit te vouwen. ] Schermopname van M V C-project in Visual Studio, met Tools geselecteerd in het bovenste menu, Library Package Manager geselecteerd aan de linkerkant en Package Manager Console rechts geselecteerd.

  3. De Package Manager-console wordt weergegeven in het onderste gedeelte van Visual Studio. Typ 'Update-Package EntityFramework' en druk op Enter:

    [Klik op de volgende afbeelding om deze uit te vouwen. ] Schermopname van Package Manager Console in het onderste gedeelte van Visual Studio, met instructie Update Package Entity Framework weergegeven op de opdrachtregel.

De MySQL-provider voor EntityFramework installeren

Als u wilt dat EntityFramework verbinding maakt met mySQL-database, moet u een MySQL-provider installeren. Hiervoor opent u de Package Manager-console en typt u 'Install-Package MySql.Data.Entity -Pre' en drukt u op Enter.

Opmerking

Dit is een voorlopige versie van de assembly en kan fouten bevatten. Gebruik de voorlopige versie van de provider niet in productie.

[Klik op de volgende afbeelding om deze uit te vouwen.]

Schermopname van de Package Manager Console in het onderste gedeelte van Visual Studio, met de opdracht `Install-Package MySql.Data.Entity-Pre` weergegeven op de opdrachtregel.

Projectconfiguratiewijzigingen aanbrengen in het Web.config-bestand voor uw toepassing

In deze sectie configureert u het Entity Framework voor het gebruik van de MySQL-provider die u zojuist hebt geïnstalleerd, registreert u de MySQL-providerfactory en voegt u uw verbindingsreeks toe vanuit Azure.

Opmerking

De volgende voorbeelden bevatten een specifieke assemblyversie voor MySql.Data.dll. Als de assemblyversie wordt gewijzigd, moet u de juiste configuratie-instellingen wijzigen met de juiste versie.

  1. Open het Web.config-bestand voor uw project in Visual Studio 2013.

  2. Zoek de volgende configuratie-instellingen, waarmee de standaarddatabaseprovider en factory voor entity framework worden gedefinieerd:

    <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. Vervang deze configuratie-instellingen door het volgende, waarmee het Entity Framework wordt geconfigureerd voor het gebruik van de MySQL-provider:

    <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. Zoek de <sectie connectionStrings> en vervang deze door de volgende code, waarmee de verbindingsreeks wordt gedefinieerd voor uw MySQL-database die wordt gehost in Azure (houd er rekening mee dat de waarde providerName ook is gewijzigd van het oorspronkelijke):

    <connectionStrings>
      <add name="DefaultConnection"
        providerName="MySql.Data.MySqlClient"
        connectionString="[Insert your ConnectionString from Azure here]"/>
    </connectionStrings>
    

Aangepaste MigrationHistory-context toevoegen

Entity Framework Code First maakt gebruik van een MigrationHistory-tabel om modelwijzigingen bij te houden en om de consistentie tussen het databaseschema en het conceptuele schema te garanderen. Deze tabel werkt echter niet standaard voor MySQL omdat de primaire sleutel te groot is. Om deze situatie te verhelpen, moet u de sleutelgrootte voor die tabel verkleinen. Gebruik hiervoor de volgende stappen:

  1. De schemagegevens voor deze tabel worden vastgelegd in een HistoryContext, die kan worden gewijzigd als elke andere DbContext. Voeg hiervoor een nieuw klassebestand met de naam MySqlHistoryContext.cs toe aan het project en vervang de inhoud door de volgende code:

    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. Vervolgens moet u Entity Framework configureren voor het gebruik van de gewijzigde HistoryContext, in plaats van standaard één. Dit kan worden gedaan door gebruik te maken van configuratiefuncties op basis van code. Voeg hiervoor een nieuw klassebestand met de naam MySqlConfiguration.cs toe aan uw project en vervang de inhoud door:

    using System.Data.Entity;
     
    namespace IdentityMySQLDemo
    {
      public class MySqlConfiguration : DbConfiguration
      {
        public MySqlConfiguration()
        {
          SetHistoryContext(
          "MySql.Data.MySqlClient", (conn, schema) => new MySqlHistoryContext(conn, schema));
        }
      }
    }
    

Een aangepaste EntityFramework-initializer maken voor ApplicationDbContext

De MySQL-provider die in deze zelfstudie wordt aanbevolen, biedt momenteel geen ondersteuning voor Entity Framework-migraties, dus u moet model initializers gebruiken om verbinding te maken met de database. Omdat deze zelfstudie een MySQL-exemplaar in Azure gebruikt, moet u een aangepaste Entity Framework-initialisatiefunctie maken.

Opmerking

Deze stap is niet vereist als u verbinding maakt met een SQL Server-exemplaar in Azure of als u een database gebruikt die on-premises wordt gehost.

Als u een aangepaste Entity Framework-initialisatiefunctie voor MySQL wilt maken, gebruikt u de volgende stappen:

  1. Voeg een nieuw klassebestand met de naam MySqlInitializer.cs toe aan het project en vervang de inhoud door de volgende code:

    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. Open het IdentityModels.cs-bestand voor uw project, dat zich in de map Modellen bevindt en vervang de inhoud door het volgende:

    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")
        {
        }
      }
    }
    

De toepassing uitvoeren en de database controleren

Nadat u de stappen in de voorgaande secties hebt voltooid, moet u de database testen. Gebruik hiervoor de volgende stappen:

  1. Druk op Ctrl+F5 om de webtoepassing te bouwen en uit te voeren.

  2. Klik op het tabblad Registreren boven aan de pagina:

    [Klik op de volgende afbeelding om deze uit te vouwen. ] Schermopname van de website van A S P dot NET, met het tabblad Registreren gemarkeerd in het menu rechtsboven.

  3. Voer een nieuwe gebruikersnaam en wachtwoord in en klik vervolgens op Registreren:

    [Klik op de volgende afbeelding om deze uit te vouwen. ] Schermopname van het dialoogvenster A S P DOT NET-registratie, met gebruikersnaam, wachtwoord en bevestig dat de velden wachtwoord zijn voltooid en de knop Registreren hieronder is gemarkeerd.

  4. Op dit moment worden de ASP.NET Identiteitstabellen gemaakt in de MySQL-database en wordt de gebruiker geregistreerd en aangemeld bij de toepassing:

    [Klik op de volgende afbeelding om deze uit te vouwen. ] Schermopname van de A S P dot NET-website nadat de gebruiker de registratie heeft voltooid. Tabblad met Hallo begroeting, gevolgd door gebruikersnaam, is gemarkeerd in het menu rechtsboven.

Het hulpprogramma MySQL Workbench installeren om de gegevens te controleren

  1. Het hulpprogramma MySQL Workbench installeren vanaf de mySQL-downloadpagina

  2. Selecteer MySQL Workbench onder de sectie Toepassingen in de installatiewizard: tabblad Functieselectie.

  3. Start de app en voeg een nieuwe verbinding toe met behulp van de verbindingsreeksgegevens uit de Azure MySQL-database die u aan het begin van deze zelfstudie hebt gemaakt.

  4. Controleer na het tot stand brengen van de verbinding de ASP.NET Identiteitstabellen die zijn gemaakt op de IdentityMySQLDatabase.

  5. U ziet dat alle ASP.NET vereiste tabellen voor identiteit worden gemaakt, zoals wordt weergegeven in de onderstaande afbeelding:

    [Klik op de volgende afbeelding om deze uit te vouwen. ] Schermopname van het dialoogvenster van MySQL Workbench. ASP.NET Identity-tabellen die in de Identity MySQL-database zijn aangemaakt, worden linksonder gemarkeerd.

  6. Inspecteer de aspnetusers-tabel bijvoorbeeld om te controleren op de vermeldingen wanneer u nieuwe gebruikers registreert.

    [Klik op de volgende afbeelding om deze uit te vouwen. ] Schermopname van een s p net-gebruikerstabel, met vermeldingen met de kolommen I D, Gebruikersnaam, Wachtwoord-hash, Beveiligingsstempel en Discriminator.