ASP.NET Identity에 대한 사용자 지정 스토리지 공급자 개요Overview of Custom Storage Providers for ASP.NET Identity

Tom FitzMackenby Tom FitzMacken

ASP.NET Identity는 사용자 고유의 저장소 공급자를 만들고 응용 프로그램을 다시 작동 시 키 지 않고도 응용 프로그램에 연결할 수 있도록 하는 확장 가능한 시스템입니다.ASP.NET Identity is an extensible system which enables you to create your own storage provider and plug it into your application without re-working the application. 이 항목에서는 ASP.NET Identity에 대 한 사용자 지정 저장소 공급자를 만드는 방법에 대해 설명 합니다.This topic describes how to create a customized storage provider for ASP.NET Identity. 사용자 고유의 저장소 공급자를 만드는 데 중요 한 개념을 다루지만 사용자 지정 저장소 공급자를 구현 하는 단계별 연습은 제공 하지 않습니다.It covers the important concepts for creating your own storage provider, but it is not step-by-step walkthrough of implementing a custom storage provider.

사용자 지정 저장소 공급자를 구현 하는 예제는 사용자 지정 MySQL ASP.NET Identity 저장소 공급자 구현을 참조 하세요.For an example of implementing a custom storage provider, see Implementing a Custom MySQL ASP.NET Identity Storage Provider.

이 항목은 ASP.NET Identity 2.0에 대해 업데이트 되었습니다.This topic was updated for ASP.NET Identity 2.0.

자습서에서 사용 되는 소프트웨어 버전Software versions used in the tutorial

  • Visual Studio 2013 업데이트 2Visual Studio 2013 with Update 2
  • ASP.NET Identity 2ASP.NET Identity 2

소개Introduction

기본적으로 ASP.NET Identity 시스템은 SQL Server 데이터베이스에 사용자 정보를 저장 하 고 Entity Framework Code First를 사용 하 여 데이터베이스를 만듭니다.By default, the ASP.NET Identity system stores user information in a SQL Server database, and uses Entity Framework Code First to create the database. 많은 응용 프로그램에서이 접근 방식은 잘 작동 합니다.For many applications, this approach works well. 그러나 Azure Table Storage와 같은 다른 형식의 지 속성 메커니즘을 사용 하거나, 기본 구현과 매우 다른 데이터베이스 테이블이 이미 있을 수 있습니다.However, you may prefer to use a different type of persistence mechanism, such as Azure Table Storage, or you may already have database tables with a very different structure than the default implementation. 두 경우 모두 저장소 메커니즘에 맞게 사용자 지정 된 공급자를 작성 하 고 해당 공급자를 응용 프로그램에 연결할 수 있습니다.In either case, you can write a customized provider for your storage mechanism and plug that provider into your application.

ASP.NET Identity는 대부분의 Visual Studio 2013 템플릿에 기본적으로 포함 되어 있습니다.ASP.NET Identity is included by default in many of the Visual Studio 2013 templates. Microsoft AspNet Identity EntityFramework NuGet 패키지를 통해 ASP.NET Identity에 대 한 업데이트를 가져올 수 있습니다.You can get updates to ASP.NET Identity through Microsoft AspNet Identity EntityFramework NuGet package.

이 항목은 다음과 같은 섹션으로 구성됩니다.This topic includes the following sections:

아키텍처 이해Understand the architecture

ASP.NET Identity는 관리자 및 저장소 라는 클래스로 구성 됩니다.ASP.NET Identity consists of classes called managers and stores. 관리자는 응용 프로그램 개발자가 ASP.NET Identity 시스템에서 사용자 만들기와 같은 작업을 수행 하는 데 사용 하는 개략적인 클래스입니다.Managers are high-level classes which an application developer uses to perform operations, such as creating a user, in the ASP.NET Identity system. 저장소는 사용자 및 역할과 같은 엔터티를 유지 하는 방법을 지정 하는 하위 수준 클래스입니다.Stores are lower-level classes that specify how entities, such as users and roles, are persisted. 저장소는 지 속성 메커니즘과 긴밀 하 게 연관 되어 있지만 관리자가 저장소에서 분리 되어 있으므로 전체 응용 프로그램을 중단 하지 않고 지 속성 메커니즘을 대체할 수 있습니다.Stores are closely coupled with the persistence mechanism, but managers are decoupled from stores which means you can replace the persistence mechanism without disrupting the entire application.

다음 다이어그램에서는 웹 응용 프로그램이 관리자와 상호 작용 하는 방식과 데이터 액세스 계층과 상호 작용 하는 방법을 보여 줍니다.The following diagram shows how your web application interacts with the managers, and stores interact with the data access layer.

