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

작성자: Rick AndersonBy Rick Anderson

ASP.NET Core Identity:ASP.NET Core Identity:

  • 는 UI (사용자 인터페이스) 로그인 기능을 지 원하는 API입니다.Is an API that supports user interface (UI) login functionality.
  • 사용자, 암호, 프로필 데이터, 역할, 클레임, 토큰, 전자 메일 확인 등을 관리 합니다.Manages users, passwords, profile data, roles, claims, tokens, email confirmation, and more.

사용자는에 저장 된 로그인 정보를 사용 하 여 계정을 만들거나 Identity 외부 로그인 공급자를 사용할 수 있습니다.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.

모든 사용자를 전역적으로 인증 하도록 요구 하는 방법에 대 한 자세한 내용은 인증 된 사용자 요구를 참조 하세요.For information on how to globally require all users to be authenticated, see Require authenticated users.

Identity 소스 코드 는 GitHub에서 사용할 수 있습니다.The Identity source code is available on GitHub. 스 캐 폴드 Identity 및는 생성 된 파일을 확인 하 여와의 템플릿 상호 작용을 검토 Identity 합니다.Scaffold Identity and view the generated files to review the template interaction with Identity.

Identity 는 일반적으로 사용자 이름, 암호 및 프로필 데이터를 저장 하기 위해 SQL Server 데이터베이스를 사용 하 여 구성 됩니다.Identity is typically 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.

이 항목에서는를 사용 하 여 사용자를 Identity 등록 하 고 로그인 하 고 로그 아웃 하는 방법을 알아봅니다.In this topic, you learn how to use Identity to register, log in, and log out a user. 참고: 템플릿은 사용자에 대해 사용자 이름 및 전자 메일을 동일 하 게 처리 합니다.Note: the templates treat username and email as the same for users. 를 사용 하는 앱을 만드는 방법에 대 한 자세한 지침은 Identity 다음 단계를 참조 하세요.For more detailed instructions about creating apps that use Identity, see Next Steps.

Microsoft id 플랫폼 은 다음과 같습니다.Microsoft identity platform is:

  • Azure Active Directory (Azure AD) 개발자 플랫폼의 진화An evolution of the Azure Active Directory (Azure AD) developer platform.
  • 와 관련이 ASP.NET Core Identity 없습니다.Unrelated to ASP.NET Core Identity.

ASP.NET Core Identity는 ASP.NET Core 웹앱에 UI(사용자 인터페이스) 로그인 기능을 추가합니다.ASP.NET Core Identity adds user interface (UI) login functionality to ASP.NET Core web apps. 웹 API 및 SPA를 보호하려면 다음 중 하나를 사용합니다.To secure web APIs and SPAs, use one of the following:

IdentityServer4는 ASP.NET Core용 OpenID Connect 및 OAuth 2.0 프레임워크입니다.IdentityServer4 is an OpenID Connect and OAuth 2.0 framework for ASP.NET Core. IdentityServer4에서는 다음과 같은 보안 기능을 사용할 수 있습니다.IdentityServer4 enables the following security features:

  • AaaS(Authentication as a Service)Authentication as a Service (AaaS)
  • 여러 응용 프로그램 유형에 대한 SSO(Single Sign-On/Off)Single sign-on/off (SSO) over multiple application types
  • API에 대한 액세스 제어Access control for APIs
  • 페더레이션 게이트웨이Federation Gateway

자세한 내용은 IdentityServer4 시작을 참조하세요.For more information, see Welcome to IdentityServer4.

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

인증을 사용 하 여 웹 앱 만들기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 Identity 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/계정/로그 아웃/Identity/Account/Logout
  • /Identity/계정/관리/Identity/Account/Manage

마이그레이션 적용Apply migrations

마이그레이션을 적용 하 여 데이터베이스를 초기화 합니다.Apply the migrations to initialize 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.

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

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

