ASP.NET Core Identity 소개Introduction to Identity on ASP.NET Core

작성자:Pranav Rastogi, Rick Anderson, Tom Dykstra, Jon Galloway Erik Reitan, Steve SmithBy Pranav Rastogi, Rick Anderson, Tom Dykstra, Jon Galloway, Erik Reitan, and Steve Smith

ASP.NET Core Identity는 응용 프로그램에 로그인 기능을 추가할 수 있는 멤버십 시스템입니다.ASP.NET Core Identity is a membership system which allows you to add login functionality to your application. 사용자는 계정을 생성한 다음 사용자 이름과 비밀번호를 사용해서 로그인하거나 Facebook, Google, Microsoft Account, Twitter 같은 외부 로그인 공급자를 사용할 수 있습니다.Users can create an account and login with a user name and password or they can use an external login provider such as Facebook, Google, Microsoft Account, Twitter or others.

ASP.NET Core Identity는 SQL Server 데이터베이스에 사용자 이름, 비밀번호 및 프로필 정보를 저장하도록 구성할 수 있습니다.You can configure ASP.NET Core Identity to use a SQL Server database to store user names, passwords, and profile data. 또는 Azure 테이블 저장소 같은 사용자 고유의 영구 저장소를 사용할 수도 있습니다.Alternatively, you can use your own persistent store, for example, an Azure Table Storage. 이 문서는 Visual Studio 및 CLI를 사용하는 경우에 대한 지침을 모두 포함합니다.This document contains instructions for Visual Studio and for using the CLI.

예제 코드 살펴보기 및 다운로드View or download the sample code. (다운로드 방법)(How to download)

Identity 개요Overview of Identity

본문에서는 ASP.NET Core Identity를 이용해서 사용자를 등록하고, 로그인하고, 로그아웃하는 기능을 추가하는 방법을 살펴봅니다.In this topic, you'll learn how to use ASP.NET Core Identity to add functionality to register, log in, and log out a user. ASP.NET Core Identity를 이용해서 응용 프로그램을 생성하는 보다 상세한 지침은 본문의 마지막 섹션인 다음 단계 섹션을 참고하시기 바랍니다.For more detailed instructions about creating apps using ASP.NET Core Identity, see the Next Steps section at the end of this article.

  1. 개별 사용자 계정으로 새로운 ASP.NET Core 웹 응용 프로그램 생성하기.Create an ASP.NET Core Web Application project with Individual User Accounts.

    Visual Studio에서 파일 > 새로 만들기 > 프로젝트를 선택합니다.In Visual Studio, select File > New > Project. 그리고 ASP.NET Core 웹 응용 프로그램을 선택한 다음,확인을 클릭합니다.Select ASP.NET Core Web Application and click OK.

    새 프로젝트 대화 상자

    ASP.NET Core 2.x 용 ASP.NET Core**웹 응용 프로그램 (모델-뷰-컨트롤러)**을 선택한 다음 인증 변경을 선택합니다.Select an ASP.NET Core Web Application (Model-View-Controller) for ASP.NET Core 2.x, then select Change Authentication.

    새 프로젝트 대화 상자

    그러면 인증 방식을 선택할 수 있는 대화 상자가 나타납니다.A dialog appears offering authentication choices. 개별 사용자 계정을 선택하고 확인을 클릭해서 이전 대화 상자로 돌아갑니다.Select Individual User Accounts and click OK to return to the previous dialog.

    새 프로젝트 대화 상자

    이렇게 개별 사용자 계정을 선택하면 Visual Studio에게 프로젝트 템플릿의 일부로 인증에 필요한 모델, 뷰 모델, 뷰, 컨트롤러 및 기타 자산을 생성하도록 지시합니다.Selecting Individual User Accounts directs Visual Studio to create Models, ViewModels, Views, Controllers, and other assets required for authentication as part of the project template.


  1. Identity 서비스를 구성하고 Startup에서 미들웨어 추가하기.Configure Identity services and add middleware in Startup.

    Identity 서비스는 Startup 클래스의 ConfigureServices 메서드에서 응용 프로그램에 추가됩니다:The Identity services are added to the application in the ConfigureServices method in the Startup class:

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
    
        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();
    
        services.Configure<IdentityOptions>(options =>
        {
            // Password settings
            options.Password.RequireDigit = true;
            options.Password.RequiredLength = 8;
            options.Password.RequireNonAlphanumeric = false;
            options.Password.RequireUppercase = true;
            options.Password.RequireLowercase = false;
            options.Password.RequiredUniqueChars = 6;
    
            // Lockout settings
            options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30);
            options.Lockout.MaxFailedAccessAttempts = 10;
            options.Lockout.AllowedForNewUsers = true;
    
            // User settings
            options.User.RequireUniqueEmail = true;
        });
    
        services.ConfigureApplicationCookie(options =>
        {
            // Cookie settings
            options.Cookie.HttpOnly = true;
            options.ExpireTimeSpan = TimeSpan.FromMinutes(30);
            // If the LoginPath isn't set, ASP.NET Core defaults 
            // the path to /Account/Login.
            options.LoginPath = "/Account/Login";
            // If the AccessDeniedPath isn't set, ASP.NET Core defaults 
            // the path to /Account/AccessDenied.
            options.AccessDeniedPath = "/Account/AccessDenied";
            options.SlidingExpiration = true;
        });
    
        // Add application services.
        services.AddTransient<IEmailSender, EmailSender>();
    
        services.AddMvc();
    }
    

    이 서비스들은 응용 프로그램에서 종속성 주입을 통해서 사용할 수 있습니다.These services are made available to the application through dependency injection.

    Configure 메서드에서 UseAuthentication 메서드를 호출하면 응용 프로그램에서 Identity가 활성화됩니다.Identity is enabled for the application by calling UseAuthentication in the Configure method. UseAuthentication은 요청 파이프라인에 인증 미들웨어를 추가합니다.UseAuthentication adds authentication middleware to the request pipeline.

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseBrowserLink();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }
    
        app.UseStaticFiles();
    
        app.UseAuthentication();
    
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
    