ASP.NET Identity에 대 한 사용자 지정 저장소 공급자를 만들려면 데이터 원본, 데이터 액세스 계층 및이 데이터 액세스 계층과 상호 작용 하는 저장소 클래스를 만들어야 합니다.To create a customized storage provider for ASP.NET Identity, you have to create the data source, the data access layer, and the store classes that interact with this data access layer. 동일한 관리자 Api를 계속 사용 하 여 사용자에 대 한 데이터 작업을 수행할 수 있지만 이제 데이터는 다른 저장소 시스템에 저장 됩니다.You can continue using the same manager APIs to perform data operations on the user but now that data is saved to a different storage system.

UserManager 또는 RoleManager의 새 인스턴스를 만들 때 사용자 클래스의 형식을 제공 하 고 저장소 클래스의 인스턴스를 인수로 전달 하므로 관리자 클래스를 사용자 지정할 필요가 없습니다.You do not need to customize the manager classes because when creating a new instance of UserManager or RoleManager you provide the type of the user class and pass an instance of the store class as an argument. 이 접근 방식을 사용 하면 사용자 지정 클래스를 기존 구조에 연결할 수 있습니다.This approach enables you to plug your customized classes into the existing structure. 새 저장소 공급자를 사용 하도록 응용 프로그램 다시 구성섹션에서 사용자 지정 저장소 클래스로 usermanager 및 RoleManager를 인스턴스화하는 방법을 확인할 수 있습니다.You will see how to instantiate UserManager and RoleManager with your customized store classes in the section Reconfigure application to use new storage provider.

저장 되는 데이터 이해Understand the data that is stored

사용자 지정 저장소 공급자를 구현 하려면 ASP.NET Identity에 사용 되는 데이터 형식을 이해 하 고 응용 프로그램과 관련 된 기능을 결정 해야 합니다.To implement a custom storage provider, you must understand the types of data used with ASP.NET Identity, and decide which features are relevant to your application.

데이터Data 설명Description
UsersUsers 웹 사이트의 등록 된 사용자입니다.Registered users of your web site. 사용자 Id와 사용자 이름을 포함 합니다.Includes the user Id and user name. 사용자가 Facebook 등의 외부 사이트에서 자격 증명을 사용 하는 대신 사이트와 관련 된 자격 증명을 사용 하 여 로그인 하 고 사용자 자격 증명에서 변경 내용이 있는지 여부를 나타내는 보안 스탬프를 사용 하 여 로그인 하는 경우 해시 된 암호를 포함할 수 있습니다.Might include a hashed password if users log in with credentials that are specific to your site (rather than using credentials from an external site like Facebook), and security stamp to indicate whether anything has changed in the user credentials. 전자 메일 주소, 전화 번호, 2 단계 인증을 사용 하는지 여부, 현재 실패 한 로그인 횟수 및 계정이 잠겨 있는지 여부를 포함할 수도 있습니다.Might also include email address, phone number, whether two factor authentication is enabled, the current number of failed logins, and whether an account has been locked.
사용자 클레임User Claims 사용자의 id를 나타내는 사용자에 대 한 문 (또는 클레임) 집합입니다.A set of statements (or claims) about the user that represent the user's identity. 에서는 역할을 통해 달성할 수 있는 것 보다 더 큰 사용자 id 식을 사용할 수 있습니다.Can enable greater expression of the user's identity than can be achieved through roles.
사용자 로그인User Logins 사용자에 게 로그인 할 때 사용할 외부 인증 공급자 (예: Facebook)에 대 한 정보입니다.Information about the external authentication provider (like Facebook) to use when logging in a user.
역할Roles 사이트에 대 한 권한 부여 그룹.Authorization groups for your site. 역할 Id와 역할 이름 (예: "Admin" 또는 "Employee")을 포함 합니다.Includes the role Id and role name (like "Admin" or "Employee").

데이터 액세스 계층 만들기Create the data access layer

이 항목에서는 사용자가 사용 하려는 지 속성 메커니즘 및 해당 메커니즘에 대 한 엔터티를 만드는 방법을 잘 알고 있다고 가정 합니다.This topic assumes you are familiar with the persistence mechanism that you are going to use and how to create entities for that mechanism. 이 항목에서는 리포지토리 또는 데이터 액세스 클래스를 만드는 방법에 대 한 자세한 정보는 제공 하지 않습니다. 대신 ASP.NET Identity 작업할 때 결정 해야 하는 디자인 결정에 대 한 몇 가지 제안을 제공 합니다.This topic does not provide details about how to create the repositories or data access classes; instead, it provides some suggestions about the design decisions you need to make when working with ASP.NET Identity.