SQL Server 개체 탐색기에서 AspNetUsers 테이블에 대한 컨텍스트 메뉴

Identity서비스 구성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.AddDbContext<ApplicationDbContext>(options =>
     // options.UseSqlite(
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddRazorPages();

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

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

Identity 는를 호출 하 여 사용할 수 UseAuthentication 있습니다.Identity is enabled by calling UseAuthentication. UseAuthentication 인증 미들웨어 를 요청 파이프라인에 추가 합니다.UseAuthentication adds authentication middleware to the request pipeline.

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

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

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}

템플릿에서 생성 된 앱은 권한 부여를 사용 하지 않습니다.The template-generated app doesn't use authorization. app.UseAuthorization 는 앱이 권한 부여를 추가 하는 올바른 순서로 추가 되었는지 확인 하기 위해 포함 됩니다.app.UseAuthorization is included to ensure it's added in the correct order should the app add authorization. UseRouting, UseAuthentication , UseAuthorizationUseEndpoints 는 앞의 코드에 표시 된 순서 대로 호출 해야 합니다.UseRouting, UseAuthentication, UseAuthorization, and UseEndpoints must be called in the order shown in the preceding code.

및에 대 한 자세한 내용은 IdentityOptions Startup IdentityOptions응용 프로그램 시작을 참조 하세요.For more information on IdentityOptions and Startup, see IdentityOptions and Application Startup.

스 캐 폴드 Register, Login, LogOut 및 RegisterConfirmationScaffold Register, Login, LogOut, and RegisterConfirmation

,, Register Login 및 파일을 추가 LogOut RegisterConfirmation 합니다.Add the Register, Login, LogOut, and RegisterConfirmation files. 이 섹션에 표시 된 코드를 생성 하려면 Razor 권한 부여 지침을 포함 하는 스 캐 폴드 id를 프로젝트에 추가 합니다.Follow the Scaffold identity into a Razor project with authorization instructions to generate the code shown in this section.

등록 검사Examine Register

사용자가 페이지에서 등록 단추를 클릭 하면 Register RegisterModel.OnPostAsync 동작이 호출 됩니다.When a user clicks the Register button on the Register page, the RegisterModel.OnPostAsync action is invoked. 사용자는 개체에 대해 Createasync 를 사용 하 여 만들어집니다 _userManager .The user is created by CreateAsync on the _userManager object:

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl = returnUrl ?? Url.Content("~/");
    ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync())
                                          .ToList();
    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);
            code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
            var callbackUrl = Url.Page(
                "/Account/ConfirmEmail",
                pageHandler: null,
                values: new { area = "Identity", 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>.");

            if (_userManager.Options.SignIn.RequireConfirmedAccount)
            {
                return RedirectToPage("RegisterConfirmation", 
                                      new { email = Input.Email });
            }
            else
            {
                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();
}

기본 계정 확인 사용 안 함Disable default account verification

기본 템플릿을 사용 하면 사용자가 Account.RegisterConfirmation 계정 확인을 위해 링크를 선택할 수 있는 위치로 리디렉션됩니다.With the default templates, the user is redirected to the Account.RegisterConfirmation where they can select a link to have the account confirmed. 기본값은 Account.RegisterConfirmation 테스트에 사용 되며 자동 계정 확인은 프로덕션 앱에서 사용 하지 않도록 설정 해야 합니다.The default Account.RegisterConfirmation is used only for testing, automatic account verification should be disabled in a production app.

확인 된 계정을 요구 하 고 등록 시 즉시 로그인을 방지 하려면 DisplayConfirmAccountLink = false /Areas/Identity/Pages/Account/RegisterConfirmation.cshtml.cs에서를 설정 합니다.To require a confirmed account and prevent immediate login at registration, set DisplayConfirmAccountLink = false in /Areas/Identity/Pages/Account/RegisterConfirmation.cshtml.cs:

[AllowAnonymous]
public class RegisterConfirmationModel : PageModel
{
    private readonly UserManager<IdentityUser> _userManager;
    private readonly IEmailSender _sender;

    public RegisterConfirmationModel(UserManager<IdentityUser> userManager, IEmailSender sender)
    {
        _userManager = userManager;
        _sender = sender;
    }

    public string Email { get; set; }

    public bool DisplayConfirmAccountLink { get; set; }

    public string EmailConfirmationUrl { get; set; }

    public async Task<IActionResult> OnGetAsync(string email, string returnUrl = null)
    {
        if (email == null)
        {
            return RedirectToPage("/Index");
        }

        var user = await _userManager.FindByEmailAsync(email);
        if (user == null)
        {
            return NotFound($"Unable to load user with email '{email}'.");
        }

        Email = email;
        // Once you add a real email sender, you should remove this code that lets you confirm the account
        DisplayConfirmAccountLink = false;
        if (DisplayConfirmAccountLink)
        {
            var userId = await _userManager.GetUserIdAsync(user);
            var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
            code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
            EmailConfirmationUrl = Url.Page(
                "/Account/ConfirmEmail",
                pageHandler: null,
                values: new { area = "Identity", userId = userId, code = code, returnUrl = returnUrl },
                protocol: Request.Scheme);
        }

        return Page();
    }
}

로그인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.

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

권한 부여 결정을 내리는 방법에 대 한 자세한 내용은을 참조 하십시오 ASP.NET Core 권한 부여 소개 .For information on how to make authorization decisions, see ASP.NET Core 권한 부여 소개.

로그아웃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 RedirectToPage();
            }
        }
    }
}

