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

작성자: Rick AndersonBy Rick Anderson

ASP.NET Core Id는 ASP.NET Core 앱에 로그인 기능을 추가 하는 멤버 자격 시스템입니다.ASP.NET Core Identity is a membership system that adds login functionality to ASP.NET Core apps. 사용자 Id에 저장 된 로그인 정보를 사용 하 여 계정을 만들 수 있습니다 하거나 외부 로그인 공급자를 사용할 수 있습니다.Users can create an account with the login information stored in Identity or they can use an external login provider. 지원 되는 외부 로그인 공급자를 포함 Facebook, Google, Microsoft 계정 및 Twitter합니다.Supported external login providers include Facebook, Google, Microsoft Account, and Twitter.

사용자 이름, 암호 및 프로필 데이터를 저장 하는 SQL Server 데이터베이스를 사용 하 여 id는 구성할 수 있습니다.Identity can be configured using a SQL Server database to store user names, passwords, and profile data. 또는 다른 영구 저장소 예를 들어, Azure Table Storage 사용할 수 있습니다.Alternatively, another persistent store can be used, for example, Azure Table Storage.

보기 또는 다운로드 샘플 코드 (다운로드 하는 방법)).View or download the sample code (how to download)).

이 항목의 Id를 사용 하 여 등록, 로그인 하는 방법을 알아보고는 사용자를 로그 아웃 합니다.In this topic, you learn how to use Identity to register, log in, and log out a user. Identity를 사용 하는 앱을 만드는 방법에 대 한 자세한 내용은이 문서의 끝에 있는 다음 단계 섹션을 참조 하세요.For more detailed instructions about creating apps that use Identity, see the Next Steps section at the end of this article.

AddDefaultIdentity 및 AddIdentityAddDefaultIdentity and AddIdentity

AddDefaultIdentity ASP.NET Core 2.1에서 도입 되었습니다.AddDefaultIdentity was introduced in ASP.NET Core 2.1. 호출 AddDefaultIdentity 다음 호출 하는 것과 비슷합니다.Calling AddDefaultIdentity is similar to calling the following:

참조 AddDefaultIdentity 원본 자세한 내용은 합니다.See AddDefaultIdentity source for more information.

인증을 사용 하 여 웹 앱 만들기Create a Web app with authentication

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

  • 파일 > 새로 만들기 > 프로젝트를 선택합니다.Select File > New > Project.
  • 새 ASP.NET Core 웹 응용 프로그램을 선택합니다.Select ASP.NET Core Web Application. 프로젝트 이름을 WebApp1 프로젝트 다운로드와 같은 네임 스페이스에 있어야 합니다.Name the project WebApp1 to have the same namespace as the project download. 확인을 클릭합니다.Click OK.
  • ASP.NET Core를 선택 웹 응용 프로그램을 선택한 후 인증 변경합니다.Select an ASP.NET Core Web Application, then select Change Authentication.
  • 선택 개별 사용자 계정 누릅니다 확인합니다.Select Individual User Accounts and click OK.

생성된 된 프로젝트를 제공 ASP.NET Core Id 으로 Razor 클래스 라이브러리합니다.The generated project provides ASP.NET Core Identity as a Razor Class Library. 사용 하 여 끝점을 노출 하는 Identity Razor 클래스 라이브러리는 Identity 영역입니다.The Identity Razor Class Library exposes endpoints with the Identity area. 예를 들어:For example:

  • /Identity/Account/Login/Identity/Account/Login
  • /Identity/Account/Logout/Identity/Account/Logout
  • /Identity/Account/Manage/Identity/Account/Manage

마이그레이션 적용Apply migrations

데이터베이스를 초기화 하 여 마이그레이션을 적용 합니다.Apply the migrations to initialise the database.

다음 명령은 패키지 관리자 콘솔 (PMC)에서 실행 합니다.Run the following command in the Package Manager Console (PMC):