사용자 지정 저장소 공급자에 대 한 리포지토리를 설계할 때 자유롭게 자유롭게 사용할 수 있습니다.You have a lot of freedom when designing the repositories for a customized store provider. 응용 프로그램에서 사용 하려는 기능에 대 한 리포지토리를 만들어야 합니다.You only need to create repositories for features that you intend to use in your application. 예를 들어 응용 프로그램에서 역할을 사용 하지 않는 경우 역할 또는 사용자 역할에 대 한 저장소를 만들 필요가 없습니다.For example, if you are not using roles in your application, you do not need to create storage for roles or user roles. 기술 및 기존 인프라에는 ASP.NET Identity의 기본 구현과 매우 다른 구조가 필요할 수 있습니다.Your technology and existing infrastructure may require a structure that is very different from the default implementation of ASP.NET Identity. 데이터 액세스 계층에서 리포지토리의 구조를 사용 하는 논리를 제공 합니다.In your data access layer, you provide the logic to work with the structure of your repositories.

ASP.NET Identity 2.0에 대 한 데이터 리포지토리의 MySQL 구현에 대해서는 MySQLIdentity을 참조 하세요.For a MySQL implementation of data repositories for ASP.NET Identity 2.0, see MySQLIdentity.sql.

데이터 액세스 계층에서 데이터 원본에 ASP.NET Identity 데이터를 저장 하는 논리를 제공 합니다.In the data access layer, you provide the logic to save the data from ASP.NET Identity to your data source. 사용자 지정 저장소 공급자에 대 한 데이터 액세스 계층에는 사용자 및 역할 정보를 저장 하는 다음과 같은 클래스가 포함 될 수 있습니다.The data access layer for your customized storage provider might include the following classes to store user and role information.

클래스Class 설명Description Example
컨텍스트Context 정보를 캡슐화 하 여 지 속성 메커니즘에 연결 하 고 쿼리를 실행 합니다.Encapsulates the information to connect to your persistence mechanism and execute queries. 이 클래스는 데이터 액세스 계층의 핵심입니다.This class is central to your data access layer. 다른 데이터 클래스에는이 클래스의 인스턴스가 있어야 작업을 수행할 수 있습니다.The other data classes will require an instance of this class to perform their operations. 또한이 클래스의 인스턴스를 사용 하 여 저장소 클래스를 초기화 합니다.You will also initialize your store classes with an instance of this class. MySQLDatabaseMySQLDatabase
사용자 저장소User Storage 사용자 정보 (예: 사용자 이름 및 암호 해시)를 저장 하 고 검색 합니다.Stores and retrieves user information (such as user name and password hash). UserTable (MySQL)UserTable (MySQL)
역할 저장소Role Storage 역할 이름 등의 역할 정보를 저장 하 고 검색 합니다.Stores and retrieves role information (such as the role name). RoleTable (MySQL)RoleTable (MySQL)
UserClaims 저장소UserClaims Storage 사용자 클레임 정보 (예: 클레임 유형 및 값)를 저장 하 고 검색 합니다.Stores and retrieves user claim information (such as the claim type and value). UserClaimsTable (MySQL)UserClaimsTable (MySQL)
UserLogins 저장소UserLogins Storage 사용자 로그인 정보 (예: 외부 인증 공급자)를 저장 하 고 검색 합니다.Stores and retrieves user login information (such as an external authentication provider). UserLoginsTable (MySQL)UserLoginsTable (MySQL)
UserRole 저장소UserRole Storage 사용자가 할당 된 역할을 저장 하 고 검색 합니다.Stores and retrieves which roles a user is assigned to. UserRoleTable (MySQL)UserRoleTable (MySQL)

응용 프로그램에서 사용 하려는 클래스만 구현 하면 됩니다.Again, you only need to implement the classes that you intend to use in your application.

데이터 액세스 클래스에서 특정 지 속성 메커니즘에 대 한 데이터 작업을 수행 하는 코드를 제공 합니다.In the data access classes, you provide code to perform data operations for your particular persistence mechanism. 예를 들어 MySQL 구현 내에서 UserTable 클래스는 사용자 데이터베이스 테이블에 새 레코드를 삽입 하는 메서드를 포함 합니다.For example, within the MySQL implementation, the UserTable class contains a method to insert a new record into the Users database table. _database 라는 변수는 MySQLDatabase 클래스의 인스턴스입니다.The variable named _database is an instance of the MySQLDatabase class.

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);
}

데이터 액세스 클래스를 만든 후에는 데이터 액세스 계층의 특정 메서드를 호출 하는 저장소 클래스를 만들어야 합니다.After creating your data access classes, you must create store classes that call the specific methods in the data access layer.

사용자 클래스 사용자 지정Customize the user class

사용자 고유의 저장소 공급자를 구현 하는 경우 IdentityUser 프레임 워크 네임 스페이스의 클래스에 해당 하는 사용자 클래스를 만들어야 합니다.When implementing your own storage provider, you must create a user class which is equivalent to the IdentityUser class in the Microsoft.ASP.NET.Identity.EntityFramework namespace:

다음 다이어그램에서는 만들어야 하는 IdentityUser 클래스와이 클래스에서 구현할 인터페이스를 보여 줍니다.The following diagram shows the IdentityUser class that you must create and the interface to implement in this class.

