다음을 통해 공유


ASP.NET Identity에 대한 사용자 지정 스토리지 공급자 개요

Tom FitzMacken

ASP.NET ID는 애플리케이션을 다시 작업하지 않고도 사용자 고유의 스토리지 공급자를 만들고 애플리케이션에 연결할 수 있는 확장 가능한 시스템입니다. 이 항목에서는 ASP.NET ID에 대한 사용자 지정된 스토리지 공급자를 만드는 방법에 대해 설명합니다. 사용자 고유의 스토리지 공급자를 만들기 위한 중요한 개념을 다루지만 사용자 지정 스토리지 공급자를 구현하는 단계별 연습은 아닙니다.

사용자 지정 스토리지 공급자를 구현하는 예제는 사용자 지정 MySQL ASP.NET Id 스토리지 공급자 구현을 참조하세요.

이 항목은 ASP.NET IDENTITY 2.0에 대해 업데이트되었습니다.

자습서에서 사용되는 소프트웨어 버전

  • 업데이트 2를 사용하여 Visual Studio 2013
  • ASP.NET ID 2

소개

기본적으로 ASP.NET ID 시스템은 SQL Server 데이터베이스에 사용자 정보를 저장하고 Entity Framework Code First를 사용하여 데이터베이스를 만듭니다. 많은 애플리케이션에서 이 방법은 잘 작동합니다. 그러나 Azure Table Storage와 같은 다른 유형의 지속성 메커니즘을 사용하거나 기본 구현과 구조가 매우 다른 데이터베이스 테이블이 이미 있을 수 있습니다. 두 경우 모두 스토리지 메커니즘에 대한 사용자 지정된 공급자를 작성하고 해당 공급자를 애플리케이션에 연결할 수 있습니다.

ASP.NET ID는 기본적으로 많은 Visual Studio 2013 템플릿에 포함됩니다. Microsoft AspNet Identity EntityFramework NuGet 패키지를 통해 ASP.NET ID에 대한 업데이트를 받을 수 있습니다.

이 항목에는 다음 섹션이 포함되어 있습니다.

아키텍처 이해

ASP.NET ID는 관리자 및 매장이라는 클래스로 구성됩니다. 관리자는 애플리케이션 개발자가 ASP.NET ID 시스템에서 사용자 만들기와 같은 작업을 수행하는 데 사용하는 상위 수준 클래스입니다. ‘저장소’는 사용자나 역할과 같은 엔터티가 저장되는 방식을 지정하는 하위 수준 클래스입니다. 매장은 지속성 메커니즘과 밀접하게 결합되어 있지만 관리자는 저장소에서 분리되므로 전체 애플리케이션을 중단하지 않고 지속성 메커니즘을 바꿀 수 있습니다.

다음 다이어그램에서는 웹 애플리케이션이 관리자와 상호 작용하고 저장소가 데이터 액세스 계층과 상호 작용하는 방법을 보여 줍니다.

웹 애플리케이션이 관리자와 상호 작용하는 방법을 보여 주는 다이어그램

ASP.NET ID에 대한 사용자 지정된 스토리지 공급자를 만들려면 데이터 원본, 데이터 액세스 계층 및 이 데이터 액세스 계층과 상호 작용하는 저장소 클래스를 만들어야 합니다. 동일한 관리자 API를 계속 사용하여 사용자에 대한 데이터 작업을 수행할 수 있지만 이제 데이터가 다른 스토리지 시스템에 저장됩니다.

UserManager 또는 RoleManager의 새 instance 만들 때 사용자 클래스의 형식을 제공하고 저장소 클래스의 instance 인수로 전달하므로 관리자 클래스를 사용자 지정할 필요가 없습니다. 이 방법을 사용하면 사용자 지정된 클래스를 기존 구조에 연결할 수 있습니다. 새 스토리지 공급자를 사용하도록 애플리케이션 다시 구성 섹션에서 사용자 지정된 저장소 클래스를 사용하여 UserManager 및 RoleManager를 인스턴스화하는 방법을 확인할 수 있습니다.

저장된 데이터 이해