위의 코드에서는 return RedirectToPage(); 브라우저가 새 요청을 수행 하 고 사용자에 대 한 id가 업데이트 되도록 코드를 리디렉션 해야 합니다.In the preceding code, the code return RedirectToPage(); needs to be a redirect so that the browser performs a new request and the identity for the user gets updated.

SignOutAsync 에 저장 된 사용자의 클레임을 지웁니다 cookie .SignOutAsync clears the user's claims stored in a cookie.

Post는 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>

테스트할 IdentityTest Identity

기본 웹 프로젝트 템플릿을 사용 하면 홈 페이지에 익명으로 액세스할 수 있습니다.The default web project templates allow anonymous access to the home pages. 테스트 하려면 Identity 다음을 추가 합니다 [Authorize] .To test Identity, add [Authorize]:

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

namespace WebApp1.Pages
{
    [Authorize]
    public class PrivacyModel : PageModel
    {
        private readonly ILogger<PrivacyModel> _logger;

        public PrivacyModel(ILogger<PrivacyModel> logger)
        {
            _logger = logger;
        }

        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.

탐험 IdentityExplore Identity

자세히 살펴보기 Identity :To explore Identity in more detail:

Identity 요소도Identity Components

모든 Identity 종속 NuGet 패키지는 ASP.NET Core 공유 프레임 워크에 포함 되어 있습니다.All the Identity-dependent NuGet packages are included in the ASP.NET Core shared framework.

의 기본 패키지는 Identity 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 Core IdentityMigrating to ASP.NET Core Identity

기존 저장소 마이그레이션에 대 한 자세한 내용 및 지침은 Identity 인증 및 Identity 마이그레이션 을 참조 하세요.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.

AddDefault Identity 및 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:

자세한 내용은 Adddefault Identity source 를 참조 하세요.See AddDefaultIdentity source for more information.

정적 자산 게시 방지 IdentityPrevent publish of static Identity assets

IdentityUI에 대 한 정적 자산 (스타일 시트 및 JavaScript 파일 Identity )을 웹 루트에 게시 하지 않으려면 다음 ResolveStaticWebAssetsInputsDependsOn 속성과 RemoveIdentityAssets 대상을 응용 프로그램의 프로젝트 파일에 추가 합니다.To prevent publishing static Identity assets (stylesheets and JavaScript files for Identity UI) to the web root, add the following ResolveStaticWebAssetsInputsDependsOn property and RemoveIdentityAssets target to the app's project file:

<PropertyGroup>
  <ResolveStaticWebAssetsInputsDependsOn>RemoveIdentityAssets</ResolveStaticWebAssetsInputsDependsOn>
</PropertyGroup>

<Target Name="RemoveIdentityAssets">
  <ItemGroup>
    <StaticWebAsset Remove="@(StaticWebAsset)" Condition="%(SourceId) == 'Microsoft.AspNetCore.Identity.UI'" />
  </ItemGroup>
</Target>

다음 단계Next Steps

작성자: Rick AndersonBy Rick Anderson

ASP.NET Core Identity 는 ASP.NET Core 앱에 로그인 기능을 추가 하는 멤버 자격 시스템입니다.ASP.NET Core Identity is a membership system that adds login functionality to ASP.NET Core apps. 사용자는에 저장 된 로그인 정보를 사용 하 여 계정을 만들거나 Identity 외부 로그인 공급자를 사용할 수 있습니다.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.

Identity SQL Server 데이터베이스를 사용 하 여 사용자 이름, 암호 및 프로필 데이터를 저장 하도록 구성할 수 있습니다.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).

이 항목에서는를 사용 하 여 사용자를 Identity 등록 하 고 로그인 하 고 로그 아웃 하는 방법을 알아봅니다.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.

AddDefault Identity 및 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:

자세한 내용은 Adddefault Identity source 를 참조 하세요.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 Identity 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/계정/로그 아웃/Identity/Account/Logout
  • /Identity/계정/관리/Identity/Account/Manage

마이그레이션 적용Apply migrations

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

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

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.

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

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

SQL Server 개체 탐색기에서 AspNetUsers 테이블에 대한 컨텍스트 메뉴

Identity서비스 구성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.

Identity 는 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();
}

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

