ASP.NET Core에 Id 소개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 Id는 응용 프로그램에 로그인 기능을 추가할 수 있는 멤버 자격 시스템입니다.ASP.NET Core Identity is a membership system which allows you to add login functionality to your application. 사용자 계정 및 로그인 사용자 이름으로 만들 수 있습니다 및 암호 또는 Facebook, Google, Microsoft 계정, 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 Id 사용자 이름, 암호 및 프로필 데이터를 저장 하는 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 Azure Table Storage. 이 문서에는 Visual Studio는 CLI를 사용 하 여 위한 지침이 포함 되어 있습니다.This document contains instructions for Visual Studio and for using the CLI.

Id의 개요Overview of Identity

이 항목에서는 등록, 로그인 하는 기능을 추가 하려면 ASP.NET Core Id를 사용 하 고 로그 아웃 한 사용자 합니다.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 Id를 사용 하 여 앱을 만드는 방법에 대해 더 자세한 내용은이 문서의 끝에 다음 단계 섹션을 참조 하십시오.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 웹 응용 프로그램 에서 새 프로젝트 대화 상자.Select the ASP.NET Web Application from the New Project dialog box. ASP.NET Core를 선택 하면 웹 응용 프로그램개별 사용자 계정 인증 방법으로 합니다.Selecting an ASP.NET Core Web Application with Individual User Accounts as the authentication method.

    참고: 선택 해야 개별 사용자 계정합니다.Note: You must select Individual User Accounts.

    새 프로젝트 대화 상자

  2. Id 서비스를 구성 하 고 미들웨어에서 추가 Startup합니다.Configure Identity services and add middleware in Startup.

    Id 서비스에서 응용 프로그램에 추가 되는 ConfigureServices 에서 메서드는 Startup 클래스: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.Cookie.Expiration = TimeSpan.FromDays(150);
            options.LoginPath = "/Account/Login"; // If the LoginPath is not set here, ASP.NET Core will default to /Account/Login
            options.LogoutPath = "/Account/Logout"; // If the LogoutPath is not set here, ASP.NET Core will default to /Account/Logout
            options.AccessDeniedPath = "/Account/AccessDenied"; // If the AccessDeniedPath is not set here, ASP.NET Core will default to /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.

    Identity를 호출 하 여 응용 프로그램에 대해 사용할 UseAuthenticationConfigure 메서드.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.

  3. 사용자를 만듭니다.Create a user.

    응용 프로그램을 시작 하 고을 클릭는 등록 링크 합니다.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:

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

    또는 영구 데이터베이스 없이 응용 프로그램과 함께 ASP.NET Core Id를 사용 하 여 메모리 내 데이터베이스를 사용 하 여 테스트할 수 있습니다.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 앱 패키지 및 응용 프로그램의 호출을 수정 AddDbContextConfigureServices 다음과 같습니다.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합니다.When the user clicks the Register link, the Register action is invoked on AccountController. Register 동작 호출 하 여 사용자를 만듭니다 CreateAsync_userManager 개체 (제공 된 AccountController 종속성 주입 하 여):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.

  4. 로그인.Log in.

    사용자가 클릭 하 여 로그인 할 수는 로그인 사이트의 맨 위에 링크 될 수 있습니다 이동 하 게 될 로그인 페이지에 권한 부여를 요구 하는 사이트의 일부에 액세스 하려는 경우 또는 합니다.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. 사용자가 로그인 페이지에 폼을 제출는 AccountController Login 작업을 호출 합니다.When the user submits the form on the Login page, the AccountController Login action is called.

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

    Login 동작 호출 PasswordSignInAsync_signInManager 개체 (제공 된 AccountController 종속성 주입 하 여).The Login action calls PasswordSignInAsync on the _signInManager object (provided to AccountController by dependency injection).

    기본 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.

  5. 로그 아웃 합니다.Log out.

    클릭 하 고 로그 아웃 호출 연결는 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.

    Id는 응용 프로그램의 시작 클래스에서 재정의할 수 있는 몇 가지 기본 동작에 있습니다.Identity has some default behaviors that you can override in your application's startup class. 구성 하지 않아도 IdentityOptions 기본 동작을 사용 하는 경우.You do not need to configure IdentityOptions if you are using the default behaviors.

    // 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.Cookie.Expiration = TimeSpan.FromDays(150);
            options.LoginPath = "/Account/Login"; // If the LoginPath is not set here, ASP.NET Core will default to /Account/Login
            options.LogoutPath = "/Account/Logout"; // If the LogoutPath is not set here, ASP.NET Core will default to /Account/Logout
            options.AccessDeniedPath = "/Account/AccessDenied"; // If the AccessDeniedPath is not set here, ASP.NET Core will default to /Account/AccessDenied
            options.SlidingExpiration = true;
        });
    
        // Add application services.
        services.AddTransient<IEmailSender, EmailSender>();
    
        services.AddMvc();
    }
    

    Id를 구성 하는 방법에 대 한 자세한 내용은 참조 구성 Identity합니다.For more information about how to configure Identity, see Configure Identity.

    기본 키의 데이터 형식을 구성할 수 참조 Id 구성 기본 키 데이터 형식이합니다.You also can configure the data type of the primary key, see Configure Identity primary keys data type.

  7. 데이터베이스를 봅니다.View the database.

    앱 (Windows와 Visual Studio 사용자에 대 한 기본값)는 SQL Server 데이터베이스를 사용 하는 경우에 만든 응용 프로그램 데이터베이스를 볼 수 있습니다.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.

Identity 구성 요소Identity Components

Id 시스템에 대 한 기본 참조 어셈블리는 Microsoft.AspNetCore.Identity합니다.The primary reference assembly for the Identity system is Microsoft.AspNetCore.Identity. 이 패키지 ASP.NET Core Id에 대 한 인터페이스의 핵심 집합으로 포함 되어 있으며 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 응용 프로그램의 Id 시스템을 사용 하려면 필요 합니다.These dependencies are needed to use the Identity system in ASP.NET Core applications:

  • Microsoft.AspNetCore.Identity.EntityFrameworkCore-Identity Entity Framework Core 사용 시 필요한 형식을 포함 합니다.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 Core Id로 마이그레이션Migrating to ASP.NET Core Identity

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

다음 단계Next Steps