Udostępnij za pośrednictwem


ASP.NET Identity: używanie usługi MySQL Storage z dostawcą MySQL programu EntityFramework (C#)

Autor: Maurycy Markowski, Raquel Soares De Almeida, Robert McMurray

W tym samouczku pokazano, jak zastąpić domyślny mechanizm przechowywania danych dla ASP.NET Identity dostawcą EntityFramework (dostawcą klienta SQL) dostawcą mySQL.

Następujące tematy zostaną omówione w tym samouczku:

  • Tworzenie bazy danych MySQL na platformie Azure
  • Tworzenie aplikacji MVC przy użyciu szablonu Visual Studio 2013 MVC
  • Konfigurowanie elementu EntityFramework do pracy z dostawcą bazy danych MySQL
  • Uruchamianie aplikacji w celu zweryfikowania wyników

Na końcu tego samouczka będziesz mieć aplikację MVC z magazynem ASP.NET Identity, który korzysta z bazy danych MySQL hostowanej na platformie Azure.

Tworzenie wystąpienia bazy danych MySQL na platformie Azure

  1. Zaloguj się do witryny Azure Portal.

  2. Kliknij pozycję NOWY w dolnej części strony, a następnie wybierz pozycję SKLEP:

    Zrzut ekranu przedstawiający menu witryny Azure Portal z wyróżnionym elementem menu Sklep u dołu i wyróżnionym czerwonym prostokątem.

  3. W kreatorze Wybieranie dodatku wybierz pozycję ClearDB MySQL Database, a następnie kliknij strzałkę Dalej w dolnej części ramki:

    [Kliknij poniższy obraz, aby go rozwinąć. ] Zrzut ekranu przedstawiający kreatora Wybierania dodatku z wyróżnioną czerwoną prostokątem bazę danych Clear D B My S Q L Database.

  4. Zachowaj domyślny plan Bezpłatny , zmień nazwę naIdentityMySQLDatabase, wybierz region znajdujący się najbliżej Ciebie, a następnie kliknij strzałkę Dalej w dolnej części ramki:

    [Kliknij poniższy obraz, aby go rozwinąć. ] Zrzut ekranu przedstawiający okno dialogowe Personalizowanie dodatku z wybraną opcją Plan bezpłatny oraz wybranymi polami Nazwa i region oraz wyróżnionymi czerwonym prostokątem.

  5. Kliknij znacznik wyboru ZAKUP , aby ukończyć tworzenie bazy danych.

    [Kliknij poniższy obraz, aby go rozwinąć. ] Zrzut ekranu przedstawiający okno dialogowe Przeglądanie zakupu z wyróżnionym przyciskiem Zakup z czerwonym prostokątem.

  6. Po utworzeniu bazy danych możesz zarządzać nią z poziomu karty ADD-ONS w portalu zarządzania. Aby pobrać informacje o połączeniu dla bazy danych, kliknij pozycję INFORMACJE O POŁĄCZENIU w dolnej części strony:

    [Kliknij poniższy obraz, aby go rozwinąć. ] Zrzut ekranu portalu zarządzania z kartą Dodaj włączone, elementem bazy danych Zidentyfikuj moją bazę danych S Q L i przyciskiem Informacje o połączeniu wyróżnionym na czerwono.

  7. Skopiuj parametry połączenia, klikając przycisk kopiowania przez pole CONNECTIONSTRING i zapisując je; Te informacje będą używane w dalszej części tego samouczka dla aplikacji MVC:

    [Kliknij poniższy obraz, aby go rozwinąć. ] Zrzut ekranu przedstawiający okno dialogowe Informacje o połączeniu z przyciskiem kopiowania wyróżnionym po prawej stronie pola Parametry połączenia.

Tworzenie projektu aplikacji MVC

Aby wykonać kroki opisane w tej sekcji samouczka, należy najpierw zainstalować Visual Studio Express 2013 dla sieci Web lub Visual Studio 2013. Po zainstalowaniu programu Visual Studio wykonaj następujące kroki, aby utworzyć nowy projekt aplikacji MVC:

  1. Otwórz program Visual Studio 2103.

  2. Kliknij pozycję Nowy projekt na stronie Start lub kliknij menu Plik , a następnie pozycję Nowy projekt:

    [Kliknij poniższy obraz, aby go rozwinąć. ] Zrzut ekranu przedstawiający stronę startową programu Visual Studio z wyróżnioną opcją Nowy projekt z czerwonym prostokątem.

  3. Po wyświetleniu okna dialogowego Nowy projekt rozwiń węzeł Visual C# na liście szablonów, a następnie kliknij pozycję Internet, a następnie wybierz pozycję ASP.NET Aplikacja internetowa. Nadaj projektowi nazwę IdentityMySQLDemo , a następnie kliknij przycisk OK:

    [Kliknij poniższy obraz, aby go rozwinąć. ] Zrzut ekranu przedstawiający okno dialogowe Nowy projekt z wyróżnionym znacznikiem skrótu visual C po lewej stronie i wyróżnionym znakiem Sieci Web. Aplikacja internetowa asp dot NET wybrana po prawej stronie z nazwą projektu Identity My S Q L Demo w polu nazwy u dołu.

  4. W oknie dialogowym Nowy projekt ASP.NET wybierz szablon MVC z opcjami domyślnymi; Spowoduje to skonfigurowanie indywidualnych kont użytkowników jako metody uwierzytelniania. Kliknij przycisk OK:

    [Kliknij poniższy obraz, aby go rozwinąć. ] Zrzut ekranu przedstawiający okno dialogowe Nowy projekt S P dot NET z zaznaczonym szablonem języka M V C i zaznaczonymi opcjami domyślnymi.

Konfigurowanie elementu EntityFramework do pracy z bazą danych MySQL

Aktualizowanie zestawu platformy Entity Framework dla projektu

Aplikacja MVC utworzona na podstawie szablonu Visual Studio 2013 zawiera odwołanie do pakietu EntityFramework 6.0.0, ale od czasu wydania wprowadzono aktualizacje tego zestawu, które zawierają znaczne ulepszenia wydajności. Aby użyć tych najnowszych aktualizacji w aplikacji, wykonaj następujące kroki.

  1. Otwórz projekt MVC w programie Visual Studio.

  2. Kliknij pozycję Narzędzia, a następnie kliknij pozycję Menedżer pakietów NuGet, a następnie kliknij pozycję Konsola menedżera pakietów:

    [Kliknij poniższy obraz, aby go rozwinąć. ] Zrzut ekranu przedstawiający projekt języka M V C w programie Visual Studio z narzędziami wybranymi w górnym menu Menedżer pakietów biblioteki wybranym po lewej stronie i konsolą menedżera pakietów wybraną po prawej stronie.

  3. Konsola menedżera pakietów zostanie wyświetlona w dolnej sekcji programu Visual Studio. Wpisz "Update-Package EntityFramework" i naciśnij klawisz Enter:

    [Kliknij poniższy obraz, aby go rozwinąć. ] Zrzut ekranu konsoli menedżera pakietów w dolnej sekcji programu Visual Studio z instrukcją Update Package Entity Framework wyświetlaną w wierszu polecenia.

Instalowanie dostawcy MySQL dla elementu EntityFramework

Aby element EntityFramework łączył się z bazą danych MySQL, należy zainstalować dostawcę MySQL. W tym celu otwórz konsolę menedżera pakietów i wpisz "Install-Package MySql.Data.Entity -Pre", a następnie naciśnij klawisz Enter.

Uwaga

Jest to wersja wstępna zestawu i w związku z tym może zawierać usterki. Nie należy używać wersji wstępnej dostawcy w środowisku produkcyjnym.

[Kliknij poniższy obraz, aby go rozwinąć.]

Zrzut ekranu konsoli menedżera pakietów w dolnej sekcji programu Visual Studio z instrukcjami Install-Package My S q l dot Data dot Entity dash Pre instrukcja wyświetlana w wierszu polecenia.

Wprowadzanie zmian konfiguracji projektu w pliku Web.config dla aplikacji

W tej sekcji skonfigurujesz program Entity Framework tak, aby korzystał z zainstalowanego dostawcy MySQL, zarejestrował fabrykę dostawcy MySQL i dodał parametry połączenia z platformy Azure.

Uwaga

Poniższe przykłady zawierają określoną wersję zestawu dla MySql.Data.dll. Jeśli wersja zestawu ulegnie zmianie, należy zmodyfikować odpowiednie ustawienia konfiguracji przy użyciu poprawnej wersji.

  1. Otwórz plik Web.config dla projektu w Visual Studio 2013.

  2. Znajdź następujące ustawienia konfiguracji, które definiują domyślnego dostawcę bazy danych i fabrykę dla programu 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. Zastąp te ustawienia konfiguracji następującymi ustawieniami, co spowoduje skonfigurowanie programu Entity Framework do korzystania z dostawcy 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. Znajdź sekcję <connectionStrings> i zastąp ją następującym kodem, który zdefiniuje parametry połączenia dla bazy danych MySQL hostowanej na platformie Azure (pamiętaj, że wartość providerName została również zmieniona z oryginalnej):

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

Dodawanie niestandardowego kontekstu MigrationHistory

Program Entity Framework Code First używa tabeli MigrationHistory do śledzenia zmian modelu i zapewnienia spójności między schematem bazy danych a schematem koncepcyjnym. Jednak ta tabela nie działa domyślnie dla bazy danych MySQL, ponieważ klucz podstawowy jest zbyt duży. Aby rozwiązać ten problem, należy zmniejszyć rozmiar klucza dla tej tabeli. Aby to zrobić, wykonaj następujące kroki:

  1. Informacje o schemacie dla tej tabeli są przechwytywane w obiekcie HistoryContext, który można zmodyfikować jako dowolny inny element DbContext. W tym celu dodaj do projektu nowy plik klasy o nazwie MySqlHistoryContext.cs i zastąp jego zawartość następującym kodem:

    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. Następnie należy skonfigurować program Entity Framework tak, aby używał zmodyfikowanego obiektu HistoryContext, a nie domyślnego. Można to zrobić, korzystając z funkcji konfiguracji opartych na kodzie. W tym celu dodaj nowy plik klasy o nazwie MySqlConfiguration.cs do projektu i zastąp jego zawartość:

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

Tworzenie niestandardowego inicjatora EntityFramework dla obiektu ApplicationDbContext

Dostawca MySQL, który jest opisywany w tym samouczku, nie obsługuje obecnie migracji programu Entity Framework, dlatego należy użyć inicjatorów modelu w celu nawiązania połączenia z bazą danych. Ponieważ w tym samouczku jest używane wystąpienie bazy danych MySQL na platformie Azure, należy utworzyć niestandardowy inicjator platformy Entity Framework.

Uwaga

Ten krok nie jest wymagany, jeśli nawiązujesz połączenie z wystąpieniem SQL Server na platformie Azure lub jeśli używasz bazy danych hostowanej lokalnie.

Aby utworzyć niestandardowy inicjator programu Entity Framework dla programu MySQL, wykonaj następujące kroki:

  1. Dodaj nowy plik klasy o nazwie MySqlInitializer.cs do projektu i zastąp jego zawartość następującym kodem:

    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. Otwórz plik IdentityModels.cs projektu, który znajduje się w katalogu Models , i zastąp jego zawartość następującym kodem:

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

Uruchamianie aplikacji i weryfikowanie bazy danych

Po wykonaniu kroków opisanych w poprzednich sekcjach należy przetestować bazę danych. Aby to zrobić, wykonaj następujące kroki:

  1. Naciśnij klawisze Ctrl + F5 , aby skompilować i uruchomić aplikację internetową.

  2. Kliknij kartę Zarejestruj w górnej części strony:

    [Kliknij poniższy obraz, aby go rozwinąć. ] Zrzut ekranu przedstawiający witrynę internetową S P dot NET z wyróżnioną kartą Rejestrowanie w menu w prawym górnym rogu.

  3. Wprowadź nową nazwę użytkownika i hasło, a następnie kliknij przycisk Zarejestruj:

    [Kliknij poniższy obraz, aby go rozwinąć. ] Zrzut ekranu przedstawiający okno dialogowe rejestracji S P dot NET z nazwą użytkownika, hasłem i potwierdzeniem ukończonych pól haseł i wyróżnionym poniżej przyciskiem Zarejestruj.

  4. Na tym etapie tabele ASP.NET Identity są tworzone w bazie danych MySQL, a użytkownik jest zarejestrowany i zalogowany w aplikacji:

    [Kliknij poniższy obraz, aby go rozwinąć. ] Zrzut ekranu przedstawiający witrynę internetową S P dot NET po zakończeniu rejestracji przez użytkownika. Karta Witaj powitanie, a następnie nazwa użytkownika, jest wyróżniona w menu w prawym górnym rogu.

Instalowanie narzędzia MySQL Workbench w celu zweryfikowania danych

  1. Instalowanie narzędzia MySQL Workbench ze strony pobierania mySQL

  2. W kreatorze instalacji: wybór funkcji wybierz pozycję MySQL Workbench w sekcji aplikacje .

  3. Uruchom aplikację i dodaj nowe połączenie przy użyciu danych parametrów połączenia z bazy danych Azure MySQL utworzonej na początku tego samouczka.

  4. Po nawiązaniu połączenia sprawdź tabele ASP.NET Identity utworzone w bazie danych IdentityMySQLDatabase.

  5. Zobaczysz, że wszystkie tabele wymagane ASP.NET Identity są tworzone, jak pokazano na poniższej ilustracji:

    [Kliknij poniższy obraz, aby go rozwinąć. ] Zrzut ekranu przedstawiający okno dialogowe narzędzia My S Q L Workbench. Tabele S P dot NET Identity utworzone w bazie danych Identity My S Q L są wyróżnione w lewym dolnym rogu.

  6. Sprawdź tabelę aspnetusers na przykład, aby sprawdzić wpisy podczas rejestrowania nowych użytkowników.

    [Kliknij poniższy obraz, aby go rozwinąć. ] Zrzut ekranu przedstawiający tabelę użytkowników s p net z wpisami wyświetlanymi we/wy, nazwa użytkownika, skrót hasła, sygnatura zabezpieczeń i kolumny dyskryminujące.