Condividi tramite


ASP.NET Identity: uso dell'archiviazione MySQL con un provider MySQL EntityFramework (C#)

di Maurycy Markowski, Raquel Soares De Almeida, Robert McMurray

Questa esercitazione illustra come sostituire il meccanismo di archiviazione dati predefinito per ASP.NET Identity with EntityFramework (provider client SQL) con un provider MySQL.

Gli argomenti seguenti verranno illustrati in questa esercitazione:

  • Creazione di un database MySQL in Azure
  • Creazione di un'applicazione MVC usando Visual Studio 2013 modello MVC
  • Configurazione di EntityFramework per l'uso con un provider di database MySQL
  • Esecuzione dell'applicazione per verificare i risultati

Alla fine di questa esercitazione si avrà un'applicazione MVC con l'archivio identità ASP.NET che usa un database MySQL ospitato in Azure.

Creazione di un'istanza del database MySQL in Azure

  1. Accedere al portale di Azure.

  2. Fare clic su NEW nella parte inferiore della pagina e quindi selezionare STORE:

    Screenshot del menu portale di Azure con la voce di menu Store evidenziata in basso e descritta con un rettangolo rosso.

  3. Nella procedura guidata Scegliere un componente aggiuntivo selezionare ClearDB MySQL Database e quindi fare clic sulla freccia Avanti nella parte inferiore del frame:

    [Fare clic sull'immagine seguente per espanderla. ] Screenshot della procedura guidata Scegliere un componente aggiuntivo, con Cancella D B My S Q L Database evidenziato con un rettangolo rosso.

  4. Mantenere il piano gratuito predefinito, modificare il nome in IdentityMySQLDatabase, selezionare l'area più vicina all'utente e quindi fare clic sulla freccia Avanti nella parte inferiore del frame:

    [Fare clic sull'immagine seguente per espanderla. ] Screenshot della finestra di dialogo Personalizza componente aggiuntivo che mostra l'opzione Piano gratuito e i campi Nome e area selezionati e evidenziati con un rettangolo rosso.

  5. Fare clic sul segno di spunta PURCHASE per completare la creazione del database.

    [Fare clic sull'immagine seguente per espanderla. ] Screenshot della finestra di dialogo Rivedi acquisto che mostra il pulsante Acquista evidenziato con un rettangolo rosso.

  6. Dopo che è stato creato, il database può essere gestito nella scheda ADD-ONS del portale di gestione. Per recuperare le informazioni di connessione per il database, fare clic su INFORMAZIONI DI CONNESSIONE nella parte inferiore della pagina:

    [Fare clic sull'immagine seguente per espanderla. ] Screenshot del portale di gestione con la scheda Aggiungi elementi, l'elemento di database Identifica il database Q L personale e il pulsante Informazioni di connessione evidenziato in rosso.

  7. Copiare la stringa di connessione facendo clic sul pulsante copia dal campo CONNECTIONSTRING e salvarlo; queste informazioni verranno usate più avanti in questa esercitazione per l'applicazione MVC:

    [Fare clic sull'immagine seguente per espanderla. ] Screenshot della finestra di dialogo Informazioni di connessione con il pulsante copia evidenziato a destra del campo Stringa di connessione.

Creazione di un progetto di applicazione MVC

Per completare la procedura descritta in questa sezione dell'esercitazione, è prima necessario installare Visual Studio Express 2013 per Web o Visual Studio 2013. Dopo l'installazione di Visual Studio, seguire questa procedura per creare un nuovo progetto di applicazione MVC:

  1. Aprire Visual Studio 2103.

  2. Fare clic su Nuovo progetto nella pagina Start oppure scegliere il menu File e quindi Nuovo progetto:

    [Fare clic sull'immagine seguente per espanderla. ] Screenshot della pagina iniziale di Visual Studio che mostra l'opzione Nuovo progetto evidenziata con un rettangolo rosso.

  3. Quando viene visualizzata la finestra di dialogo Nuovo progetto , espandere Visual C# nell'elenco dei modelli, quindi fare clic su Web e selezionare ASP.NET applicazione Web. Assegnare un nome al progetto IdentityMySQLDemo e quindi fare clic su OK:

    [Fare clic sull'immagine seguente per espanderla. ] Screenshot della finestra di dialogo Nuovo progetto, con il segno hash visual C espanso a sinistra e Web evidenziato. Applicazione Web ASP dot NET selezionata a destra con il nome del progetto Identity My S Q L Demo nel campo nome in basso.

  4. Nella finestra di dialogo Nuovo ASP.NET progetto selezionare il modello MVC con le opzioni predefinite; in questo modo verranno configurati singoli account utente come metodo di autenticazione. Fare clic su OK:

    [Fare clic sull'immagine seguente per espanderla. ] Screenshot della finestra di dialogo Nuovo progetto P punto S, con il modello M V C selezionato e le opzioni predefinite selezionate.

Configurare EntityFramework per l'uso di un database MySQL

Aggiornare l'assembly Entity Framework per il progetto

L'applicazione MVC creata dal modello di Visual Studio 2013 contiene un riferimento al pacchetto EntityFramework 6.0.0. Per usare questi aggiornamenti più recenti nell'applicazione, seguire questa procedura.

  1. Aprire il progetto MVC in Visual Studio.

  2. Fare clic su Strumenti, quindi su Gestione pacchetti NuGet e quindi su Console di Gestione pacchetti:

    [Fare clic sull'immagine seguente per espanderla. ] Screenshot del progetto M V C in Visual Studio, con Strumenti selezionati nel menu in alto, Gestione pacchetti di libreria selezionato a sinistra e Console di Gestione pacchetti selezionato a destra.

  3. La console di Gestione pacchetti verrà visualizzata nella sezione inferiore di Visual Studio. Digitare "Update-Package EntityFramework" e premere INVIO:

    [Fare clic sull'immagine seguente per espanderla. ] Screenshot della console di Gestione pacchetti nella sezione inferiore di Visual Studio, con l'istruzione Update Package Entity Framework visualizzata nella riga di comando.

Installare il provider MySQL per EntityFramework

Per poter connettersi al database MySQL, è necessario installare un provider MySQL. A tale scopo, aprire la console di Gestione pacchetti e digitare "Install-Package MySql.Data.Entity -Pre" e quindi premere INVIO.

Nota

Si tratta di una versione preliminare dell'assembly e, come tale, può contenere bug. Non è consigliabile usare una versione preliminare del provider nell'ambiente di produzione.

[Fare clic sull'immagine seguente per espanderla.]

Screenshot della console di Gestione pacchetti nella sezione inferiore di Visual Studio, con Install-Package l'istruzione Data dot Data dot Entity dash Pre (Punto entità punto dati) visualizzata nella riga di comando.

Apportare modifiche alla configurazione del progetto al file di Web.config per l'applicazione

In questa sezione verrà configurato Entity Framework per usare il provider MySQL appena installato, registrare la factory del provider MySQL e aggiungere la stringa di connessione da Azure.

Nota

Gli esempi seguenti contengono una versione di assembly specifica per MySql.Data.dll. Se la versione dell'assembly cambia, sarà necessario modificare le impostazioni di configurazione appropriate con la versione corretta.

  1. Aprire il file Web.config per il progetto in Visual Studio 2013.

  2. Individuare le impostazioni di configurazione seguenti, che definiscono il provider di database predefinito e la factory per 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. Sostituire queste impostazioni di configurazione con quanto segue, che configurerà Entity Framework per l'uso del provider 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. Individuare la <sezione connectionStrings> e sostituirla con il codice seguente, che definirà la stringa di connessione per il database MySQL ospitato in Azure (si noti che il valore providerName è stato modificato anche dall'originale):

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

Aggiunta di contesto migrationHistory personalizzato

Entity Framework Code First usa una tabella MigrationHistory per tenere traccia delle modifiche del modello e per garantire la coerenza tra lo schema del database e lo schema concettuale. Tuttavia, questa tabella non funziona per MySQL per impostazione predefinita perché la chiave primaria è troppo grande. Per risolvere questa situazione, sarà necessario ridurre le dimensioni della chiave per tale tabella. A tale scopo, seguire questa procedura:

  1. Le informazioni sullo schema per questa tabella vengono acquisite in un oggetto HistoryContext, che può essere modificato come qualsiasi altro dbContext. A tale scopo, aggiungere un nuovo file di classe denominato MySqlHistoryContext.cs al progetto e sostituirlo con il codice seguente:

    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. Successivamente è necessario configurare Entity Framework per l'uso del file HistoryContext modificato anziché quello predefinito. Questa operazione può essere eseguita sfruttando le funzionalità di configurazione basate sul codice. A tale scopo, aggiungere un nuovo file di classe denominato MySqlConfiguration.cs al progetto e sostituirlo con:

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

Creazione di un inizializzatore EntityFramework personalizzato per ApplicationDbContext

Il provider MySQL in primo piano in questa esercitazione non supporta attualmente le migrazioni di Entity Framework, quindi è necessario usare inizializzatori di modelli per connettersi al database. Poiché questa esercitazione usa un'istanza di MySQL in Azure, sarà necessario creare un inizializzatore di Entity Framework personalizzato.

Nota

Questo passaggio non è necessario se ci si connette a un'istanza di SQL Server in Azure o se si usa un database ospitato in locale.

Per creare un inizializzatore di Entity Framework personalizzato per MySQL, seguire questa procedura:

  1. Aggiungere un nuovo file di classe denominato MySqlInitializer.cs al progetto e sostituirlo con il codice seguente:

    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. Aprire il file IdentityModels.cs per il progetto, che si trova nella directory Modelli e sostituirlo con quanto segue:

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

Esecuzione dell'applicazione e verifica del database

Dopo aver completato i passaggi nelle sezioni precedenti, è necessario testare il database. A tale scopo, seguire questa procedura:

  1. Premere CTRL + F5 per compilare ed eseguire l'applicazione Web.

  2. Fare clic sulla scheda Registra nella parte superiore della pagina:

    [Fare clic sull'immagine seguente per espanderla. ] Screenshot di un sito Web A P dot NET, con la scheda Registra evidenziata nel menu in alto a destra.

  3. Immettere un nuovo nome utente e una nuova password, quindi fare clic su Registra:

    [Fare clic sull'immagine seguente per espanderla. ] Screenshot di una finestra di dialogo di registrazione A P dot NET, con nome utente, password e confermare i campi password completati e il pulsante Registra evidenziato di seguito.

  4. A questo punto vengono create le tabelle identity ASP.NET nel database MySQL e l'utente viene registrato e connesso all'applicazione:

    [Fare clic sull'immagine seguente per espanderla. ] Screenshot di un sito Web P dot NET dopo che l'utente ha completato la registrazione. Scheda con Hello greeting, seguita da nome utente, evidenziata nel menu in alto a destra.

Installazione dello strumento MySQL Workbench per verificare i dati

  1. Installare lo strumento MySQL Workbench dalla pagina download di MySQL

  2. Nella scheda Selezione funzionalità della procedura guidata selezionare MySQL Workbench nella sezione applicazioni .

  3. Avviare l'app e aggiungere una nuova connessione usando i dati della stringa di connessione dal database Azure MySQL creato all'inizio di questa esercitazione.

  4. Dopo aver stabilito la connessione, esaminare le tabelle identity ASP.NET create in IdentityMySQLDatabase.

  5. Si noterà che tutte le tabelle necessarie ASP.NET Identity vengono create come illustrato nell'immagine seguente:

    [Fare clic sull'immagine seguente per espanderla. ] Screenshot della finestra di dialogo strumento My S Q L Workbench. Le tabelle di identità P punto S create nel database Identity My Q L vengono evidenziate in basso a sinistra.

  6. Esaminare la tabella aspnetusers per l'istanza per verificare la presenza delle voci durante la registrazione di nuovi utenti.

    [Fare clic sull'immagine seguente per espanderla. ] Screenshot di una tabella degli utenti p net con voci che visualizzano I D, Nome utente, Hash password, Stamp di sicurezza e Colonne Discriminatorie.