다음을 통해 공유


사용자 지정 MySQL ASP.NET Identity 스토리지 공급자 구현

작성자 : Raquel Soares De Almeida, Suhas Joshi, Tom FitzMacken

ASP.NET ID는 애플리케이션을 다시 작업하지 않고도 사용자 고유의 스토리지 공급자를 만들고 애플리케이션에 연결할 수 있는 확장 가능한 시스템입니다. 이 항목에서는 ASP.NET ID에 대한 MySQL 스토리지 공급자를 만드는 방법에 대해 설명합니다. 사용자 지정 스토리지 공급자를 만드는 방법에 대한 개요는 ASP.NET ID에 대한 사용자 지정 스토리지 공급자 개요를 참조하세요.

이 자습서를 완료하려면 업데이트 2를 사용하는 Visual Studio 2013 있어야 합니다.

이 자습서에서는 다음을 수행합니다.

  • Azure에서 MySQL 데이터베이스 instance 만드는 방법을 보여 줍니다.
  • MySQL 클라이언트 도구(MySQL Workbench)를 사용하여 테이블을 만들고 Azure에서 원격 데이터베이스를 관리하는 방법을 보여 줍니다.
  • 기본 ASP.NET ID 스토리지 구현을 MVC 애플리케이션 프로젝트에서 사용자 지정 구현으로 바꾸는 방법을 보여 줍니다.

이 자습서는 원래 라켈 소아레스 드 알메이다와 릭 앤더슨 ( @RickAndMSFT )에 의해 작성되었습니다. 샘플 프로젝트는 Suhas Joshi에 의해 ID 2.0에 대해 업데이트되었습니다. 토픽은 Tom FitzMacken에 의해 ID 2.0에 대해 업데이트되었습니다.

완료된 프로젝트 다운로드

이 자습서의 끝부분에서는 Azure에서 호스트되는 MySQL 데이터베이스로 작업하는 ASP.NET ID가 있는 MVC 애플리케이션 프로젝트를 갖게 됩니다.

완료된 MySQL 스토리지 공급자는 AspNet.Identity.MySQL(GitHub)에서 다운로드할 수 있습니다.

수행할 단계

이 자습서에서는 다음 작업을 수행합니다.

  1. Azure에서 MySQL 데이터베이스 만들기
  2. MySQL에서 ASP.NET ID 테이블 만들기
  3. MVC 애플리케이션을 만들고 MySQL 공급자를 사용하도록 구성
  4. 앱 실행

이 항목에서는 ASP.NET ID의 아키텍처와 고객 스토리지 공급자를 구현할 때 내려야 하는 결정에 대해 다루지 않습니다. 해당 정보는 ASP.NET ID에 대한 사용자 지정 스토리지 공급자 개요를 참조하세요.

MySQL 스토리지 공급자 클래스 검토

MySQL 스토리지 공급자를 만드는 단계로 이동하기 전에 스토리지 공급자를 구성하는 클래스를 살펴보겠습니다. 사용자 및 역할을 관리하려면 애플리케이션에서 호출되는 데이터베이스 작업 및 클래스를 관리하는 클래스가 필요합니다.

스토리지 클래스

  • IdentityUser - 사용자에 대한 속성을 포함합니다.
  • UserStore - 사용자를 추가, 업데이트 또는 검색하기 위한 작업을 포함합니다.
  • IdentityRole - 역할에 대한 속성을 포함합니다.
  • RoleStore - 역할을 추가, 삭제, 업데이트 및 검색하기 위한 작업을 포함합니다.

데이터 액세스 계층 클래스