사용자 지정 스토리지 공급자를 구현하려면 ASP.NET ID와 함께 사용되는 데이터 형식을 이해하고 애플리케이션과 관련된 기능을 결정해야 합니다.

데이터 Description
사용자 웹 사이트의 등록된 사용자입니다. 사용자 ID 및 사용자 이름을 포함합니다. 사용자가 Facebook과 같은 외부 사이트의 자격 증명을 사용하는 대신 사이트와 관련된 자격 증명으로 로그인하는 경우 해시된 암호와 사용자 자격 증명에서 변경된 내용이 있는지 여부를 나타내는 보안 스탬프가 포함될 수 있습니다. 이메일 주소, 전화 번호, 2단계 인증을 사용하도록 설정했는지 여부, 현재 실패한 로그인 수 및 계정이 잠겼는지 여부도 포함될 수 있습니다.
사용자 클레임 사용자의 ID를 나타내는 사용자에 대한 문(또는 클레임) 집합입니다. 역할을 통해 달성할 수 있는 것보다 더 많은 사용자 ID에 대한 표현을 지원할 수 있습니다.
사용자 로그인 사용자에 로그인할 때 사용할 외부 인증 공급자(예: Facebook)에 대한 정보입니다.
역할 사이트의 권한 부여 그룹입니다. 역할 ID와 역할 이름을 포함합니다(예: “관리자”, “직원”).

데이터 액세스 계층 만들기

이 토픽에서는 사용할 저장 메커니즘에 대해 잘 알고 있고 이 메커니즘에 맞게 엔터티를 사용하는 방법을 알고 있다고 가정합니다. 이 항목에서는 리포지토리 또는 데이터 액세스 클래스를 만드는 방법에 대한 세부 정보를 제공하지 않습니다. 대신 ASP.NET ID로 작업할 때 수행해야 하는 디자인 결정에 대한 몇 가지 제안을 제공합니다.

사용자 지정된 저장소 공급자에 대한 리포지토리를 디자인할 때 많은 자유가 있습니다. 애플리케이션에서 사용하려는 기능에 대한 리포지토리만 만들어야 합니다. 예를 들어 애플리케이션에서 역할을 사용하지 않는 경우 역할 또는 사용자 역할에 대한 스토리지를 만들 필요가 없습니다. 기술 및 기존 인프라에는 ASP.NET ID의 기본 구현과 매우 다른 구조가 필요할 수 있습니다. 데이터 액세스 계층에서 리포지토리의 구조를 사용하는 논리를 제공합니다.

ASP.NET Identity 2.0에 대한 데이터 리포지토리의 MySQL 구현은 MySQLIdentity.sql을 참조하세요.

데이터 액세스 계층에서 ASP.NET ID에서 데이터 원본으로 데이터를 저장하는 논리를 제공합니다. 사용자 지정 스토리지 공급자의 데이터 액세스 계층에 사용자 및 역할 정보를 저장하기 위한 다음과 같은 클래스가 포함되어 있을 수 있습니다.

클래스 Description 예제
Context 저장 메커니즘과 실행 쿼리를 연결할 정보를 캡슐화합니다. 이 클래스는 데이터 액세스 계층의 중심입니다. 다른 데이터 클래스는 작업을 수행하려면 이 클래스의 instance 필요합니다. 또한 이 클래스의 instance 사용하여 저장소 클래스를 초기화합니다. MySQLDatabase
User 스토리지 사용자 정보를 저장하고 가져옵니다(예: 사용자 이름, 암호 해시). UserTable(MySQL)
Role 스토리지 역할 정보를 저장하고 가져옵니다(예: 역할 이름). RoleTable(MySQL)
UserClaims 스토리지 사용자 클레임 정보를 저장하고 가져옵니다(예: 클레임 유형, 값). UserClaimsTable(MySQL)
UserLogins 스토리지 사용자 로그인 정보를 저장하고 가져옵니다(예: 외부 인증 공급자). UserLoginsTable(MySQL)
UserRole 스토리지 사용자가 할당된 역할을 저장하고 검색합니다. UserRoleTable(MySQL)

다시 말하지만, 애플리케이션에서 사용하려는 클래스만 구현하면 됩니다.

