ASP.NET Core Id 기본 키 데이터 형식 구성Configure the ASP.NET Core Identity primary key data type

ASP.NET Core Identity를 사용 하면 기본 키를 나타내는 데 사용 되는 데이터 형식을 구성할 수 있습니다.ASP.NET Core Identity allows you to configure the data type used to represent a primary key. 사용 하 여 identity는 string 기본적으로 데이터 형식입니다.Identity uses the string data type by default. 이 동작을 재정의할 수 있습니다.You can override this behavior.

기본 키 데이터 형식을 사용자 지정Customize the primary key data type

  1. 사용자 지정 구현을 만듭니다는 IdentityUser 클래스입니다.Create a custom implementation of the IdentityUser class. 사용자 개체를 만드는 데 사용할 유형을 나타냅니다.It represents the type to be used for creating user objects. 다음 예제에서는 기본 string 형식으로 대체 됩니다 Guid합니다.In the following example, the default string type is replaced with Guid.

    namespace webapptemplate.Models
    {
        // Add profile data for application users by adding properties to the ApplicationUser class
        public class ApplicationUser : IdentityUser<Guid>
        {
        }
    }
    
  2. 사용자 지정 구현을 만듭니다는 IdentityRole 클래스입니다.Create a custom implementation of the IdentityRole class. 역할 개체를 만드는 데 사용할 유형을 나타냅니다.It represents the type to be used for creating role objects. 다음 예제에서는 기본 string 형식으로 대체 됩니다 Guid합니다.In the following example, the default string type is replaced with Guid.

    namespace webapptemplate.Models
    {
        public class ApplicationRole : IdentityRole<Guid>
        {
        }
    }
    
  3. 사용자 지정 데이터베이스 컨텍스트 클래스를 만듭니다.Create a custom database context class. Id에 사용 되는 Entity Framework 데이터베이스 컨텍스트 클래스에서 상속 합니다.It inherits from the Entity Framework database context class used for Identity. TUserTRole 인수는 각각 이전 단계에서 만든 사용자 지정 사용자 및 역할의 클래스를 참조 합니다.The TUser and TRole arguments reference the custom user and role classes created in the previous step, respectively. Guid 기본 키에 대 한 데이터 형식을 정의 합니다.The Guid data type is defined for the primary key.

    namespace webapptemplate.Data
    {
        public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, Guid>
        {
            public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
                : base(options)
            {
            }
    
            protected override void OnModelCreating(ModelBuilder builder)
            {
                base.OnModelCreating(builder);
                // Customize the ASP.NET Identity model and override the defaults if needed.
                // For example, you can rename the ASP.NET Identity table names and more.
                // Add your customizations after calling base.OnModelCreating(builder);
            }
        }
    }
    
  4. 응용 프로그램의 시작 클래스에서 Id 서비스를 추가할 때 사용자 지정 데이터베이스 컨텍스트 클래스를 등록 합니다.Register the custom database context class when adding the Identity service in the app's startup class.

    AddEntityFrameworkStores 이 메서드를 사용 하지 않는 한 TKey ASP.NET Core에서 수행한 것으로 인수 1.x 합니다.The AddEntityFrameworkStores method doesn't accept a TKey argument as it did in ASP.NET Core 1.x. 분석 하 여 기본 키의 데이터 형식을 유추할는 DbContext 개체입니다.The primary key's data type is inferred by analyzing the DbContext object.

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
    
        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();
    
        // Add application services.
        services.AddTransient<IEmailSender, EmailSender>();
    
        services.AddMvc();
    

변경 내용을 테스트합니다Test the changes

구성 변경으로 완료 되 면 기본 키를 나타내는 속성에는 새 데이터 형식을 반영 합니다.Upon completion of the configuration changes, the property representing the primary key reflects the new data type. 다음 예제에서는 MVC 컨트롤러의 속성에 액세스 하는 방법을 보여 줍니다.The following example demonstrates accessing the property in an MVC controller.

[HttpGet]
[AllowAnonymous]
public async Task<Guid> GetCurrentUserId()
{
    ApplicationUser user = await _userManager.GetUserAsync(HttpContext.User);
    return user.Id; // No need to cast here because user.Id is already a Guid, and not a string
}