Compartir a través de


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

  1. Inicie sesión en Azure Portal.

  2. Haga clic en Nuevo en la parte inferior de la página y seleccione Tienda:

    Screenshot of the Azure Portal menu with the Store menu item highlighted at bottom and outlined with a red rectangle.

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

    [Haga clic en la siguiente imagen para expandirla. ] Screenshot of the Choose an Add-on wizard, with Clear D B My S Q L Database highlighted with a red rectangle.

  4. 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 siguiente imagen para expandirla. ] Screenshot of the Personalize Add-on dialog showing the Free plan option and the Name and region fields selected and highlighted with a red rectangle.

  5. Haga clic en la marca de verificación Comprar para completar la creación de la base de datos.

    [Haga clic en la siguiente imagen para expandirla. ] Screenshot of the Review Purchase dialog showing the Purchase button highlighted with a red rectangle.

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

    [Haga clic en la siguiente imagen para expandirla. ] Screenshot of the management portal with the Add Ons tab, the Identify My S Q L database item, and the Connection Info button highlighted in red.

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

    [Haga clic en la siguiente imagen para expandirla. ] Screenshot of Connection info dialog with copy button highlighted at right of Connection String field.

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:

  1. Abra Visual Studio 2013.

  2. Haga clic en Nuevo proyecto en la página Inicio, o haga clic en el menú Archivo y en Nuevo proyecto:

    [Haga clic en la siguiente imagen para expandirla. ] Screenshot of the Visual Studio start page showing the New Project option highlighted with a red rectangle.

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

    [Haga clic en la siguiente imagen para expandirla. ] Screenshot of New Project dialog box, with Visual C hash mark expanded at left and Web highlighted. ASP dot NET Web Application selected at right with project name Identity My S Q L Demo in name field at bottom.

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

    [Haga clic en la siguiente imagen para expandirla. ] Screenshot of New A S P dot NET Project dialog, with M V C template selected and default options checked.

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.

  1. Abra el proyecto MVC en Visual Studio.

  2. Haga clic en Herramientas, luego en Administrador de paquetes NuGet y en Consola del administrador de paquetes:

    [Haga clic en la siguiente imagen para expandirla. ] Screenshot of M V C project in Visual Studio, with Tools selected in top menu, Library Package Manager selected at left and Package Manager Console selected at right.

  3. La Consola del administrador de paquetes aparecerá en la sección inferior de Visual Studio. Escriba "Update-Package EntityFramework" y pulse Inter:

    [Haga clic en la siguiente imagen para expandirla. ] Screenshot of Package Manager Console in bottom section of Visual Studio, with Update Package Entity Framework instruction displayed on command line.

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

Screenshot of Package Manager Console in bottom section of Visual Studio, with Install-Package My S q l dot Data dot Entity dash Pre instruction displayed on command line.

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.

  1. Abra el archivo Web.config del proyecto en Visual Studio 2013.

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

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

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

  1. Presiona CTRL+F5 para compilar y ejecutar la aplicación web.

  2. Haga clic en la pestaña Registrar de la parte superior de la página:

    [Haga clic en la siguiente imagen para expandirla. ] Screenshot of A S P dot NET website, with Register tab highlighted in menu at upper right.

  3. Escriba un nuevo nombre de usuario y contraseña y haga clic en Registrar:

    [Haga clic en la siguiente imagen para expandirla. ] Screenshot of A S P dot NET registration dialog, with user name, password, and confirm password fields completed and Register button highlighted below.

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

    [Haga clic en la siguiente imagen para expandirla. ] Screenshot of A S P dot NET website after user has completed registration. Tab with Hello greeting, followed by username, is highlighted in menu at upper right.

Instalación de la herramienta MySQL Workbench para la comprobación de datos

  1. Instalación de la herramienta MySQL Workbench desde la página de descargas de MySQL

  2. En el Asistente para la instalación: en la pestaña Selección de características, seleccione MySQL Workbench en la sección Aplicaciones.

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

  4. Tras establecer la conexión, inspeccione las tablas de ASP.NET Identity creadas en IdentityMySQLDatabase.

  5. Verá que todas las tablas necesarias de ASP.NET Identity se crean tal y como se muestra en la siguiente imagen:

    [Haga clic en la siguiente imagen para expandirla. ] Screenshot of My S Q L Workbench tool dialog. A S P dot NET Identity tables created on the Identity My S Q L Database are highlighted at lower left.

  6. Inspeccione la tabla aspnetusers para que, por ejemplo, compruebe las entradas según registra nuevos usuarios.

    [Haga clic en la siguiente imagen para expandirla. ] Screenshot of a s p net users table, with entries displaying I D, User Name, Password Hash, Security Stamp, and Discriminator columns.