PM> Update-Database

테스트 등록 및 로그인Test Register and Login

앱을 실행 하 고 사용자를 등록 합니다.Run the app and register a user. 화면 크기에 따라 탐색 설정/해제 단추를 선택 해야 합니다 등록 하 고 로그인 링크 합니다.Depending on your screen size, you might need to select the navigation toggle button to see the Register and Login links.

Id 데이터베이스 보기View the Identity database

  • 메뉴에서 SQL Server 개체 탐색기 (SSOX).From the View menu, select SQL Server Object Explorer (SSOX).
  • 이동할 (localdb) (SQL Server 13) MSSQLLocalDB합니다.Navigate to (localdb)MSSQLLocalDB(SQL Server 13). 마우스 오른쪽 단추로 클릭 dbo입니다. AspNetUsers > 데이터를 볼:Right-click on dbo.AspNetUsers > View Data:

SQL Server 개체 탐색기에서 AspNetUsers 테이블의 상황에 맞는 메뉴

Id 서비스를 구성 합니다.Configure Identity services

서비스에 추가 된 ConfigureServices합니다.Services are added in ConfigureServices. 일반적인 패턴은 모든 Add{Service} 메서드를 호출한 후 모든 services.Configure{Service} 메서드를 호출하는 것입니다.The typical pattern is to call all the Add{Service} methods, and then call all the services.Configure{Service} methods.

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>()
        .AddDefaultUI(UIFramework.Bootstrap4)
        .AddEntityFrameworkStores<ApplicationDbContext>();

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

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

        // User settings.
        options.User.AllowedUserNameCharacters =
        "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
        options.User.RequireUniqueEmail = false;
    });

    services.ConfigureApplicationCookie(options =>
    {
        // Cookie settings
        options.Cookie.HttpOnly = true;
        options.ExpireTimeSpan = TimeSpan.FromMinutes(5);

        options.LoginPath = "/Identity/Account/Login";
        options.AccessDeniedPath = "/Identity/Account/AccessDenied";
        options.SlidingExpiration = true;
    });

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

위의 코드는 기본 옵션 값을 사용 하 여 Identity를 구성합니다.The preceding code configures Identity with default option values. 서비스를 통해 앱에 제공 됩니다 종속성 주입합니다.Services are made available to the app through dependency injection.

호출 하 여 id를 활성화 UseAuthentication합니다.Identity is enabled by calling UseAuthentication. UseAuthentication은 요청 파이프라인에 인증 미들웨어를 추가합니다.UseAuthentication adds authentication middleware to the request pipeline.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();

    app.UseAuthentication();

    app.UseMvc();
}
// 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();
}

서비스를 통해 응용 프로그램에 제공 됩니다 종속성 주입합니다.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?}");
    });
}
public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

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

    services.AddMvc();

    // Configure Identity
    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;

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

        // Cookie settings
        options.Cookies.ApplicationCookie.ExpireTimeSpan = TimeSpan.FromDays(150);
        options.Cookies.ApplicationCookie.LoginPath = "/Account/Login";

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

    // Add application services.
    services.AddTransient<IEmailSender, AuthMessageSender>();
    services.AddTransient<ISmsSender, AuthMessageSender>();
}

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

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