데이터 액세스 클래스에서 특정 지속성 메커니즘에 대한 데이터 작업을 수행하는 코드를 제공합니다. 예를 들어 MySQL 구현 내에서 UserTable 클래스에는 Users 데이터베이스 테이블에 새 레코드를 삽입하는 메서드가 포함되어 있습니다. 라는 _database 변수는 MySQLDatabase 클래스의 instance.

public int Insert(TUser user)
{
    string commandText = @"Insert into Users (UserName, Id, PasswordHash, SecurityStamp,Email,EmailConfirmed,PhoneNumber,PhoneNumberConfirmed, AccessFailedCount,LockoutEnabled,LockoutEndDateUtc,TwoFactorEnabled)
        values (@name, @id, @pwdHash, @SecStamp,@email,@emailconfirmed,@phonenumber,@phonenumberconfirmed,@accesscount,@lockoutenabled,@lockoutenddate,@twofactorenabled)";
    Dictionary<string, object> parameters = new Dictionary<string, object>();
    parameters.Add("@name", user.UserName);
    parameters.Add("@id", user.Id);
    parameters.Add("@pwdHash", user.PasswordHash);
    parameters.Add("@SecStamp", user.SecurityStamp);
    parameters.Add("@email", user.Email);
    parameters.Add("@emailconfirmed", user.EmailConfirmed);
    parameters.Add("@phonenumber", user.PhoneNumber);
    parameters.Add("@phonenumberconfirmed", user.PhoneNumberConfirmed);
    parameters.Add("@accesscount", user.AccessFailedCount);
    parameters.Add("@lockoutenabled", user.LockoutEnabled);
    parameters.Add("@lockoutenddate", user.LockoutEndDateUtc);
    parameters.Add("@twofactorenabled", user.TwoFactorEnabled);

    return _database.Execute(commandText, parameters);
}

데이터 액세스 클래스를 만든 후에는 데이터 액세스 계층에서 특정 메서드를 호출하는 저장소 클래스를 만들어야 합니다.

사용자 클래스 사용자 지정

고유한 스토리지 공급자를 구현할 때 Microsoft.ASP.NET.Identity.EntityFramework 네임스페이스의 IdentityUser 클래스와 동일한 사용자 클래스를 만들어야 합니다.

다음 다이어그램은 만들어야 하는 IdentityUser 클래스와 이 클래스에서 구현할 인터페이스를 보여줍니다.

ID 사용자 클래스의 이미지

IUser<TKey> 인터페이스는 요청된 작업을 수행할 때 UserManager가 호출하려고 하는 속성을 정의합니다. 인터페이스에는 ID와 UserName의 두 가지 속성이 포함되어 있습니다. IUser<TKey 인터페이스를 사용하면 제네릭 TKey> 매개 변수를 통해 사용자의 키 형식을 지정할 수 있습니다. Id 속성의 형식은 TKey 매개 변수의 값과 일치합니다.

또한 ID 프레임워크는 키에 문자열 값을 사용하려는 경우(제네릭 매개 변수 없이) IUser 인터페이스를 제공합니다.

IdentityUser 클래스는 IUser를 구현하고 웹 사이트의 사용자에 대한 추가 속성 또는 생성자를 포함합니다. 다음 예제에서는 키에 정수 를 사용하는 IdentityUser 클래스를 보여줍니다. ID 필드는 제네릭 매개 변수의 값과 일치하도록 int 로 설정됩니다.

public class IdentityUser : IUser<int>
{
    public IdentityUser() { ... }
    public IdentityUser(string userName) { ... }
    public int Id { get; set; }
    public string UserName { get; set; }
    // can also define optional properties such as:
    //    PasswordHash
    //    SecurityStamp
    //    Claims
    //    Logins
    //    Roles
}

전체 구현은 IdentityUser(MySQL)를 참조하세요.

사용자 저장소 사용자 지정

또한 사용자의 모든 데이터 작업에 대한 메서드를 제공하는 UserStore 클래스를 만듭니다. 이 클래스는 Microsoft.ASP.NET.Identity.EntityFramework 네임스페이스의 UserStore<TUser> 클래스와 동일합니다. UserStore 클래스에서 IUserStore<TUser, TKey> 및 선택적 인터페이스를 구현합니다. 애플리케이션에서 제공하려는 기능에 따라 구현할 선택적 인터페이스를 선택합니다.