응용 프로그램 시작 과정에 대한 더 자세한 내용은 응용 프로그램 시작을 참고하시기 바랍니다.For more information about the application start up process, see Application Startup.

  1. 사용자 생성.Create a user.

    응용 프로그램을 실행한 다음, Register 링크를 클릭합니다.Launch the application and then click on the Register link.

    이 작업을 처음 수행하는 경우, 마이그레이션을 실행해야 할 수도 있습니다.If this is the first time you're performing this action, you may be required to run migrations. 그럴 경우, 이그레이션을 수행 하라는 메시지가 응용 프로그램에 표시됩니다.The application prompts you to Apply Migrations. 필요한 경우 페이지를 새로 고침합니다.Refresh the page if needed.

    마이그레이션 웹 페이지를 적용합니다.

    또는 영구적인 데이터베이스 없이 메모리 내 데이터베이스를 이용해서 응용 프로그램과 ASP.NET Core Identity를 테스트할 수도 있습니다.Alternately, you can test using ASP.NET Core Identity with your app without a persistent database by using an in-memory database. 메모리 내 데이터베이스를 사용하려면 응용 프로그램에 Microsoft.EntityFrameworkCore.InMemory 패키지를 추가하고, 응용 프로그램이 ConfigureServices에서 AddDbContext를 호출하는 부분을 다음과 같이 수정합니다:To use an in-memory database, add the Microsoft.EntityFrameworkCore.InMemory package to your app and modify your app's call to AddDbContext in ConfigureServices as follows:

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseInMemoryDatabase(Guid.NewGuid().ToString()));
    

    사용자가 Register 링크를 클릭하면 AccountController 에서 Register 액션이 호출됩니다.When the user clicks the Register link, the Register action is invoked on AccountController. Register 액션은 _userManager 개체의 (종속성 주입으로 AccountController에 제공된) CreateAsync를 호출해서 사용자를 생성합니다:The Register action creates the user by calling CreateAsync on the _userManager object (provided to AccountController by dependency injection):

    //
    // POST: /Account/Register
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
            var result = await _userManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=532713
                // Send an email with this link
                //var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
                //var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: HttpContext.Request.Scheme);
                //await _emailSender.SendEmailAsync(model.Email, "Confirm your account",
                //    "Please confirm your account by clicking this link: <a href=\"" + callbackUrl + "\">link</a>");
                await _signInManager.SignInAsync(user, isPersistent: false);
                _logger.LogInformation(3, "User created a new account with password.");
                return RedirectToAction(nameof(HomeController.Index), "Home");
            }
            AddErrors(result);
        }
    
        // If we got this far, something failed, redisplay form
        return View(model);
    }
    

    사용자가 정상적으로 생성되면 _signInManager.SignInAsync 가 호출되어 사용자가 즉시 로그인됩니다.If the user was created successfully, the user is logged in by the call to _signInManager.SignInAsync.

    참고: 사용자 등록 즉시 로그인을 방지하는 방법은 계정 확인 을 참고하시기 바랍니다.Note: See account confirmation for steps to prevent immediate login at registration.

  2. 로그인Log in.

    사용자는 사이트 상단의 Log in 링크를 클릭해서 로그인할 수 있으며, 사이트에서 권한 부여가 필요한 페이지에 접근하려고 시도할 경우 Login 페이지로 이동하게 됩니다.Users can sign in by clicking the Log in link at the top of the site, or they may be navigated to the Login page if they attempt to access a part of the site that requires authorization. 사용자가 Login 페이지의 양식을 제출하면 AccountControllerLogin 액션이 호출됩니다.When the user submits the form on the Login page, the AccountController Login action is called.

    Login 액션은 _signInManager 개체의 (종속성 주입으로 AccountController 에 제공된) PasswordSignInAsync를 호출합니다. The Login action calls PasswordSignInAsync on the _signInManager object (provided to AccountController by dependency injection).

    //
    // POST: /Account/Login
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
    {
        ViewData["ReturnUrl"] = returnUrl;
        if (ModelState.IsValid)
        {
            // This doesn't count login failures towards account lockout
            // To enable password failures to trigger account lockout, set lockoutOnFailure: true
            var result = await _signInManager.PasswordSignInAsync(model.Email, 
                model.Password, model.RememberMe, lockoutOnFailure: false);
            if (result.Succeeded)
            {
                _logger.LogInformation(1, "User logged in.");
                return RedirectToLocal(returnUrl);
            }
            if (result.RequiresTwoFactor)
            {
                return RedirectToAction(nameof(SendCode), new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
            }
            if (result.IsLockedOut)
            {
                _logger.LogWarning(2, "User account locked out.");
                return View("Lockout");
            }
            else
            {
                ModelState.AddModelError(string.Empty, "Invalid login attempt.");
                return View(model);
            }
        }
    
        // If we got this far, something failed, redisplay form
        return View(model);
    }
    

    기본 Controller 클래스는 컨트롤러의 메서드에서 접근할 수 있는 User 속성을 제공합니다.The base Controller class exposes a User property that you can access from controller methods. 예를 들어, 열거할 수 있습니다 User.Claims 을 권한 부여 결정을 내립니다.For instance, you can enumerate User.Claims and make authorization decisions. 자세한 내용은 참조 권한 부여합니다.For more information, see Authorization.

  3. 로그아웃Log out.

    LogOut 링크를 클릭하면 LogOut 액션이 호출됩니다.Clicking the Log out link calls the LogOut action.

    //
    // POST: /Account/LogOut
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> LogOut()
    {
        await _signInManager.SignOutAsync();
        _logger.LogInformation(4, "User logged out.");
        return RedirectToAction(nameof(HomeController.Index), "Home");
    }
    

    위의 코드는 _signInManager.SignOutAsync 메서드를 호출합니다.The preceding code above calls the _signInManager.SignOutAsync method. SignOutAsync메서드는 쿠키에 저장된 사용자의 클레임을 삭제합니다.The SignOutAsync method clears the user's claims stored in a cookie.

6. 구성Configuration.

Identity는 응용 프로그램의 시작 클래스에서 재지정할 수 있는 몇 가지 기본적인 동작을 갖고 있습니다.Identity has some default behaviors that can be overridden in the app's startup class. 기본 동작을 사용하고자 하는 경우에는 IdentityOptions 를 구성할 필요가 없습니다.IdentityOptions don't need to be configured when using the default behaviors. 다음 코드는 여러 가지 암호 강도 옵션을 설정합니다.The following code sets several password strength options:

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.Configure<IdentityOptions>(options =>
    {
        // Password settings
        options.Password.RequireDigit = true;
        options.Password.RequiredLength = 8;
        options.Password.RequireNonAlphanumeric = false;
        options.Password.RequireUppercase = true;
        options.Password.RequireLowercase = false;
        options.Password.RequiredUniqueChars = 6;

        // Lockout settings
        options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30);
        options.Lockout.MaxFailedAccessAttempts = 10;
        options.Lockout.AllowedForNewUsers = true;

        // User settings
        options.User.RequireUniqueEmail = true;
    });

    services.ConfigureApplicationCookie(options =>
    {
        // Cookie settings
        options.Cookie.HttpOnly = true;
        options.ExpireTimeSpan = TimeSpan.FromMinutes(30);
        // If the LoginPath isn't set, ASP.NET Core defaults 
        // the path to /Account/Login.
        options.LoginPath = "/Account/Login";
        // If the AccessDeniedPath isn't set, ASP.NET Core defaults 
        // the path to /Account/AccessDenied.
        options.AccessDeniedPath = "/Account/AccessDenied";
        options.SlidingExpiration = true;
    });

    // Add application services.
    services.AddTransient<IEmailSender, EmailSender>();

    services.AddMvc();
}