이 예제의 경우 데이터 액세스 계층 클래스에는 테이블 작업을 위한 SQL 문이 포함됩니다. 그러나 코드에서 Entity Framework 또는 NHibernate와 같은 ORM(개체 관계형 매핑)을 사용할 수 있습니다. 특히 지연 로드 및 개체 캐싱을 포함하는 ORM이 없으면 애플리케이션의 성능이 저하됩니다.

  • MySQLDatabase - 데이터베이스 작업을 수행하기 위한 MySQL 데이터베이스 연결 및 메서드를 포함합니다. UserStore와 RoleStore는 모두 이 클래스의 instance 인스턴스화됩니다.
  • RoleTable - 역할을 저장하는 테이블에 대한 데이터베이스 작업을 포함합니다.
  • UserClaimsTable - 사용자 클레임을 저장하는 테이블에 대한 데이터베이스 작업을 포함합니다.
  • UserLoginsTable - 사용자 로그인 정보를 저장하는 테이블에 대한 데이터베이스 작업을 포함합니다.
  • UserRoleTable - 역할에 할당된 사용자를 저장하는 테이블에 대한 데이터베이스 작업을 포함합니다.
  • UserTable - 사용자를 저장하는 테이블에 대한 데이터베이스 작업을 포함합니다.

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

  1. Azure Portal에 로그인합니다.
  2. 페이지 아래쪽에서 +새로 만들기를 클릭한 다음 스토어를 선택합니다.
    Azure Portal 저장소에 액세스하는 방법을 보여 주는 이미지
  3. 선택 및 추가 기능 마법사에서 ClearDB MySQL 데이터베이스를 선택하고 대화 상자의 오른쪽 아래에 있는 다음 화살표를 클릭합니다.
    Clear D B My S Q L Database 광고온을 표시하는 이미지
  4. 기본 무료 계획을 유지하고 이름을IdentityMySQLDatabase로 변경합니다. 가장 가까운 지역을 선택한 다음, 다음 화살표를 클릭합니다.
    선택한 무료 플랜의 이미지 및 이름
  5. 확인 표시를 클릭하여 데이터베이스 만들기를 완료합니다.
    검토 구매 및 데이터베이스 만들기 이미지
  6. 데이터베이스가 만들어진 후 관리 포털의 ADD-ONS 탭에서 관리할 수 있습니다.
    추가 기능 탭 이미지
  7. 페이지 아래쪽에서 연결 정보를 클릭하여 데이터베이스 연결 정보를 가져올 수 있습니다.
    연결 정보 위치를 보여 주는 이미지
  8. 복사 단추를 클릭하여 연결 문자열을 복사하고 나중에 MVC 애플리케이션에서 사용할 수 있도록 저장합니다.
    연결 문자열 및 U R L을 보여 주는 이미지

MySQL 데이터베이스에서 ASP.NET ID 테이블 만들기

MySQL Workbench 도구를 설치하여 MySQL 데이터베이스 연결 및 관리

  1. MySQL다운로드 페이지에서 MySQL Workbench 도구 설치
  2. 앱을 시작하고 MySQLConnections + 단추를 클릭하여 새 연결을 추가합니다. 이 자습서의 앞부분에서 만든 Azure MySQL 데이터베이스에서 복사한 연결 문자열 데이터를 사용합니다.
  3. 연결을 설정한 후 새 쿼리 탭을 엽니다. MySQLIdentity.sql 의 명령을 쿼리에 붙여넣고 데이터베이스 테이블을 만들기 위해 실행합니다.
  4. 이제 아래와 같이 Azure에서 호스트되는 MySQL 데이터베이스에 생성된 모든 ASP.NET ID 필요 테이블이 있습니다.
    ID 필요 테이블을 보여 주는 이미지

템플릿에서 MVC 애플리케이션 프로젝트를 만들고 MySQL 공급자를 사용하도록 구성합니다.

필요한 경우 웹용 Visual Studio Express 2013을 설치하거나 업데이트 2를 사용하여 Visual Studio 2013 설치합니다.

ASP.NET 다운로드합니다. GitHub의 Identity.MySQL 프로젝트

  1. AspNet.Identity.MySQL(GitHub)에서 리포지토리 URL로 이동합니다.
  2. 소스 코드를 다운로드합니다.
  3. .zip 파일을 로컬 폴더로 추출합니다.
  4. AspNet.Identity.MySQL 솔루션을 열고 빌드합니다.

