ASP.NET Identity: Usar Almacenamiento de MySQL con un proveedor de MySQL de Entity Framework (C#)
por Maurycy Markowski, Raquel Soares De Almeida y Robert McMurray
Este tutorial muestra cómo reemplazar el mecanismo de almacenamiento de datos predeterminado de ASP.NET Identity por EntityFramework (proveedor de cliente SQL) por un proveedor MySQL.
Este tutorial trata los siguientes temas:
- Creación una base de datos MySQL en Azure
- Creación de una aplicación MVC con la plantilla de MVC de Visual Studio 2013
- Configuración de EntityFramework para que trabaje con un proveedor de bases de datos MySQL
- Ejecución de la aplicación para comprobar los resultados
Al final de este tutorial, tendrá una aplicación MVC con el almacén de ASP.NET Identity que usa una base de datos MySQL hospedada en Azure.
Creación de una instancia de base de datos MySQL en Azure
Inicie sesión en Azure Portal.
Haga clic en Nuevo en la parte inferior de la página y seleccione Tienda:
En el Asistente para elegir Complementos, seleccione ClearDB MySQL Database y haga clic en la flecha Siguiente de la parte inferior derecha de la ventana:
Mantenga el plan Gratis predeterminado, cambie el Nombre a IdentityMySQLDatabase, seleccione la región más cercana a usted y haga clic en la flecha Siguiente en la parte inferior de la ventana:
Haga clic en la marca de verificación Comprar para completar la creación de la base de datos.
Una vez que se ha creado la base de datos, puede administrarla desde la pestaña COMPLEMENTOS del Portal de administración. Para consultar la información de conexión de la base de datos, haga clic en Información de conexión en la parte inferior de la página:
Copie la cadena de conexión con clic en el botón copiar cerca del campo Connectionstring y guárdelo. Usará esta información más adelante en este tutorial en la aplicación MVC:
Creación de un proyecto de aplicación MVC
Para completar los pasos de esta sección del tutorial, primero deberá instalar Visual Studio Express 2013 para Web o Visual Studio 2013. Una vez instalado Visual Studio, siga estos pasos para crear un nuevo proyecto de aplicación MVC:
Abra Visual Studio 2013.
Haga clic en Nuevo proyecto en la página Inicio, o haga clic en el menú Archivo y en Nuevo proyecto:
Cuando se muestre el cuadro de diálogo Nuevo proyecto, expanda Visual C# en la lista de plantillas, haga clic en Web y seleccione Aplicación web de ASP.NET. Asigne al proyecto el nombre IdentityMySQLDemo y haga clic en Aceptar:
En el cuadro de diálogo Nuevo proyecto ASP.NET, seleccione la plantilla MVC con las opciones predeterminadas, lo que configura las Cuentas de usuario individuales como método de autenticación. Haga clic en Aceptar:
Configuración de EntityFramework para que trabaje con una base de datos MySQL
Actualización del ensamblado de Entity Framework para el proyecto
La aplicación MVC que se creó a partir de la plantilla de Visual Studio 2013 contiene una referencia al paquete EntityFramework 6.0.0, pero ha habido actualizaciones en ese ensamblado desde su versión con mejoras de rendimiento significativas. Siga estos pasos para usar estas últimas actualizaciones en la aplicación.
Abra el proyecto MVC en Visual Studio.
Haga clic en Herramientas, luego en Administrador de paquetes NuGet y en Consola del administrador de paquetes:
La Consola del administrador de paquetes aparecerá en la sección inferior de Visual Studio. Escriba "Update-Package EntityFramework" y pulse Inter:
Instalación del proveedor MySQL para EntityFramework
Para que EntityFramework se conecte a la base de datos MySQL, debe instalar un proveedor de MySQL. Para ello, abra la Consola del administrador de paquetes y escriba "Install-Package MySql.Data.Entity -Pre" y pulse Inter.
Nota:
Se trata de una versión preliminar del ensamblado y, como tal, puede contener errores. No debe usar una versión preliminar del proveedor en producción.
[Haga clic en la siguiente imagen para expandirla.]
Hacer cambios en la configuración del proyecto en el archivo Web.config de la aplicación
En esta sección, configurará que Entity Framework use el proveedor mySQL que acaba de instalar, registre el generador de proveedores de MySQL y agregue la cadena de conexión desde Azure.
Nota:
Los siguientes ejemplos contienen una versión de ensamblado específica para MySql.Data.dll. Si la versión del ensamblado cambia, deberá modificar las opciones de configuración adecuadas con la versión correcta.
Abra el archivo Web.config del proyecto en Visual Studio 2013.
Busque las siguientes opciones de configuración, que definen el proveedor de base de datos predeterminado y generador de 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>
Reemplace esos ajustes de configuración por lo siguiente, que configurará que Entity Framework use el proveedor 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>
Busque la sección <connectionStrings> y reemplácela por el siguiente código, que definirá la cadena de conexión de la base de datos MySQL hospedada en Azure (tenga en cuenta que el valor providerName también se ha cambiado respecto al original):
<connectionStrings> <add name="DefaultConnection" providerName="MySql.Data.MySqlClient" connectionString="[Insert your ConnectionString from Azure here]"/> </connectionStrings>
Agregar contexto personalizado de MigrationHistory
Entity Framework Code First usa una tabla MigrationHistory para realizar un seguimiento de los cambios del modelo y garantizar la coherencia entre el esquema de la base de datos y conceptual. Sin embargo, esta tabla no funciona en MySQL de forma predeterminada porque la clave principal es muy grande. Para solucionar esta situación, deberá reducir el tamaño de la clave de esa tabla. Para ello, siga estos pasos:
La información de esquema de esta tabla se captura en un HistoryContext, que se puede modificar como cualquier otro DbContext. Para ello, agregue un nuevo archivo de clase con el nombre MySqlHistoryContext.cs al proyecto y reemplace su contenido por el siguiente código:
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(); } } }
A continuación, deberá configurar que Entity Framework el HistoryContext modificado, en vez de uno predeterminado. Esto se puede hacer aprovechando las características de configuración basadas en código. Para ello, agregue un nuevo archivo de clase con el nombre MySqlConfiguration.cs al proyecto y reemplace su contenido por:
using System.Data.Entity; namespace IdentityMySQLDemo { public class MySqlConfiguration : DbConfiguration { public MySqlConfiguration() { SetHistoryContext( "MySql.Data.MySqlClient", (conn, schema) => new MySqlHistoryContext(conn, schema)); } } }
Creación de un inicializador EntityFramework personalizado para ApplicationDbContext
El proveedor MySQL de este tutorial no admite migraciones de Entity Framework a día de hoy, por lo que deberá usar inicializadores de modelos para conectarse a la base de datos. Dado que este tutorial usa una instancia de MySQL en Azure, deberá crear un inicializador personalizado de Entity Framework.
Nota:
Este paso no es necesario si se conecta a una instancia de SQL Server en Azure o usa una base de datos hospedada en el entorno local.
Siga estos pasos para crear un inicializador de Entity Framework personalizado para MySQL:
Agregue un nuevo archivo de clase con el nombre MySqlInitializer.cs al proyecto y reemplace el contenido por el siguiente código:
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(); } } } } }
Abra el archivo IdentityModels.cs del proyecto, que se encuentra en el directorio Modelos y reemplace el contenido por lo siguiente:
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") { } } }
Ejecución de la aplicación y comprobación de la base de datos
Una vez que haya completado los pasos de las secciones anteriores, debe probar la base de datos. Para ello, siga estos pasos:
Presiona CTRL+F5 para compilar y ejecutar la aplicación web.
Haga clic en la pestaña Registrar de la parte superior de la página:
Escriba un nuevo nombre de usuario y contraseña y haga clic en Registrar:
Llegados aquí, las tablas de ASP.NET Identity se crean en la base de datos MySQL y el usuario se registra e inicia sesión en la aplicación:
Instalación de la herramienta MySQL Workbench para la comprobación de datos
Instalación de la herramienta MySQL Workbench desde la página de descargas de MySQL
En el Asistente para la instalación: en la pestaña Selección de características, seleccione MySQL Workbench en la sección Aplicaciones.
Inicie la aplicación y agregue una nueva conexión mediante los datos cadena de conexión de la base de datos de Azure MySQL que creó al principio de este tutorial.
Tras establecer la conexión, inspeccione las tablas de ASP.NET Identity creadas en IdentityMySQLDatabase.
Verá que todas las tablas necesarias de ASP.NET Identity se crean tal y como se muestra en la siguiente imagen:
Inspeccione la tabla aspnetusers para que, por ejemplo, compruebe las entradas según registra nuevos usuarios.