Identity를 구성하는 보다 자세한 방법은 Identity 구성하기를 참고하시기 바랍니다.For more information about how to configure Identity, see Configure Identity.

기본 키의 데이터 형식도 구성 가능합니다. Identity 기본 키 데이터 형식 구성하기를 참고하시기 바랍니다. You also can configure the data type of the primary key, see Configure Identity primary keys data type.

  1. 데이터베이스 살펴보기View the database.

    응용 프로그램에서 SQL Server 데이터베이스를 사용할 경우 (Windows 및 Visual Studio 사용자에 대한 기본값), 응용 프로그램이 생성한 데이터베이스를 확인할 수 있습니다.If your app is using a SQL Server database (the default on Windows and for Visual Studio users), you can view the database the app created. 이때 SQL Server Management Studio 를 사용할 수 있습니다You can use SQL Server Management Studio. 또는 Visual Studio에서 보기 > SQL Server 개체 탐색기를 선택합니다.Alternatively, from Visual Studio, select View > SQL Server Object Explorer. 그리고 (localdb) \MSSQLLocalDB에 연결합니다.Connect to (localdb)\MSSQLLocalDB. 그러면 aspnet-<프로젝트명>-<날짜 문자열> 형태의 이름을 가진 데이터베이스가 표시됩니다.The database with a name matching aspnet-<name of your project>-<date string> is displayed.

    AspNetUsers 데이터베이스 테이블에 대한 컨텍스트 메뉴

    데이터베이스와 그 테이블 들을 확장하고, dbo.AspNetUsers 테이블을 마우스 오른쪽 버튼으로 클릭한 다음, 데이터 보기를 선택합니다.Expand the database and its Tables, then right-click the dbo.AspNetUsers table and select View Data.

  2. Identity 동작 확인하기Verify Identity works

    기본 ASP.NET Core 웹 응용 프로그램 프로젝트 템플릿은 사용자가 로그인하지 않더라도 응용 프로그램의 모든 액션에 접근할 수 있습니다.The default ASP.NET Core Web Application project template allows users to access any action in the application without having to login. 정상적으로 ASP.NET Identity가 동작하는지 확인해보려면 Home 컨트롤러의 About 액션에 [Authorize] 특성을 추가합니다.To verify that ASP.NET Identity works, add an[Authorize] attribute to the About action of the Home Controller.

    [Authorize]
    public IActionResult About()
    {
        ViewData["Message"] = "Your application description page.";
        return View();
    }
    

    Ctrl + F5 키를 눌러서 프로젝트를 실행하고 About 페이지로 이동합니다.Run the project using Ctrl + F5 and navigate to the About page. 이제 인증된 사용자만 About 페이지에 액세스할 수 있으므로 사용자가 로그인하거나 등록할 수 있도록 로그인 페이지로 리디렉션됩니다.Only authenticated users may access the About page now, so ASP.NET redirects you to the login page to login or register.