다음 이미지는 만들어야 하는 UserStore 클래스와 관련 인터페이스를 보여 줍니다.

사용자 저장소 클래스의 이미지

Visual Studio의 기본 프로젝트 템플릿에는 많은 선택적 인터페이스가 사용자 저장소에서 구현되었다고 가정하는 코드가 포함되어 있습니다. 사용자 지정 사용자 저장소에서 기본 템플릿을 사용하는 경우 사용자 저장소에서 선택적 인터페이스를 구현하거나 구현하지 않은 인터페이스에서 메서드를 더 이상 호출하지 않도록 템플릿 코드를 변경해야 합니다.

다음 예제에서는 간단한 사용자 저장소 클래스를 보여줍니다. TUser 제네릭 매개 변수는 일반적으로 정의한 IdentityUser 클래스인 사용자 클래스의 형식을 사용합니다. TKey 제네릭 매개 변수는 사용자 키의 형식을 사용합니다.

public class UserStore : IUserStore<IdentityUser, int>
{
    public UserStore() { ... }
    public UserStore(ExampleStorage database) { ... }
    public Task CreateAsync(IdentityUser user) { ... }
    public Task DeleteAsync(IdentityUser user) { ... }
    public Task<IdentityUser> FindByIdAsync(int userId) { ... }
    public Task<IdentityUser> FindByNameAsync(string userName) { ... }
    public Task UpdateAsync(IdentityUser user) { ... }
    public void Dispose() { ... }
}

이 예제에서 ExampleDatabase 형식의 데이터베이스 라는 매개 변수를 사용하는 생성자는 데이터 액세스 클래스를 전달하는 방법을 보여주는 그림일 뿐입니다. 예를 들어 MySQL 구현에서 이 생성자는 MySQLDatabase 형식의 매개 변수를 사용합니다.

UserStore 클래스 내에서 만든 데이터 액세스 클래스를 사용하여 작업을 수행합니다. 예를 들어 MySQL 구현에서 UserStore 클래스에는 UserTable의 instance 사용하여 새 레코드를 삽입하는 CreateAsync 메서드가 있습니다. userTable 개체의 Insert 메서드는 이전 섹션에 표시된 것과 동일한 메서드입니다.

public Task CreateAsync(IdentityUser user)
{
    if (user == null) {
        throw new ArgumentNullException("user");
    }

    userTable.Insert(user);

    return Task.FromResult<object>(null);
}

사용자 저장소를 사용자 지정할 때 구현할 인터페이스

다음 이미지는 각 인터페이스에 정의된 기능에 대한 자세한 내용을 보여줍니다. 모든 선택적 인터페이스는 IUserStore에서 상속됩니다.