public void Configure(IApplicationBuilder app,
    IHostingEnvironment env, 
    ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
        app.UseBrowserLink();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

    app.UseStaticFiles();

    app.UseIdentity();

    // Add external authentication middleware below. To configure them please see https://go.microsoft.com/fwlink/?LinkID=532715

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

자세한 내용은 참조는 IdentityOptions 클래스 하 고 응용 프로그램 시작.For more information, see the IdentityOptions Class and Application Startup.

스 캐 폴드 등록, 로그인 및 로그 아웃Scaffold Register, Login, and LogOut

수행 합니다 identity 권한 부여를 사용 하 여 Razor 프로젝트에 스 캐 폴드 이 섹션에 나와 있는 코드를 생성 하는 지침입니다.Follow the Scaffold identity into a Razor project with authorization instructions to generate the code shown in this section.

등록, 로그인 및 로그 아웃 파일을 추가 합니다.Add the Register, Login, and LogOut files.

등록 확인Examine Register

클릭할 때 합니다 등록 링크를 RegisterModel.OnPostAsync 동작이 호출 합니다.When a user clicks the Register link, the RegisterModel.OnPostAsync action is invoked. 사용자가 만든 CreateAsync_userManager 개체입니다.The user is created by CreateAsync on the _userManager object. _userManager 가 제공한 종속성 주입):_userManager is provided by dependency injection):

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl = returnUrl ?? Url.Content("~/");
    if (ModelState.IsValid)
    {
        var user = new IdentityUser { UserName = Input.Email, Email = Input.Email };
        var result = await _userManager.CreateAsync(user, Input.Password);
        if (result.Succeeded)
        {
            _logger.LogInformation("User created a new account with password.");

            var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
            var callbackUrl = Url.Page(
                "/Account/ConfirmEmail",
                pageHandler: null,
                values: new { userId = user.Id, code = code },
                protocol: Request.Scheme);

            await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
                $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");

            await _signInManager.SignInAsync(user, isPersistent: false);
            return LocalRedirect(returnUrl);
        }
        foreach (var error in result.Errors)
        {
            ModelState.AddModelError(string.Empty, error.Description);
        }
    }

    // If we got this far, something failed, redisplay form
    return Page();
}

클릭할 때 합니다 등록 링크를 Register 에서 동작이 호출 될 AccountController.When a 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.

로그인Log in

로그인 양식이 표시 되는 경우:The Login form is displayed when:

  • 합니다 로그인 링크를 선택 합니다.The Log in link is selected.
  • 사용자가 이러한 권한이 없는 제한 된 페이지에 액세스 하려고 액세스할 또는 시스템에 의해 인증 된 하지 않은 경우.A user attempts to access a restricted page that they aren't authorized to access or when they haven't been authenticated by the system.

로그인 페이지의 양식을 제출 되 면는 OnPostAsync 작업 이라고 합니다.When the form on the Login page is submitted, the OnPostAsync action is called. PasswordSignInAsync 라고 하는 _signInManager 개체 (종속성 주입으로 제공 됨).PasswordSignInAsync is called on the _signInManager object (provided by dependency injection).

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl = returnUrl ?? Url.Content("~/");

    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(Input.Email, 
            Input.Password, Input.RememberMe, lockoutOnFailure: true);
        if (result.Succeeded)
        {
            _logger.LogInformation("User logged in.");
            return LocalRedirect(returnUrl);
        }
        if (result.RequiresTwoFactor)
        {
            return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, RememberMe = Input.RememberMe });
        }
        if (result.IsLockedOut)
        {
            _logger.LogWarning("User account locked out.");
            return RedirectToPage("./Lockout");
        }
        else
        {
            ModelState.AddModelError(string.Empty, "Invalid login attempt.");
            return Page();
        }
    }

    // If we got this far, something failed, redisplay form
    return Page();
}

기본 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. 자세한 내용은 ASP.NET Core에서 권한 부여 소개을 참조하세요.For more information, see ASP.NET Core에서 권한 부여 소개.

사용자가 선택할 때 로그인 양식이 표시 되는 로그인 연결 또는 인증을 요구 하는 페이지에 액세스할 때 자동으로 리디렉션됩니다.The Login form is displayed when users select the Log in link or are redirected when accessing a page that requires authentication. 사용자가 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);
}

기본 (ControllerPageModel) 클래스는 User 속성입니다.The base (Controller or PageModel) class exposes a User property. 예를 들어 User.Claims 권한 부여 결정을 열거할 수 있습니다.For example, User.Claims can be enumerated to make authorization decisions.

