Поделиться через


ASP.NET Identity. Использование хранилища MySQL с помощью поставщика EntityFramework MySQL (C#)

Мориси Марковски, Ракель Соарес Де Алмейда, Роберт Мак-Мюррей

В этом руководстве показано, как заменить механизм хранения данных по умолчанию для ASP.NET Identity на EntityFramework (поставщик клиента SQL) поставщиком MySQL.

В этом руководстве рассматриваются следующие темы:

  • Создание базы данных MySQL в Azure
  • Создание приложения MVC с помощью шаблона MVC Visual Studio 2013
  • Настройка EntityFramework для работы с поставщиком базы данных MySQL
  • Запуск приложения для проверки результатов

В конце этого руководства у вас будет приложение MVC с хранилищем удостоверений ASP.NET, которое использует базу данных MySQL, размещенную в Azure.

Создание экземпляра базы данных MySQL в Azure

  1. Войдите на портал Azure.

  2. Нажмите кнопку СОЗДАТЬ в нижней части страницы, а затем выберите STORE:

    Снимок экрана: меню портала Azure с элементом меню

  3. В мастере выбора надстройки выберите ClearDB MySQL Database и щелкните стрелку Далее в нижней части кадра:

    [Щелкните следующее изображение, чтобы развернуть его. ] Снимок экрана: мастер выбора надстройки с выделенным красным прямоугольником clear D B My S Q L Database.

  4. Оставьте план Бесплатный по умолчанию, измените имя на IdentityMySQLDatabase, выберите ближайший к вам регион и щелкните стрелку Далее в нижней части кадра:

    [Щелкните следующее изображение, чтобы развернуть его. ] Снимок экрана: диалоговое окно персонализации надстройки с параметром План \Бесплатный\, а также выбранными полями имя и регион, выделенными красным прямоугольником.

  5. Установите флажок КУПИТЬ , чтобы завершить создание базы данных.

    [Щелкните следующее изображение, чтобы развернуть его. ] Снимок экрана: диалоговое окно проверки покупки с выделенной кнопкой

  6. После создания базой данных можно управлять на вкладке НАДСТРОЙКИ портала управления. Чтобы получить сведения о подключении для базы данных, щелкните Сведения о подключении в нижней части страницы:

    [Щелкните следующее изображение, чтобы развернуть его. ] Снимок экрана портала управления с вкладкой

  7. Скопируйте строку подключения, нажав кнопку копирования в поле CONNECTIONSTRING , и сохраните ее; Эти сведения будут использоваться далее в этом руководстве для приложения MVC:

    [Щелкните следующее изображение, чтобы развернуть его. ] Снимок экрана: диалоговое окно сведений о подключении с выделенной кнопкой копирования справа от поля Строка подключения.

Создание проекта приложения MVC

Чтобы выполнить действия, описанные в этом разделе руководства, сначала необходимо установить Visual Studio Express 2013 для Web или Visual Studio 2013. После установки Visual Studio выполните следующие действия, чтобы создать проект приложения MVC:

  1. Откройте Visual Studio 2103.

  2. Щелкните Создать проект на начальной странице или выберите меню Файл и Создать проект:

    [Щелкните следующее изображение, чтобы развернуть его. ] Снимок экрана: начальная страница Visual Studio с параметром

  3. Когда откроется диалоговое окно Новый проект , разверните visual C# в списке шаблонов, щелкните Интернет и выберите ASP.NET Веб-приложение. Назовите проект IdentityMySQLDemo и нажмите кнопку ОК:

    [Щелкните следующее изображение, чтобы развернуть его. ] Снимок экрана: диалоговое окно

  4. В диалоговом окне Новый проект ASP.NET выберите шаблон MVC с параметрами по умолчанию; Это позволит настроить отдельные учетные записи пользователей в качестве метода проверки подлинности. Нажмите кнопку ОК:

    [Щелкните следующее изображение, чтобы развернуть его. ] Снимок экрана: диалоговое окно

Настройка EntityFramework для работы с базой данных MySQL

Обновление сборки Entity Framework для проекта

Приложение MVC, созданное на основе шаблона Visual Studio 2013, содержит ссылку на пакет EntityFramework 6.0.0, но с момента выпуска этой сборки были обновлены, которые содержат значительные улучшения производительности. Чтобы использовать эти последние обновления в приложении, выполните следующие действия.

  1. Откройте проект MVC в Visual Studio.

  2. Щелкните Сервис, затем диспетчер пакетов NuGet, а затем консоль диспетчера пакетов:

    [Щелкните следующее изображение, чтобы развернуть его. ] Снимок экрана: проект M V C в Visual Studio с выбранным в верхнем меню сервисом, диспетчером пакетов библиотеки слева и консолью диспетчера пакетов справа.

  3. Консоль диспетчера пакетов появится в нижнем разделе Visual Studio. Введите "Update-Package EntityFramework" и нажмите клавишу ВВОД:

    [Щелкните следующее изображение, чтобы развернуть его. ] Снимок экрана: консоль диспетчера пакетов в нижней части Visual Studio, где в командной строке отображается инструкция Update Package Entity Framework.

Установка поставщика MySQL для EntityFramework

Чтобы EntityFramework подключался к базе данных MySQL, необходимо установить поставщик MySQL. Для этого откройте консоль диспетчера пакетов и введите "Install-Package MySql.Data.Entity -Pre" и нажмите клавишу ВВОД.

Примечание

Это предварительная версия сборки, поэтому она может содержать ошибки. Не следует использовать предварительную версию поставщика в рабочей среде.

[Щелкните следующее изображение, чтобы развернуть его.]

Снимок экрана: консоль диспетчера пакетов в нижнем разделе Visual Studio, где в командной строке отображается Install-Package My S q l dot Data dot Entity dash Pre instruction (Предварительная инструкция).

Внесение изменений в конфигурацию проекта в файл Web.config для приложения

В этом разделе вы настроите Entity Framework для использования только что установленного поставщика MySQL, зарегистрируйте фабрику поставщиков MySQL и добавите строку подключения из Azure.

Примечание

Следующие примеры содержат определенную версию сборки для MySql.Data.dll. Если версия сборки меняется, необходимо изменить соответствующие параметры конфигурации, указав правильную версию.

  1. Откройте файл Web.config проекта в Visual Studio 2013.

  2. Найдите следующие параметры конфигурации, которые определяют поставщика базы данных по умолчанию и фабрику для 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. Замените эти параметры конфигурации следующими параметрами, которые настроят Entity Framework для использования поставщика 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. <Найдите раздел connectionStrings> и замените его следующим кодом, который определит строку подключения для базы данных MySQL, размещенной в Azure (обратите внимание, что значение providerName также было изменено по сравнению с исходной):

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

Добавление пользовательского контекста MigrationHistory

Entity Framework Code First использует таблицу MigrationHistory для отслеживания изменений модели и обеспечения согласованности между схемой базы данных и концептуальной схемой. Однако эта таблица не работает для MySQL по умолчанию, так как первичный ключ слишком велик. Чтобы устранить эту проблему, необходимо уменьшить размер ключа для этой таблицы. Для этого выполните следующие действия.

  1. Сведения о схеме для этой таблицы записываются в historyContext, который можно изменить как любой другой DbContext. Для этого добавьте в проект новый файл класса MySqlHistoryContext.cs и замените его содержимое следующим кодом:

    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. Затем необходимо настроить Entity Framework для использования измененного HistoryContext, а не по умолчанию. Это можно сделать, используя функции конфигурации на основе кода. Для этого добавьте в проект новый файл класса MySqlConfiguration.cs и замените его содержимое следующим:

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

Создание пользовательского инициализатора EntityFramework для ApplicationDbContext

Поставщик MySQL, который рассматривается в этом руководстве, в настоящее время не поддерживает миграции Entity Framework, поэтому для подключения к базе данных потребуется использовать инициализаторы моделей. Так как в этом руководстве используется экземпляр MySQL в Azure, необходимо создать пользовательский инициализатор Entity Framework.

Примечание

Этот шаг не требуется, если вы подключаетесь к экземпляру SQL Server в Azure или используете базу данных, размещенную локально.

Чтобы создать пользовательский инициализатор Entity Framework для MySQL, выполните следующие действия.

  1. Добавьте в проект новый файл класса с именем MySqlInitializer.cs и замените его содержимое следующим кодом:

    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. Откройте файл IdentityModels.cs для проекта, который находится в каталоге Models , и замените его содержимое следующим:

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

Запуск приложения и проверка базы данных

После выполнения действий, описанных в предыдущих разделах, необходимо протестировать базу данных. Для этого выполните следующие действия.

  1. Нажмите клавиши CTRL+F5 , чтобы выполнить сборку и запуск веб-приложения.

  2. Откройте вкладку Регистрация в верхней части страницы:

    [Щелкните следующее изображение, чтобы развернуть его. ] Снимок экрана: веб-сайт A P Dot NET с выделенной вкладкой

  3. Введите новое имя пользователя и пароль, а затем нажмите кнопку Зарегистрировать:

    [Щелкните следующее изображение, чтобы развернуть его. ] Снимок экрана: диалоговое окно регистрации ТОЧКИ S P NET с заполненными полями имени пользователя, пароля и подтверждения пароля и выделенной кнопкой

  4. На этом этапе в базе данных MySQL создаются таблицы удостоверений ASP.NET, а пользователь регистрируется и входит в приложение:

    [Щелкните следующее изображение, чтобы развернуть его. ] Снимок экрана: веб-сайт A S P dot NET после завершения регистрации пользователя. В меню в правом верхнем углу выделена вкладка Приветствие, а затем имя пользователя.

Установка средства MySQL Workbench для проверки данных

  1. Установка средства MySQL Workbench со страницы загрузки MySQL

  2. На вкладке " Выбор компонентов " мастера установки выберите MySQL Workbench в разделе "Приложения ".

  3. Запустите приложение и добавьте новое подключение, используя данные строки подключения из базы данных Azure MySQL, созданной в начале этого руководства.

  4. После установки подключения проверьте таблицы ASP.NET Identity , созданные на базе данных IdentityMySQLDatabase.

  5. Вы увидите, что все необходимые таблицы ASP.NET Identity создаются, как показано на рисунке ниже:

    [Щелкните следующее изображение, чтобы развернуть его. ] Снимок экрана: диалоговое окно средства My S Q L Workbench. Таблицы удостоверений NET точки S P, созданные в базе данных Identity My S Q L, выделены в нижнем левом крае.

  6. Проверьте таблицу aspnetusers, чтобы проверка записей при регистрации новых пользователей.

    [Щелкните следующее изображение, чтобы развернуть его. ] Снимок экрана: таблица пользователей s p net с записями, отображающими столбцы ID, User Name, Password Hash, Security Stamp и Discriminator.