IUser<TKey> 인터페이스는 요청 된 작업을 수행할 때 usermanager가 호출 하려고 하는 속성을 정의 합니다.The IUser<TKey> interface defines the properties that the UserManager attempts to call when performing requested operations. 인터페이스에는 Id 및 사용자 이름의 두 속성이 포함 되어 있습니다.The interface contains two properties - Id and UserName. IUser<TKey> 인터페이스를 사용 하 여 일반 TKey 매개 변수를 통해 사용자의 키 형식을 지정할 수 있습니다.The IUser<TKey> interface enables you to specify the type of the key for the user through the generic TKey parameter. Id 속성의 유형이 TKey 매개 변수의 값과 일치 합니다.The type of the Id property matches the value of the TKey parameter.

또한 Id 프레임 워크는 키에 문자열 값을 사용 하려는 경우 제네릭 매개 변수 없이 IUser 인터페이스를 제공 합니다.The Identity framework also provides the IUser interface (without the generic parameter) when you want to use a string value for the key.

IdentityUser 클래스는 IUser를 구현 하 고 웹 사이트의 사용자에 대 한 추가 속성 또는 생성자를 포함 합니다.The IdentityUser class implements IUser and contains any additional properties or constructors for users on your web site. 다음 예제에서는 키에 정수를 사용 하는 IdentityUser 클래스를 보여 줍니다.The following example shows an IdentityUser class that uses an integer for the key. Id 필드는 제네릭 매개 변수의 값과 일치 하도록 int 로 설정 됩니다.The Id field is set to int to match the value of the generic parameter.

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)를 참조 하세요.For a complete implementation, see IdentityUser (MySQL).

사용자 저장소 사용자 지정Customize the user store

또한 사용자에 대 한 모든 데이터 작업에 대해 메서드를 제공 하는 UserStore 클래스를 만듭니다.You also create a UserStore class that provides the methods for all data operations on the user. 이 클래스는 MICROSOFT .asp. id 네임 스페이스의 Userstore<tuser> 클래스와 동일 합니다.This class is equivalent to the UserStore<TUser> class in the Microsoft.ASP.NET.Identity.EntityFramework namespace. UserStore 클래스에서 iuserstore<TUser, TKey> 및 선택적 인터페이스를 구현 합니다.In your UserStore class, you implement the IUserStore<TUser, TKey> and any of the optional interfaces. 응용 프로그램에서 제공 하려는 기능을 기준으로 구현할 선택적 인터페이스를 선택 합니다.You select which optional interfaces to implement based on the functionality you wish to provide in your application.

다음 그림은 만들어야 하는 UserStore 클래스와 관련 인터페이스를 보여 줍니다.The following image shows the UserStore class you must create and the relevant interfaces.

Visual Studio의 기본 프로젝트 템플릿에는 많은 선택적 인터페이스가 사용자 저장소에 구현 된 것으로 가정 하는 코드가 포함 되어 있습니다.The default project template in Visual Studio contains code that assumes many of the optional interfaces have been implemented in the user store. 사용자 지정 된 사용자 저장소를 사용 하 여 기본 템플릿을 사용 하는 경우 사용자 저장소에 선택적 인터페이스를 구현 하거나 구현 하지 않은 인터페이스에서 더 이상 메서드를 호출 하지 않도록 템플릿 코드를 변경 해야 합니다.If you are using the default template with a customized user store, you must either implement optional interfaces in your user store or alter the template code to no longer call methods in the interfaces you have not implemented.

다음 예제에서는 간단한 사용자 저장소 클래스를 보여 줍니다.The following example shows a simple user store class. Tuser 제네릭 매개 변수는 사용자 클래스의 형식 (일반적으로 정의한 IdentityUser 클래스)을 사용 합니다.The TUser generic parameter takes the type of your user class which usually is the IdentityUser class you defined. TKey 제네릭 매개 변수는 사용자 키의 유형을 사용 합니다.The TKey generic parameter takes the type of your user key.

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 형식의 데이터베이스 라는 매개 변수를 사용 하는 생성자는 데이터 액세스 클래스를 전달 하는 방법을 보여 주는 것입니다.In this example, the constructor that takes a parameter named database of type ExampleDatabase is only an illustration of how to pass in your data access class. 예를 들어 MySQL 구현에서이 생성자는 MySQLDatabase 형식의 매개 변수를 사용 합니다.For example, in the MySQL implementation, this constructor takes a parameter of type MySQLDatabase.