로그 아웃Log out

합니다 로그 아웃 링크를 호출 하는 LogoutModel.OnPost 동작 합니다.The Log out link invokes the LogoutModel.OnPost action.

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;

namespace WebApp1.Areas.Identity.Pages.Account
{
    [AllowAnonymous]
    public class LogoutModel : PageModel
    {
        private readonly SignInManager<IdentityUser> _signInManager;
        private readonly ILogger<LogoutModel> _logger;

        public LogoutModel(SignInManager<IdentityUser> signInManager, ILogger<LogoutModel> logger)
        {
            _signInManager = signInManager;
            _logger = logger;
        }

        public void OnGet()
        {
        }

        public async Task<IActionResult> OnPost(string returnUrl = null)
        {
            await _signInManager.SignOutAsync();
            _logger.LogInformation("User logged out.");
            if (returnUrl != null)
            {
                return LocalRedirect(returnUrl);
            }
            else
            {
                return Page();
            }
        }
    }
}

SignOutAsync 쿠키에 저장 하는 사용자의 클레임을 지웁니다.SignOutAsync clears the user's claims stored in a cookie. 호출 후 리디렉션 하지 SignOutAsync 또는 사용자에 게 하지 로그 아웃 합니다.Don't redirect after calling SignOutAsync or the user will not be signed out.

게시물에 지정 된 Pages/Shared/_LoginPartial.cshtml:Post is specified in the Pages/Shared/_LoginPartial.cshtml:

@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager

<ul class="navbar-nav">
    @if (SignInManager.IsSignedIn(User))
    {
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="Identity"
               asp-page="/Account/Manage/Index"
               title="Manage">Hello@User.Identity.Name!</a>
        </li>
        <li class="nav-item">
            <form class="form-inline" asp-area="Identity" asp-page="/Account/Logout" 
                   asp-route-returnUrl="@Url.Page("/", new { area = "" })" 
                   method="post">
                <button type="submit" class="nav-link btn btn-link text-dark">Logout</button>
            </form>
        </li>
    }
    else
    {
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Register">Register</a>
        </li>
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
        </li>
    }
</ul>


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 calls the _signInManager.SignOutAsync method. SignOutAsync메서드는 쿠키에 저장된 사용자의 클레임을 삭제합니다.The SignOutAsync method clears the user's claims stored in a cookie.

테스트 IdTest Identity

기본 웹 프로젝트 템플릿 홈 페이지에 대 한 익명 액세스를 허용 합니다.The default web project templates allow anonymous access to the home pages. Id를 테스트 하려면 추가 [Authorize] 개인 정보 페이지에 있습니다.To test Identity, add [Authorize] to the Privacy page.

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace WebApp1.Pages
{
    [Authorize]
    public class PrivacyModel : PageModel
    {
        public void OnGet()
        {
        }
    }
}

에 로그인 하는 경우 로그 아웃 합니다. 앱을 실행 하 고 선택 합니다 개인 정보 보호 링크 합니다.If you are signed in, sign out. Run the app and select the Privacy link. 로그인 페이지로 리디렉션됩니다.You are redirected to the login page.

Identity를 탐색 합니다.Explore Identity

Identity를 자세히 탐색:To explore Identity in more detail:

Id 구성 요소Identity Components

에 포함 된 모든 Identity 종속 된 NuGet 패키지를 Microsoft.AspNetCore.App 메타 패키지합니다.All the Identity dependent NuGet packages are included in the Microsoft.AspNetCore.App metapackage.

Id에 대 한 기본 패키지가 Microsoft.AspNetCore.Identity합니다.The primary package for Identity 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 Identity로 마이그레이션하기Migrating to ASP.NET Core Identity

자세한 내용 및 기존 Id 저장소에 마이그레이션하는 방법에 대 한 지침을 참조 하세요 인증 및 Id 마이그레이션합니다.For more 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