각 인터페이스에 정의된 기능에 대한 자세한 내용을 보여 주는 그림

  • IUserStore
    IUserStore<TUser, TKey> 인터페이스는 사용자 저장소에서 구현해야 하는 유일한 인터페이스입니다. 이 인터페이스는 사용자 만들기, 업데이트, 삭제 및 가져오기를 위한 메서드를 정의합니다.

  • IUserClaimStore
    IUserClaimStore<TUser, TKey> 인터페이스는 사용자 클레임을 사용하도록 설정하기 위해 사용자 저장소에서 구현해야 하는 메서드를 정의합니다. 여기에는 메서드 또는 사용자 클레임 추가, 제거 및 검색이 포함됩니다.

  • IUserLoginStore
    IUserLoginStore<TUser TKey>는 외부 인증 공급자를 사용하도록 설정하기 위해 사용자 저장소에서 구현해야 하는 메서드를 정의합니다. 이 인터페이스는 사용자 로그인의 추가, 제거, 가져오기를 위한 메서드와 로그인 정보에 따라 사용자를 가져오기 위한 메서드를 포함합니다.

  • IUserRoleStore
    IUserRoleStore<TKey, TUser> 인터페이스는 사용자를 역할에 매핑하기 위해 사용자 저장소에서 구현해야 하는 메서드를 정의합니다. 이 인터페이스는 사용자 역할을 추가, 제거, 가져오기 위한 메서드와 사용자가 역할에 할당되었는지 확인하기 위한 메서드를 포함합니다.

  • IUserPasswordStore
    IUserPasswordStore<TUser, TKey> 인터페이스는 해시된 암호를 유지하기 위해 사용자 저장소에서 구현해야 하는 메서드를 정의합니다. 이 인터페이스는 해시된 항모를 가져오고 설정하기 위한 메서드와 사용자가 암호를 설정했는지 여부를 나타내는 메서드를 포함합니다.

  • IUserSecurityStampStore
    IUserSecurityStampStore<TUser, TKey> 인터페이스는 사용자의 계정 정보가 변경되었는지 여부를 나타내는 보안 스탬프를 사용하기 위해 사용자 저장소에서 구현해야 하는 메서드를 정의합니다. 이 스탬프는 사용자가 암호를 변경하거나 로그인을 추가 또는 제거하는 경우 업데이트됩니다. 이 인터페이스는 보안 스탬프를 가져오고 설정하기 위한 메서드를 포함합니다.

  • IUserTwoFactorStore
    IUserTwoFactorStore<TUser TKey> 인터페이스는 2단계 인증을 구현하기 위해 구현해야 하는 메서드를 정의합니다. 이 인터페이스는 사용자에 대해 2단계 인증이 설정되었는지 여부를 가져오고 설정하기 위한 메서드를 포함합니다.

  • IUserPhoneNumberStore
    IUserPhoneNumberStore<TUser TKey> 인터페이스는 사용자 전화 번호를 저장하기 위해 구현해야 하는 메서드를 정의합니다. 이 인터페이스는 전화번호 및 전화번호 확인 여부를 가져오고 설정하기 위한 메서드를 포함합니다.

  • IUserEmailStore
    IUserEmailStore<TUser, TKey> 인터페이스는 사용자 전자 메일 주소를 저장하기 위해 구현해야 하는 메서드를 정의합니다. 이 인터페이스는 메일 주소 및 메일 주소 확인 여부를 가져오고 설정하기 위한 메서드를 포함합니다.

  • IUserLockoutStore
    IUserLockoutStore<TUser TKey> 인터페이스는 계정 잠금에 대한 정보를 저장하기 위해 구현해야 하는 메서드를 정의합니다. 여기에는 현재 실패한 액세스 시도 횟수를 가져오고, 계정을 잠글 수 있는지 여부를 가져오고 설정하고, 잠금 종료 날짜를 가져오고 설정하고, 실패한 시도 횟수를 증가시키고, 실패한 시도 횟수를 다시 설정하는 메서드가 포함되어 있습니다.

  • IQueryableUserStore
    IQueryableUserStore<TUser, TKey> 인터페이스는 쿼리 가능한 사용자 저장소를 제공하기 위해 구현해야 하는 멤버를 정의합니다. 쿼리 가능한 사용자를 보유하는 속성이 포함되어 있습니다.

    애플리케이션에 필요한 인터페이스를 구현합니다. 예: 아래와 같이 IUserClaimStore, IUserLoginStore, IUserRoleStore, IUserPasswordStore 및 IUserSecurityStampStore 인터페이스가 있습니다.

public class UserStore : IUserStore<IdentityUser, int>,
                         IUserClaimStore<IdentityUser, int>,
                         IUserLoginStore<IdentityUser, int>,
                         IUserRoleStore<IdentityUser, int>,
                         IUserPasswordStore<IdentityUser, int>,
                         IUserSecurityStampStore<IdentityUser, int>
{
    // interface implementations not shown
}

전체 구현(모든 인터페이스 포함)은 UserStore(MySQL)를 참조하세요.

IdentityUserClaim, IdentityUserLogin 및 IdentityUserRole