스 캐 폴드 Register, Login 및 LogOutScaffold Register, Login, and LogOut

이 섹션에 표시 된 코드를 생성 하려면 Razor 권한 부여 지침을 포함 하는 스 캐 폴드 id를 프로젝트에 추가 합니다.Follow the Scaffold identity into a Razor project with authorization instructions to generate the code shown in this section.

Register, Login 및 LogOut 파일을 추가 합니다.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:

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

사용자가 성공적으로 만들어진 경우에는에 대 한 호출을 통해 사용자가 로그인 됩니다 _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.

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

권한 부여 결정을 내리는 방법에 대 한 자세한 내용은을 참조 하십시오 ASP.NET Core 권한 부여 소개 .For information on how to make authorization decisions, see ASP.NET Core 권한 부여 소개.

로그아웃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
            {
                // This needs to be a redirect so that the browser performs a new
                // request and the identity for the user gets updated.
                return RedirectToPage();
            }
        }
    }
}

SignOutAsync 에 저장 된 사용자의 클레임을 지웁니다 cookie .SignOutAsync clears the user's claims stored in a cookie.

Post는 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>


테스트할 IdentityTest Identity

기본 웹 프로젝트 템플릿을 사용 하면 홈 페이지에 익명으로 액세스할 수 있습니다.The default web project templates allow anonymous access to the home pages. 테스트 하려면 Identity [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.

탐험 IdentityExplore Identity

자세히 살펴보기 Identity :To explore Identity in more detail:

Identity 요소도Identity Components

모든 Identity 종속 NuGet 패키지는 AspNetCore 메타 패키지에 포함 되어 있습니다.All the Identity dependent NuGet packages are included in the Microsoft.AspNetCore.App metapackage.

의 기본 패키지는 Identity 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 Core IdentityMigrating to ASP.NET Core Identity

기존 저장소 마이그레이션에 대 한 자세한 내용 및 지침은 Identity 인증 및 Identity 마이그레이션 을 참조 하세요.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