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
Accedere al portale di Azure.
Fare clic su NEW nella parte inferiore della pagina e quindi selezionare STORE:
Nella procedura guidata Scegliere un componente aggiuntivo selezionare ClearDB MySQL Database e quindi fare clic sulla freccia Avanti nella parte inferiore del frame:
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 sul segno di spunta PURCHASE per completare la creazione del database.
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:
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:
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:
Aprire Visual Studio 2103.
Fare clic su Nuovo progetto nella pagina Start oppure scegliere il menu File e quindi Nuovo progetto:
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:
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:
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.
Aprire il progetto MVC in Visual Studio.
Fare clic su Strumenti, quindi su Gestione pacchetti NuGet e quindi su Console di Gestione pacchetti:
La console di Gestione pacchetti verrà visualizzata nella sezione inferiore di Visual Studio. Digitare "Update-Package EntityFramework" e premere INVIO:
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.]
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.
Aprire il file Web.config per il progetto in Visual Studio 2013.
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>
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>
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:
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(); } } }
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:
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(); } } } } }
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:
Premere CTRL + F5 per compilare ed eseguire l'applicazione Web.
Fare clic sulla scheda Registra nella parte superiore della pagina:
Immettere un nuovo nome utente e una nuova password, quindi fare clic su Registra:
A questo punto vengono create le tabelle identity ASP.NET nel database MySQL e l'utente viene registrato e connesso all'applicazione:
Installazione dello strumento MySQL Workbench per verificare i dati
Installare lo strumento MySQL Workbench dalla pagina download di MySQL
Nella scheda Selezione funzionalità della procedura guidata selezionare MySQL Workbench nella sezione applicazioni .
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.
Dopo aver stabilito la connessione, esaminare le tabelle identity ASP.NET create in IdentityMySQLDatabase.
Si noterà che tutte le tabelle necessarie ASP.NET Identity vengono create come illustrato nell'immagine seguente:
Esaminare la tabella aspnetusers per l'istanza per verificare la presenza delle voci durante la registrazione di nuovi utenti.