ASP.NET Identity: EntityFramework MySQL 공급자에 MySQL 스토리지 사용(C#)

작성자 : Maurycy Markowski, Raquel Soares De Almeida, Robert McMurray

이 자습서에서는 ASP.NET Identity 에 대한 기본 데이터 스토리지 메커니즘을 EntityFramework(SQL 클라이언트 공급자)로 MySQL 공급자로 바꾸는 방법을 보여 줍니다.

다음 topics 이 자습서에서 다룹니다.

  • Azure에서 MySQL 데이터베이스 만들기
  • Visual Studio 2013 MVC 템플릿을 사용하여 MVC 애플리케이션 만들기
  • MySQL 데이터베이스 공급자와 작동하도록 EntityFramework 구성
  • 애플리케이션을 실행하여 결과 확인

이 자습서의 끝부분에서는 Azure에서 호스트되는 MySQL 데이터베이스를 사용하는 ASP.NET ID 저장소가 있는 MVC 애플리케이션을 갖게 됩니다.

Azure에서 MySQL 데이터베이스 instance 만들기

  1. Azure Portal에 로그인합니다.

  2. 페이지 아래쪽에서 새로 만들기를 클릭한 다음 스토어를 선택합니다.

    스토어 메뉴 항목이 아래쪽에 강조 표시되고 빨간색 사각형이 윤곽선으로 표시된 Azure Portal 메뉴의 스크린샷.

  3. 추가 기능 선택 마법사에서 ClearDB MySQL 데이터베이스를 선택한 다음 프레임 아래쪽에서 다음 화살표를 클릭합니다.

    [다음 이미지를 클릭하여 확장합니다. ] DB 내 S QL 데이터베이스 지우기가 빨간색 사각형으로 강조 표시된 추가 기능 선택 마법사의 스크린샷

  4. 기본 무료 플랜을 유지하고 , NAMEIdentityMySQLDatabase로 변경하고, 가장 가까운 지역을 선택한 다음, 프레임 아래쪽에서 다음 화살표를 클릭합니다.

    [다음 이미지를 클릭하여 확장합니다. ] 무료 요금제 옵션과 빨간색 사각형으로 선택되고 강조 표시된 이름 및 지역 필드를 보여 주는 추가 기능 개인 설정 대화 상자의 스크린샷

  5. 구매 확인 표시를 클릭하여 데이터베이스 만들기를 완료합니다.

    [다음 이미지를 클릭하여 확장합니다. ] 빨간색 사각형으로 강조 표시된 구매 단추를 보여 주는 구매 검토 대화 상자의 스크린샷

  6. 데이터베이스가 만들어진 후 관리 포털의 ADD-ONS 탭에서 관리할 수 있습니다. 데이터베이스에 대한 연결 정보를 검색하려면 페이지 아래쪽에서 연결 정보를 클릭합니다.

    [다음 이미지를 클릭하여 확장합니다. ] 추가 기능 탭, 내 S QL 데이터베이스 식별 항목 및 연결 정보 단추가 빨간색으로 강조 표시된 관리 포털의 스크린샷

  7. CONNECTIONSTRING 필드 옆의 복사 단추를 클릭하여 연결 문자열을 복사하고 저장합니다. 이 정보는 이 자습서의 뒷부분에서 MVC 애플리케이션에 사용합니다.

    [다음 이미지를 클릭하여 확장합니다. ] 연결 문자열 필드 오른쪽에 복사 단추가 강조 표시된 연결 정보 대화 상자의 스크린샷

MVC 애플리케이션 프로젝트 만들기

자습서의 이 섹션에 있는 단계를 완료하려면 먼저 웹용 Visual Studio Express 2013 또는 Visual Studio 2013 설치해야 합니다. Visual Studio가 설치되면 다음 단계를 사용하여 새 MVC 애플리케이션 프로젝트를 만듭니다.

  1. Visual Studio 2103을 엽니다.

  2. 시작 페이지에서 새 프로젝트를 클릭하거나 파일 메뉴를 클릭한 다음 새 프로젝트를 클릭할 수 있습니다.

    [다음 이미지를 클릭하여 확장합니다. ] 빨간색 사각형으로 강조 표시된 새 프로젝트 옵션을 보여 주는 Visual Studio 시작 페이지의 스크린샷

  3. 새 프로젝트 대화 상자가 표시되면 템플릿 목록에서 Visual C#을 확장한 다음 을 클릭하고 ASP.NET 웹 애플리케이션을 선택합니다. 프로젝트 이름을 IdentityMySQLDemo 로 지정하고 확인을 클릭합니다.

    [다음 이미지를 클릭하여 확장합니다. ] 왼쪽에서 Visual C 해시 표시가 확장되고 웹이 강조 표시된 새 프로젝트 대화 상자의 스크린샷 ASP dot NET Web Application이 오른쪽에서 선택되고 프로젝트 이름 ID 내 S QL 데모가 이름 필드 아래쪽에 있습니다.

  4. 새 ASP.NET 프로젝트 대화 상자에서 기본 옵션으로 MVC 템플릿을 선택합니다. 이렇게 하면 개별 사용자 계정이 인증 방법으로 구성됩니다. 확인을 클릭합니다.

    [다음 이미지를 클릭하여 확장합니다. ] M V C 템플릿이 선택되고 기본 옵션이 선택된 새 ASP 점 NET 프로젝트 대화 상자의 스크린샷

MySQL 데이터베이스와 함께 작동하도록 EntityFramework 구성

프로젝트의 Entity Framework 어셈블리 업데이트

Visual Studio 2013 템플릿에서 만든 MVC 애플리케이션에는 EntityFramework 6.0.0 패키지에 대한 참조가 포함되어 있지만 릴리스 이후 해당 어셈블리에 대한 업데이트가 있어 성능이 크게 향상되었습니다. 애플리케이션에서 이러한 최신 업데이트를 사용하려면 다음 단계를 사용합니다.

  1. Visual Studio에서 MVC 프로젝트를 엽니다.

  2. 도구를 클릭한 다음 NuGet 패키지 관리자를 클릭한 다음 패키지 관리자 콘솔을 클릭합니다.

    [다음 이미지를 클릭하여 확장합니다. ] 상단 메뉴에서 도구가 선택되고, 라이브러리 패키지 관리자가 왼쪽에서 선택되고, 오른쪽에 패키지 관리자 콘솔이 선택된 Visual Studio의 M V C 프로젝트 스크린샷

  3. 패키지 관리자 콘솔은 Visual Studio의 아래쪽 섹션에 표시됩니다. "Update-Package EntityFramework"를 입력하고 Enter 키를 누릅니다.

    [다음 이미지를 클릭하여 확장합니다. ] 명령줄에 패키지 엔터티 프레임워크 업데이트 명령이 표시된 Visual Studio 아래쪽 섹션의 패키지 관리자 콘솔 스크린샷

EntityFramework용 MySQL 공급자 설치

EntityFramework가 MySQL 데이터베이스에 연결하려면 MySQL 공급자를 설치해야 합니다. 이렇게 하려면 패키지 관리자 콘솔 을 열고 "Install-Package MySql.Data.Entity -Pre"를 입력한 다음 Enter 키를 누릅니다.

참고

어셈블리의 시험판 버전이므로 버그가 포함될 수 있습니다. 프로덕션 환경에서 공급자의 시험판 버전을 사용하면 안 됩니다.

[다음 이미지를 클릭하여 확장합니다.]

명령줄에 Install-Package 내 S q l 점 데이터 점 엔터티 대시 사전 명령이 표시된 Visual Studio 아래쪽 섹션의 패키지 관리자 콘솔 스크린샷

애플리케이션에 대한 Web.config 파일의 프로젝트 구성 변경

이 섹션에서는 방금 설치한 MySQL 공급자를 사용하고, MySQL 공급자 팩터리를 등록하고, Azure에서 연결 문자열을 추가하도록 Entity Framework를 구성합니다.

참고

다음 예제에는 MySql.Data.dll 대한 특정 어셈블리 버전이 포함되어 있습니다. 어셈블리 버전이 변경되면 올바른 버전으로 적절한 구성 설정을 수정해야 합니다.

  1. Visual Studio 2013 프로젝트의 Web.config 파일을 엽니다.

  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. 이러한 구성 설정을 다음으로 바꿉니다. 그러면 MySQL 공급자를 사용하도록 Entity Framework가 구성됩니다.

    <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> 섹션을 찾아 Azure에서 호스트되는 MySQL 데이터베이스에 대한 연결 문자열을 정의하는 다음 코드로 바꿉니다(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. 이 테이블의 스키마 정보는 다른 DbContext로 수정할 수 있는 HistoryContext에서 캡처됩니다. 이렇게 하려면 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. 다음으로, 기본값이 아닌 수정된 HistoryContext를 사용하도록 Entity Framework를 구성해야 합니다. 이 작업은 코드 기반 구성 기능을 활용하여 수행할 수 있습니다. 이렇게 하려면 MySqlConfiguration.cs 라는 새 클래스 파일을 프로젝트에 추가하고 해당 내용을 다음으로 대체합니다.

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

ApplicationDbContext에 대한 사용자 지정 EntityFramework 이니셜라이저 만들기

이 자습서에 소개된 MySQL 공급자는 현재 Entity Framework 마이그레이션을 지원하지 않으므로 데이터베이스에 연결하려면 모델 이니셜라이저를 사용해야 합니다. 이 자습서는 Azure에서 MySQL instance 사용하므로 사용자 지정 Entity Framework 이니셜라이저를 만들어야 합니다.

참고

Azure의 SQL Server instance 연결하거나 온-프레미스에서 호스트되는 데이터베이스를 사용하는 경우에는 이 단계가 필요하지 않습니다.

MySQL용 사용자 지정 Entity Framework 이니셜라이저를 만들려면 다음 단계를 사용합니다.

  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. Models 디렉터리에 있는 프로젝트에 대한 IdentityModels.cs 파일을 열고 해당 내용을 다음으로 바꿉니다.

    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. 페이지 맨 위에 있는 등록 탭을 클릭합니다.

    [다음 이미지를 클릭하여 확장합니다. ] 오른쪽 위 메뉴에서 등록 탭이 강조 표시된 SP 점 NET 웹 사이트의 스크린샷

  3. 새 사용자 이름 및 암호를 입력한 다음 등록을 클릭합니다.

    [다음 이미지를 클릭하여 확장합니다. ] 사용자 이름, 암호 및 암호 필드가 완료되었는지 확인하고 아래에 등록 단추가 강조 표시된 SP 점 NET 등록 대화 상자의 스크린샷

  4. 이 시점에서 ASP.NET ID 테이블이 MySQL 데이터베이스에 만들어지고 사용자가 등록되어 애플리케이션에 로그인됩니다.

    [다음 이미지를 클릭하여 확장합니다. ] 사용자가 등록을 완료한 후의 SP 점 NET 웹 사이트 스크린샷 Hello 인사말이 있는 탭과 사용자 이름이 차례로 표시되는 탭은 오른쪽 위 메뉴에서 강조 표시됩니다.

데이터를 확인하기 위해 MySQL Workbench 도구 설치

  1. MySQL다운로드 페이지에서 MySQL Workbench 도구 설치

  2. 설치 마법사: 기능 선택 탭의 애플리케이션 섹션에서 MySQL Workbench 선택합니다.

  3. 이 자습서의 시작 부분에서 만든 Azure MySQL 데이터베이스의 연결 문자열 데이터를 사용하여 앱을 시작하고 새 연결을 추가합니다.

  4. 연결을 설정한 후 IdentityMySQLDatabase에서 만든 ASP.NET ID 테이블을 검사합니다.

  5. 아래 이미지와 같이 모든 ASP.NET ID 필수 테이블이 만들어지는 것을 볼 수 있습니다.

    [다음 이미지를 클릭하여 확장합니다. ] 내 S QL Workbench 도구 대화 상자의 스크린샷 ID 내 S QL 데이터베이스에서 만든 SP dot NET Identity 테이블이 왼쪽 아래에 강조 표시됩니다.

  6. 새 사용자를 등록할 때 항목을 검사 instance 대한 aspnetusers 테이블을 검사합니다.

    [다음 이미지를 클릭하여 확장합니다. ] ID, 사용자 이름, 암호 해시, 보안 스탬프 및 판별자 열이 표시된 항목이 있는 p net 사용자 테이블의 스크린샷