Identity 구성 요소Identity Components

Identity 시스템의 기본 참조 어셈블리는 Microsoft.AspNetCore.Identity 입니다.The primary reference assembly for the Identity system is Microsoft.AspNetCore.Identity. ASP.NET Core Identity에 대한 주요 인터페이스 모음을 포함하고 있는 이 패키지는 Microsoft.AspNetCore.Identity.EntityFrameworkCore에 포함되어 있습니다.This package contains the core set of interfaces for ASP.NET Core Identity, and is included by Microsoft.AspNetCore.Identity.EntityFrameworkCore.

ASP.NET Core 응용 프로그램에서 Identity 시스템을 사용하려면 다음과 같은 종속성들이 필요합니다:These dependencies are needed to use the Identity system in ASP.NET Core applications:

  • Microsoft.AspNetCore.Identity.EntityFrameworkCore -Entity Framework Core로 Identity를 사용하는데 필요한 형식들을 포함하고 있습니다.Microsoft.AspNetCore.Identity.EntityFrameworkCore - Contains the required types to use Identity with Entity Framework Core.

  • Microsoft.EntityFrameworkCore.SqlServer - Entity Framework Core는 SQL Server와 같은 관계형 데이터베이스에 대한 Microsoft의 권장 데이터 액세스 기술입니다.Microsoft.EntityFrameworkCore.SqlServer - Entity Framework Core is Microsoft's recommended data access technology for relational databases like SQL Server. 테스트 목적으로 대신 Microsoft.EntityFrameworkCore.InMemory 를 사용할 수도 있습니다.For testing, you can use Microsoft.EntityFrameworkCore.InMemory.

  • Microsoft.AspNetCore.Authentication.Cookies -응용 프로그램이 쿠키 기반의 인증을 사용할 수 있게 해주는 미들웨어입니다.Microsoft.AspNetCore.Authentication.Cookies - Middleware that enables an app to use cookie-based authentication.

ASP.NET Identity로 마이그레이션하기Migrating to ASP.NET Core Identity

추가 정보 및 기존 본인 마이그레이션하는 방법에 대 한 지침을 참조 저장 마이그레이션할 인증 및 Id합니다.For additional information and guidance on migrating your existing Identity store see Migrate Authentication and Identity.

암호 강도 설정합니다.Setting password strength

참조 구성 최소 암호 요구 사항을 설정 하는 샘플입니다.See Configuration for a sample that sets the minimum password requirements.

다음 단계Next Steps