UserStore 클래스 내에서 작업을 수행 하기 위해 만든 데이터 액세스 클래스를 사용 합니다.Within your UserStore class, you use the data access classes that you created to perform operations. 예를 들어 MySQL 구현에서 UserStore 클래스는 Userstore의 인스턴스를 사용 하 여 새 레코드를 삽입 하는 CreateAsync 메서드를 포함 합니다.For example, in the MySQL implementation, the UserStore class has the CreateAsync method which uses an instance of UserTable to insert a new record. Usertable 개체의 Insert 메서드는 이전 섹션에 표시 된 것과 동일한 메서드입니다.The Insert method on the userTable object is the same method that was shown in the previous section.

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

    userTable.Insert(user);

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

사용자 저장소를 사용자 지정할 때 구현할 인터페이스Interfaces to implement when customizing user store

다음 이미지는 각 인터페이스에 정의 된 기능에 대 한 자세한 정보를 보여 줍니다.The next image shows more details about the functionality defined in each interface. 모든 선택적 인터페이스는 IUserStore에서 상속 됩니다.All of the optional interfaces inherit from IUserStore.

  • IUserStoreIUserStore
    Iuserstore<TUser, TKey> 인터페이스만 사용자 저장소에서 구현 해야 하는 인터페이스입니다.The IUserStore<TUser, TKey> interface is the only interface you must implement in your user store. 사용자를 만들고, 업데이트 하 고, 삭제 하 고, 검색 하는 메서드를 정의 합니다.It defines methods for creating, updating, deleting, and retrieving users.

  • IUserClaimStoreIUserClaimStore
    Iuserclaimstore<TUser, TKey> 인터페이스는 사용자 클레임을 사용 하기 위해 사용자 저장소에 구현 해야 하는 메서드를 정의 합니다.The IUserClaimStore<TUser, TKey> interface defines the methods you must implement in your user store to enable user claims. 사용자 클레임을 추가, 제거 및 검색 하는 메서드를 포함 합니다.It contains methods or adding, removing and retrieving user claims.

  • IUserLoginStoreIUserLoginStore
    IUserLoginStore<TUser, TKey> 는 외부 인증 공급자를 사용 하기 위해 사용자 저장소에 구현 해야 하는 메서드를 정의 합니다.The IUserLoginStore<TUser, TKey> defines the methods you must implement in your user store to enable external authentication providers. 사용자 로그인을 추가, 제거 및 검색 하는 메서드와 로그인 정보를 기반으로 사용자를 검색 하는 방법이 포함 되어 있습니다.It contains methods for adding, removing and retrieving user logins, and a method for retrieving a user based on the login information.

  • IUserRoleStoreIUserRoleStore
    Iuserrolestore<TKey, TUser> 인터페이스는 사용자를 역할에 매핑하기 위해 사용자 저장소에 구현 해야 하는 메서드를 정의 합니다.The IUserRoleStore<TKey, TUser> interface defines the methods you must implement in your user store to map a user to a role. 사용자의 역할을 추가, 제거 및 검색 하는 메서드와 사용자가 역할에 할당 되었는지 여부를 확인 하는 메서드가 포함 되어 있습니다.It contains methods to add, remove, and retrieve a user's roles, and a method to check if a user is assigned to a role.

  • IUserPasswordStoreIUserPasswordStore
    Iuserpasswordstore<TUser, TKey> 인터페이스는 해시 된 암호를 유지 하기 위해 사용자 저장소에 구현 해야 하는 메서드를 정의 합니다.The IUserPasswordStore<TUser, TKey> interface defines the methods you must implement in your user store to persist hashed passwords. 해시 된 암호를 가져오고 설정 하는 메서드와 사용자가 암호를 설정 했는지 여부를 나타내는 메서드를 포함 합니다.It contains methods for getting and setting the hashed password, and a method that indicates whether the user has set a password.

  • IUserSecurityStampStoreIUserSecurityStampStore
    IUserSecurityStampStore<TUser, TKey> 인터페이스는 사용자 계정 정보가 변경 되었는지 여부를 나타내는 데 보안 스탬프를 사용 하기 위해 사용자 저장소에서 구현 해야 하는 메서드를 정의 합니다.The IUserSecurityStampStore<TUser, TKey> interface defines the methods you must implement in your user store to use a security stamp for indicating whether the user's account information has changed. 이 스탬프는 사용자가 암호를 변경 하거나 로그인을 추가 하거나 제거 하는 경우 업데이트 됩니다.This stamp is updated when a user changes the password, or adds or removes logins. 보안 스탬프를 가져오고 설정 하기 위한 메서드를 포함 합니다.It contains methods for getting and setting the security stamp.

  • IUserTwoFactorStoreIUserTwoFactorStore
    IUserTwoFactorStore<TUser, TKey> 인터페이스는 2 단계 인증을 구현 하기 위해 구현 해야 하는 메서드를 정의 합니다.The IUserTwoFactorStore<TUser, TKey> interface defines the methods you must implement to implement two factor authentication. 사용자에 대해 2 단계 인증을 사용할 수 있는지 여부를 가져오고 설정 하는 메서드를 포함 합니다.It contains methods for getting and setting whether two factor authentication is enabled for a user.

  • IUserPhoneNumberStoreIUserPhoneNumberStore
    IUserPhoneNumberStore<TUser, TKey> 인터페이스는 사용자 전화 번호를 저장 하기 위해 구현 해야 하는 메서드를 정의 합니다.The IUserPhoneNumberStore<TUser, TKey> interface defines the methods you must implement to store user phone numbers. 전화 번호를 가져오고 설정 하는 방법 및 전화 번호가 확인 되었는지 여부를 나타내는 메서드가 포함 되어 있습니다.It contains methods for getting and setting the phone number and whether the phone number is confirmed.

  • IUserEmailStoreIUserEmailStore
    Iuseremailstore<TUser, TKey> 인터페이스는 사용자 전자 메일 주소를 저장 하기 위해 구현 해야 하는 메서드를 정의 합니다.The IUserEmailStore<TUser, TKey> interface defines the methods you must implement to store user email addresses. 전자 메일 주소를 가져오고 설정 하는 방법과 전자 메일이 확인 되었는지 여부를 나타내는 메서드가 포함 되어 있습니다.It contains methods for getting and setting the email address and whether the email is confirmed.

  • IUserLockoutStoreIUserLockoutStore
    IUserLockoutStore<TUser, TKey> 인터페이스는 계정 잠금에 대 한 정보를 저장 하기 위해 구현 해야 하는 메서드를 정의 합니다.The IUserLockoutStore<TUser, TKey> interface defines the methods you must implement to store information about locking an account. 현재 실패 한 액세스 시도 횟수를 가져오고, 계정을 잠글 수 있는지 여부를 가져오거나 설정 하 고, 잠금 종료 날짜를 가져오고 설정 하 고, 실패 한 시도 횟수를 증가 시키고, 실패 한 시도 횟수를 다시 설정 하는 메서드를 포함 합니다.It contains methods for getting the current number of failed access attempts, getting and setting whether the account can be locked, getting and setting the lock out end date, incrementing the number of failed attempts, and resetting the number of failed attempts.

  • IQueryableUserStoreIQueryableUserStore
    Iqueryableuserstore<TUser, TKey> 인터페이스는 쿼리 가능한 사용자 저장소를 제공 하기 위해 구현 해야 하는 멤버를 정의 합니다.The IQueryableUserStore<TUser, TKey> interface defines the members you must implement to provide a queryable user store. 쿼리 가능한 사용자를 포함 하는 속성을 포함 합니다.It contains a property that holds the queryable users.

    응용 프로그램에 필요한 인터페이스를 구현 합니다. 예를 들어 다음과 같이 IUserClaimStore, IUserLoginStore, Iuserclaimstore, Iuserclaimstore, IUserSecurityStampStore 인터페이스 등이 있습니다.You implement the interfaces that are needed in your application; such as, the IUserClaimStore, IUserLoginStore, IUserRoleStore, IUserPasswordStore, and IUserSecurityStampStore interfaces as shown below.

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)를 참조 하세요.For a complete implementation (including all of interfaces), see UserStore (MySQL).