Microsoft.AspNet.Identity.EntityFramework 네임스페이스에는 IdentityUserClaim, IdentityUserLogin 및 IdentityUserRole 클래스의 구현 포함되어 있습니다. 이러한 기능을 사용하는 경우 이러한 클래스의 고유한 버전을 만들고 애플리케이션에 대한 속성을 정의할 수 있습니다. 그러나 기본 작업(예: 사용자 클레임 추가 또는 제거)을 수행할 때 이러한 엔터티를 메모리에 로드하지 않는 것이 더 효율적인 경우도 있습니다. 그 대신 백엔드 저장소 클래스가 데이터 소스에서 직접 이러한 작업을 실행할 수 있습니다. 예를 들어 UserStore.GetClaimsAsync() 메서드는 userClaimTable.FindByUserId(user)를 호출할 수 있습니다. Id) 메서드는 해당 테이블에서 쿼리를 직접 실행하고 클레임 목록을 반환합니다.

public Task<IList<Claim>> GetClaimsAsync(IdentityUser user)
{
    ClaimsIdentity identity = userClaimsTable.FindByUserId(user.Id);
    return Task.FromResult<IList<Claim>>(identity.Claims.ToList());
}

역할 클래스 사용자 지정

고유한 스토리지 공급자를 구현할 때 Microsoft.ASP.NET.Identity.EntityFramework 네임스페이스의 IdentityRole 클래스와 동일한 역할 클래스를 만들어야 합니다.

다음 다이어그램은 만들어야 하는 IdentityRole 클래스와 이 클래스에서 구현할 인터페이스를 보여줍니다.

ID 역할 클래스의 이미지

IRole<TKey> 인터페이스는 요청된 작업을 수행할 때 RoleManager가 호출하려고 하는 속성을 정의합니다. 인터페이스에는 ID 및 이름이라는 두 가지 속성이 포함되어 있습니다. IRole<TKey 인터페이스를 사용하면 제네릭 TKey> 매개 변수를 통해 역할의 키 형식을 지정할 수 있습니다. Id 속성의 형식은 TKey 매개 변수의 값과 일치합니다.

또한 ID 프레임워크는 키에 문자열 값을 사용하려는 경우(제네릭 매개 변수 없이) IRole 인터페이스를 제공합니다.

다음 예제에서는 키에 정수 를 사용하는 IdentityRole 클래스를 보여줍니다. ID 필드는 제네릭 매개 변수의 값과 일치하도록 int로 설정됩니다.

public class IdentityRole : IRole<int>
{
    public IdentityRole() { ... }
    public IdentityRole(string roleName) { ... }
    public int Id { get; set; }
    public string Name { get; set; }
}

전체 구현은 IdentityRole(MySQL)을 참조하세요.

역할 저장소 사용자 지정

역할에 대한 모든 데이터 작업에 대한 메서드를 제공하는 RoleStore 클래스도 만듭니다. 이 클래스는 Microsoft.ASP.NET.Identity.EntityFramework 네임스페이스의 RoleStore<TRole> 클래스와 동일합니다. RoleStore 클래스에서 IRoleStore<TRole, TKey> 및 선택적으로 IQueryableRoleStore<TRole, TKey> 인터페이스를 구현합니다.

역할 저장소 클래스를 보여 주는 이미지

다음 예제에서는 역할 저장소 클래스를 보여줍니다. TRole 제네릭 매개 변수는 일반적으로 정의한 IdentityRole 클래스인 역할 클래스의 형식을 사용합니다. TKey 제네릭 매개 변수는 역할 키의 형식을 사용합니다.

public class RoleStore : IRoleStore<IdentityRole, int>
{
    public RoleStore() { ... }
    public RoleStore(ExampleStorage database) { ... }
    public Task CreateAsync(IdentityRole role) { ... }
    public Task DeleteAsync(IdentityRole role) { ... }
    public Task<IdentityRole> FindByIdAsync(int roleId) { ... }
    public Task<IdentityRole> FindByNameAsync(string roleName) { ... }
    public Task UpdateAsync(IdentityRole role) { ... }
    public void Dispose() { ... }
}
  • IRoleStore<TRole>
    IRoleStore 인터페이스는 역할 저장소 클래스에서 구현할 메서드를 정의합니다. 여기에는 역할을 만들고, 업데이트하고, 삭제하고, 검색하는 메서드가 포함되어 있습니다.

  • RoleStore<TRole>
    RoleStore를 사용자 지정하려면 IRoleStore 인터페이스를 구현하는 클래스를 만듭니다. 시스템에서 역할을 사용하려는 경우에만 이 클래스를 구현해야 합니다. ExampleDatabase 형식의 데이터베이스 라는 매개 변수를 사용하는 생성자는 데이터 액세스 클래스를 전달하는 방법을 보여주는 그림일 뿐입니다. 예를 들어 MySQL 구현에서 이 생성자는 MySQLDatabase 형식의 매개 변수를 사용합니다.

    전체 구현은 RoleStore(MySQL) 를 참조하세요.