템플릿에서 새 MVC 애플리케이션 프로젝트 만들기

  1. AspNet.Identity.MySQL 솔루션 및 추가, 새 프로젝트를 마우스 오른쪽 단추로 클릭합니다.

  2. 새 프로젝트 추가 대화 상자의 왼쪽에서 Visual C#을 선택한 다음, 웹을 선택한 다음, ASP.NET 웹 애플리케이션을 선택합니다. 프로젝트 이름을 IdentityMySQLDemo로 지정합니다. 확인을 클릭합니다.

    새 프로젝트 추가 대화 상자 창의 이미지

  3. 새 ASP.NET 프로젝트 대화 상자에서 기본 옵션(개별 사용자 계정을 인증 방법으로 포함)이 있는 MVC 템플릿을 선택하고 확인을 클릭합니다. 새 ASP dot N E T 프로젝트 대화 상자 창의 이미지

  4. 솔루션 탐색기 IdentityMySQLDemo 프로젝트를 마우스 오른쪽 단추로 클릭하고 NuGet 패키지 관리를 선택합니다. 검색 텍스트 상자 대화 상자에서 Identity.EntityFramework를 입력합니다. 결과 목록에서 이 패키지를 선택하고 제거를 클릭합니다. 종속성 패키지 EntityFramework를 제거하라는 메시지가 표시됩니다. 이 애플리케이션에서 더 이상 이 패키지가 없으므로 예를 클릭합니다.

  5. IdentityMySQLDemo 프로젝트를 마우스 오른쪽 단추로 클릭하고 추가, 참조, 솔루션, 프로젝트를 선택하고 AspNet.Identity.MySQL 프로젝트를 선택하고 확인을 클릭합니다.

  6. IdentityMySQLDemo 프로젝트에서 모든 참조를 로 바꿉니다.
    using Microsoft.AspNet.Identity.EntityFramework;
    다음과 같이 바꿉니다.
    using AspNet.Identity.MySQL;

  7. IdentityModels.cs에서 ApplicationDbContextMySqlDatabase 에서 파생되도록 설정하고 연결 이름을 가진 단일 매개 변수를 사용하는 생성자를 포함합니다.

    public class ApplicationDbContext : MySQLDatabase
    {
        public ApplicationDbContext(string connectionName)
            : base(connectionName)
        {
        }
    
        public static ApplicationDbContext Create()
        {
            return new ApplicationDbContext("DefaultConnection");
        }
    }
    
  8. IdentityConfig.cs 파일을 엽니다. ApplicationUserManager.Create 메서드에서 UserManager 인스턴스화를 다음 코드로 바꿉 있습니다.

    var manager = new ApplicationUserManager(
        new UserStore<ApplicationUser>(
        context.Get<ApplicationDbContext>() as MySQLDatabase));
    
  9. web.config 파일을 열고 DefaultConnection 문자열을 이 항목으로 바꾸고 강조 표시된 값을 이전 단계에서 만든 MySQL 데이터베이스의 연결 문자열로 바꿉니다.

    <add name="DefaultConnection" connectionString="Database=IdentityMySQLDatabase;
    Data Source=<DataSource>;User Id=<UserID>;Password=<Password>"
    providerName="MySql.Data.MySqlClient" />
    

앱을 실행하고 MySQL DB에 연결

  1. IdentityMySQLDemo 프로젝트를 마우스 오른쪽 단추로 클릭하고 시작 프로젝트로 설정을 선택합니다.

  2. Ctrl + F5를 눌러 앱을 빌드하고 실행합니다.

  3. 페이지 위쪽에서 등록 탭을 클릭합니다.

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

    새 사용자 이름 및 암호를 보여 주는 이미지

  5. 이제 새 사용자가 등록되고 로그인됩니다.

    새 사용자가 등록되고 로그인되었음을 보여 주는 일러스트레이션

  6. MySQL Workbench 도구로 돌아가기 IdentityMySQLDatabase 테이블의 내용을 검사합니다. 새 사용자를 등록할 때 항목에 대한 사용자 테이블을 검사합니다.

    내 S QL Workbench 검사 도구 이미지

다음 단계

이 앱에서 다른 인증 방법을 사용하도록 설정하는 방법에 대한 자세한 내용은 Facebook 및 Google OAuth2 및 OpenID 로그온을 사용하여 ASP.NET MVC 5 앱 만들기를 참조하세요.

DB를 OAuth와 통합하고 앱에 대한 사용자 액세스를 제한하는 역할을 설정하는 방법을 알아보려면 Membership, OAuth 및 SQL Database Azure에 보안 ASP.NET MVC 5 앱 배포를 참조하세요.