IdentityUserClaim, IdentityUserLogin 및 IdentityUserRoleIdentityUserClaim, IdentityUserLogin, and IdentityUserRole

IdentityUserClaim, IdentityUserLoginIdentityUserRole 클래스의 구현을 포함 하는 Microsoft.The Microsoft.AspNet.Identity.EntityFramework namespace contains implementations of the IdentityUserClaim, IdentityUserLogin, and IdentityUserRole classes. 이러한 기능을 사용 하는 경우 이러한 클래스의 고유한 버전을 만들고 응용 프로그램에 대 한 속성을 정의 하는 것이 좋습니다.If you are using these features, you may want to create your own versions of these classes and define the properties for your application. 그러나 기본 작업 (예: 사용자의 클레임 추가 또는 제거)을 수행할 때 이러한 엔터티를 메모리로 로드 하지 않는 것이 더 효율적일 수 있습니다.However, sometimes it is more efficient to not load these entities into memory when performing basic operations (such as adding or removing a user's claim). 대신 백엔드 저장소 클래스는 데이터 소스에서 이러한 작업을 직접 실행할 수 있습니다.Instead, the backend store classes can execute these operations directly on the data source. 예를 들어 Userstore () 메서드는 UserclaimFindByUserId (user)를 호출할 수 있습니다. Id) 메서드는 해당 테이블에 대 한 쿼리를 직접 실행 하 고 클레임 목록을 반환 합니다.For example, the UserStore.GetClaimsAsync() method can call the userClaimTable.FindByUserId(user.Id) method to execute a query on that table directly and return a list of claims.

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

Role 클래스 사용자 지정Customize the role class

사용자 고유의 저장소 공급자를 구현 하는 경우 IdentityRole 프레임 워크 네임 스페이스의 클래스에 해당 하는 역할 클래스를 만들어야 합니다.When implementing your own storage provider, you must create a role class which is equivalent to the IdentityRole class in the Microsoft.ASP.NET.Identity.EntityFramework namespace:

다음 다이어그램에서는 만들어야 하는 IdentityRole 클래스와이 클래스에서 구현할 인터페이스를 보여 줍니다.The following diagram shows the IdentityRole class that you must create and the interface to implement in this class.

Irole<TKey> 인터페이스는 요청 된 작업을 수행할 때 RoleManager에서 호출 하려고 하는 속성을 정의 합니다.The IRole<TKey> interface defines the properties that the RoleManager attempts to call when performing requested operations. 인터페이스에는 Id와 이름 이라는 두 가지 속성이 있습니다.The interface contains two properties - Id and Name. Irole<TKey> 인터페이스를 사용 하 여 일반 TKey 매개 변수를 통해 역할의 키 형식을 지정할 수 있습니다.The IRole<TKey> interface enables you to specify the type of the key for the role through the generic TKey parameter. Id 속성의 유형이 TKey 매개 변수의 값과 일치 합니다.The type of the Id property matches the value of the TKey parameter.

또한 Id 프레임 워크는 키에 문자열 값을 사용 하려는 경우 제네릭 매개 변수 없이 Irole 인터페이스를 제공 합니다.The Identity framework also provides the IRole interface (without the generic parameter) when you want to use a string value for the key.

다음 예제에서는 키에 정수를 사용 하는 IdentityRole 클래스를 보여 줍니다.The following example shows an IdentityRole class that uses an integer for the key. Id 필드는 제네릭 매개 변수의 값과 일치 하도록 int로 설정 됩니다.The Id field is set to int to match the value of the generic parameter.

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

완전 한 구현은 IdentityRole (MySQL)를 참조 하세요.For a complete implementation, see IdentityRole (MySQL).

역할 저장소 사용자 지정Customize the role store

또한 역할에 대 한 모든 데이터 작업에 대해 메서드를 제공 하는 RoleStore 클래스를 만듭니다.You also create a RoleStore class that provides the methods for all data operations on roles. 이 클래스는 Microsoft .ASP. Id 네임 스페이스의 Rolestore<TRole> 클래스와 동일 합니다.This class is equivalent to the RoleStore<TRole> class in the Microsoft.ASP.NET.Identity.EntityFramework namespace. RoleStore 클래스에서 Irolestore<TRole, tkey> 및 선택적으로 IQueryableRoleStore<trole, tkey> 인터페이스를 구현 합니다.In your RoleStore class, you implement the IRoleStore<TRole, TKey> and optionally the IQueryableRoleStore<TRole, TKey> interface.

다음 예제에서는 역할 저장소 클래스를 보여 줍니다.The following example shows a role store class. TRole 제네릭 매개 변수는 일반적으로 정의한 IdentityRole 클래스인 역할 클래스의 형식을 사용 합니다.The TRole generic parameter takes the type of your role class which usually is the IdentityRole class you defined. TKey 제네릭 매개 변수는 역할 키의 유형을 사용 합니다.The TKey generic parameter takes the type of your role key.

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<TRole>
    Irolestore 인터페이스는 역할 저장소 클래스에서 구현 하는 메서드를 정의 합니다.The IRoleStore interface defines the methods to implement in your role store class. 역할을 만들고, 업데이트 하 고, 삭제 하 고, 검색 하는 메서드가 포함 되어 있습니다.It contains methods for creating, updating, deleting and retrieving roles.

  • RoleStore<TRole>RoleStore<TRole>
    RoleStore를 사용자 지정 하려면 IRoleStore 인터페이스를 구현 하는 클래스를 만듭니다.To customize RoleStore, create a class that implements the IRoleStore interface. 시스템에서 역할을 사용 하려는 경우에만이 클래스를 구현 해야 합니다.You only have to implement this class if want to use roles on your system. ExampleDatabase 형식의 데이터베이스 라는 매개 변수를 사용 하는 생성자는 데이터 액세스 클래스를 전달 하는 방법을 보여 주는 것입니다.The constructor that takes a parameter named database of type ExampleDatabase is only an illustration of how to pass in your data access class. 예를 들어 MySQL 구현에서이 생성자는 MySQLDatabase 형식의 매개 변수를 사용 합니다.For example, in the MySQL implementation, this constructor takes a parameter of type MySQLDatabase.

    완전 한 구현은 Rolestore (MySQL) 를 참조 하세요.For a complete implementation, see RoleStore (MySQL) .

새 저장소 공급자를 사용 하도록 응용 프로그램 다시 구성Reconfigure application to use new storage provider

새 저장소 공급자를 구현 했습니다.You have implemented your new storage provider. 이제이 저장소 공급자를 사용 하도록 응용 프로그램을 구성 해야 합니다.Now, you must configure your application to use this storage provider. 기본 저장소 공급자가 프로젝트에 포함 된 경우 기본 공급자를 제거 하 고 공급자로 바꾸어야 합니다.If the default storage provider was included in your project, you must remove the default provider and replace it with your provider.

MVC 프로젝트에서 기본 저장소 공급자 바꾸기Replace default storage provider in MVC project

  1. NuGet 패키지 관리 창에서 Microsoft ASP.NET id entityframework 패키지를 제거 합니다.In the Manage NuGet Packages window, uninstall the Microsoft ASP.NET Identity EntityFramework package. Id. EntityFramework에 대해 설치 된 패키지를 검색 하 여이 패키지를 찾을 수 있습니다.You can find this package by searching in the Installed packages for Identity.EntityFramework.
    Entity Framework를 제거할지 묻는 메시지가 표시 됩니다. You will be asked if you also want to uninstall Entity Framework. 응용 프로그램의 다른 부분에 필요 하지 않은 경우 제거할 수 있습니다.If you do not need it in other parts of your application, you can uninstall it.

  2. 모델 폴더의 IdentityModels.cs 파일에서 ApplicationuserApplicationDbContext 클래스를 삭제 하거나 주석으로 처리 합니다.In the IdentityModels.cs file in the Models folder, delete or comment out the ApplicationUser and ApplicationDbContext classes. MVC 응용 프로그램에서 전체 IdentityModels.cs 파일을 삭제할 수 있습니다.In an MVC application, you can delete the entire IdentityModels.cs file. Web Forms 응용 프로그램에서 두 클래스를 삭제 하지만 IdentityModels.cs 파일에도 있는 도우미 클래스를 유지 해야 합니다.In a Web Forms application, delete the two classes but make sure you keep the helper class that is also located in the IdentityModels.cs file.

  3. 저장소 공급자가 별도의 프로젝트에 있는 경우 웹 응용 프로그램에 참조를 추가 합니다.If your storage provider resides in a separate project, add a reference to it in your web application.

  4. using Microsoft.AspNet.Identity.EntityFramework;에 대 한 모든 참조를 저장소 공급자의 네임 스페이스에 대 한 using 문으로 바꿉니다.Replace all references to using Microsoft.AspNet.Identity.EntityFramework; with a using statement for the namespace of your storage provider.

  5. Startup.Auth.cs 클래스에서 적절 한 컨텍스트의 단일 인스턴스를 사용 하도록 ConfigureAuth 메서드를 변경 합니다.In the Startup.Auth.cs class, change the ConfigureAuth method to use a single instance of the appropriate context.

    public void ConfigureAuth(IAppBuilder app)
    {
        app.CreatePerOwinContext(ExampleStorageContext.Create);
        app.CreatePerOwinContext(ApplicationUserManager.Create);
        ...
    
  6. 앱_시작 폴더에서 IdentityConfig.cs을 엽니다.In the App_Start folder, open IdentityConfig.cs. ApplicationUserManager 클래스에서 사용자 지정 된 사용자 저장소를 사용 하는 사용자 관리자를 반환 하도록 만들기 메서드를 변경 합니다.In the ApplicationUserManager class, change the Create method to return a user manager that uses your customized user store.

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

  8. 기본 프로젝트에는 IUser 인터페이스에서 정의 되지 않은 사용자 클래스의 일부 멤버가 포함 되어 있습니다. 전자 메일, PasswordHash, GenerateUserIdentityAsync 등이 있습니다.The default project includes some members in user class which are not defined in the IUser interface; such as Email, PasswordHash, and GenerateUserIdentityAsync. 사용자 클래스에 이러한 멤버가 없는 경우 해당 멤버를 구현 하거나 이러한 멤버를 사용 하는 코드를 변경 해야 합니다.If your user class does not have these members, you must either implement them or change the code that uses these members.

  9. RoleManager의 인스턴스를 만든 경우 새 RoleStore 클래스를 사용 하도록 해당 코드를 변경 합니다.If you have created any instances of RoleManager, change that code to use your new RoleStore class.

    var roleManager = new RoleManager<IdentityRole>(new RoleStore(context.Get<ExampleStorageContext>()));
    
  10. 기본 프로젝트는 키에 대 한 문자열 값을 포함 하는 사용자 클래스를 위해 설계 되었습니다.The default project is designed for a user class that has a string value for the key. 사용자 클래스의 형식 (예: 정수)이 다른 경우 해당 형식으로 작업 하려면 프로젝트를 변경 해야 합니다.If your user class has a different type for the key (such as an integer), you must change the project to work with your type. ASP.NET Identity에서 사용자의 기본 키 변경을 참조 하세요.See Change Primary Key for Users in ASP.NET Identity.

  11. 필요한 경우 Web.config 파일에 연결 문자열을 추가 합니다.If needed, add the connection string to the Web.config file.

기타 리소스Other resources