새 스토리지 공급자를 사용하도록 애플리케이션 다시 구성

새 스토리지 공급자를 구현했습니다. 이제 이 스토리지 공급자를 사용하도록 애플리케이션을 구성해야 합니다. 기본 스토리지 공급자가 프로젝트에 포함된 경우 기본 공급자를 제거하고 공급자로 바꿔야 합니다.

MVC 프로젝트에서 기본 스토리지 공급자 바꾸기

  1. NuGet 패키지 관리 창에서 Microsoft ASP.NET Identity EntityFramework 패키지를 제거합니다. 설치된 패키지에서 Identity.EntityFramework를 검색하여 이 패키지를 찾을 수 있습니다.
    Nu 패키지 가져오기 창의 이미지 Entity Framework도 제거할 것인지 묻는 메시지가 표시됩니다. 애플리케이션의 다른 부분에서 필요하지 않은 경우 제거할 수 있습니다.

  2. Models 폴더의 IdentityModels.cs 파일에서 ApplicationUserApplicationDbContext 클래스를 삭제하거나 주석 처리합니다. MVC 애플리케이션에서 전체 IdentityModels.cs 파일을 삭제할 수 있습니다. Web Forms 애플리케이션에서 두 클래스를 삭제하지만 IdentityModels.cs 파일에도 있는 도우미 클래스를 유지해야 합니다.

  3. 스토리지 공급자가 별도의 프로젝트에 있는 경우 웹 애플리케이션에서 참조를 추가합니다.

  4. 스토리지 공급자의 네임스페이스에 대한 문을 사용하여 using Microsoft.AspNet.Identity.EntityFramework;에 대한 모든 참조를 대체합니다.

  5. Startup.Auth.cs 클래스에서 ConfigureAuth 메서드를 변경하여 적절한 컨텍스트의 단일 instance 사용합니다.

    public void ConfigureAuth(IAppBuilder app)
    {
        app.CreatePerOwinContext(ExampleStorageContext.Create);
        app.CreatePerOwinContext(ApplicationUserManager.Create);
        ...
    
  6. App_Start 폴더에서 IdentityConfig.cs를 엽니다. ApplicationUserManager 클래스에서 Create 메서드를 변경하여 사용자 지정된 사용자 저장소를 사용하는 사용자 관리자를 반환합니다.

    public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
    {
        var manager = new ApplicationUserManager(new UserStore(context.Get<ExampleStorageContext>()));
        ...
    }
    
  7. ApplicationUser에 대한 모든 참조를 IdentityUser로 바꿉니다.

  8. 기본 프로젝트에는 IUser 인터페이스에 정의되지 않은 사용자 클래스의 일부 멤버가 포함됩니다. 예: Email, PasswordHash 및 GenerateUserIdentityAsync. 사용자 클래스에 이러한 멤버가 없는 경우 이러한 멤버를 구현하거나 이러한 멤버를 사용하는 코드를 변경해야 합니다.

  9. RoleManager의 인스턴스를 만든 경우 새 RoleStore 클래스를 사용하도록 해당 코드를 변경합니다.

    var roleManager = new RoleManager<IdentityRole>(new RoleStore(context.Get<ExampleStorageContext>()));
    
  10. 기본 프로젝트는 키에 대한 문자열 값이 있는 사용자 클래스를 위해 설계되었습니다. 사용자 클래스의 키 형식이 다른 경우(예: 정수) 형식으로 작업하도록 프로젝트를 변경해야 합니다. ASP.NET ID의 사용자에 대한 기본 키 변경을 참조하세요.

  11. 필요한 경우 연결 문자열을 Web.config 파일에 추가합니다.

기타 리소스