IdentityASP.NET Core 프로젝트의 스 캐 폴드Scaffold Identity in ASP.NET Core projects

작성자: Rick AndersonBy Rick Anderson

ASP.NET Core은 Razor 클래스 라이브러리로 ASP.NET Core Identity 를 제공 합니다.ASP.NET Core provides ASP.NET Core Identity as a Razor Class Library. 를 포함 하는 응용 프로그램 Identity 은 스 캐 폴더를 적용 하 여 Identity Razor 클래스 라이브러리 (rcl)에 포함 된 소스 코드를 선택적으로 추가할 수 있습니다.Applications that include Identity can apply the scaffolder to selectively add the source code contained in the Identity Razor Class Library (RCL). 코드를 수정하고 동작을 변경할 수 있도록 소스 코드를 생성할 수 있습니다.You might want to generate source code so you can modify the code and change the behavior. 예를 들어 등록에 사용된 코드를 생성하도록 스캐폴더를 지정할 수 있습니다.For example, you could instruct the scaffolder to generate the code used in registration. 생성된 코드는 Identity RCL의 동일한 코드보다 우선합니다.Generated code takes precedence over the same code in the Identity RCL. 기본 RCL을 사용 하지 않고 UI에 대 한 모든 권한을 얻으려면 전체 Identity Ui 원본 만들기섹션을 참조 하세요.To gain full control of the UI and not use the default RCL, see the section Create full Identity UI source.

인증을 포함 하지 않는 응용 프로그램은 스 캐 폴더를 적용 하 여 rcl 패키지를 추가할 수 있습니다 Identity .Applications that do not include authentication can apply the scaffolder to add the RCL Identity package. 선택한 Identity 코드의 옵션이 생성되어야 합니다.You have the option of selecting Identity code to be generated.

스 캐 폴더는 대부분의 필요한 코드를 생성 하지만 프로세스를 완료 하려면 프로젝트를 업데이트 해야 합니다.Although the scaffolder generates most of the necessary code, you need to update your project to complete the process. 이 문서에서는 Identity 스 캐 폴딩 업데이트를 완료 하는 데 필요한 단계를 설명 합니다.This document explains the steps needed to complete an Identity scaffolding update.

파일 차이를 표시 하는 소스 제어 시스템을 사용 하 여 변경 내용을 되돌릴 수 있도록 하는 것이 좋습니다.We recommend using a source control system that shows file differences and allows you to back out of changes. 스 캐 폴더를 실행 한 후에 변경 내용을 검사 합니다 Identity .Inspect the changes after running the Identity scaffolder.

서비스는 두 가지 요소 인증, 계정 확인 및 암호 복구및 기타 보안 기능을 사용 하는 경우에 필요 Identity 합니다.Services are required when using Two Factor Authentication, Account confirmation and password recovery, and other security features with Identity. 스 캐 폴딩 할 때 서비스 또는 서비스 스텁이 생성 되지 않습니다 Identity .Services or service stubs aren't generated when scaffolding Identity. 이러한 기능을 사용 하도록 설정 하는 서비스는 수동으로 추가 해야 합니다.Services to enable these features must be added manually. 예를 들어 전자 메일 확인 필요를 참조 하세요.For example, see Require Email Confirmation.

Identity기존 개별 계정이 있는 프로젝트에 새 데이터 컨텍스트를 사용 하 여 스 캐 폴딩 할 때:When scaffolding Identity with a new data context into a project with existing individual accounts:

  • 에서 Startup.ConfigureServices 에 대 한 호출을 제거 합니다.In Startup.ConfigureServices, remove the calls to:
    • AddDbContext
    • AddDefaultIdentity

예를 들어 AddDbContextAddDefaultIdentity 는 다음 코드에서 주석 처리 됩니다.For example, AddDbContext and AddDefaultIdentity are commented out in the following code:

public void ConfigureServices(IServiceCollection services)
{
    //services.AddDbContext<ApplicationDbContext>(options =>
    //    options.UseSqlServer(
    //        Configuration.GetConnectionString("DefaultConnection")));
    //services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    //    .AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddControllersWithViews();
    services.AddRazorPages();
}

앞 코드는 영역/ Identity / Identity HostingStartup.cs 에서 중복 된 코드를 주석으로 처리 합니다.The preceeding code comments out the code that is duplicated in Areas/Identity/IdentityHostingStartup.cs

일반적으로 개별 계정을 사용 하 여 만든 앱은 새 데이터 컨텍스트 를 만들지 않아야 합니다.Typically, apps that were created with individual accounts should not create a new data context.

Identity빈 프로젝트로 스 캐 폴드Scaffold Identity into an empty project

Id 스 캐 폴더를 실행 합니다.Run the Identity scaffolder:

  • 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭 하 > Add > 새 스 캐 폴드 항목추가를 클릭 합니다.From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • 새 스 캐 폴드 항목 추가 대화 상자의 왼쪽 창에서 id > 추가를 선택 합니다.From the left pane of the Add New Scaffolded Item dialog, select Identity > Add.
  • Id 추가 대화 상자에서 원하는 옵션을 선택 합니다.In the Add Identity dialog, select the options you want.
    • 기존 레이아웃 페이지를 선택 하거나 잘못 된 태그를 사용 하 여 레이아웃 파일을 덮어씁니다.Select your existing layout page, or your layout file will be overwritten with incorrect markup:
      • ~/Pages/Shared/_Layout.cshtmlRazor Pages~/Pages/Shared/_Layout.cshtml for Razor Pages
      • ~/Views/Shared/_Layout.cshtmlMVC 프로젝트의 경우~/Views/Shared/_Layout.cshtml for MVC projects
      • Blazor 서버 템플릿 ()에서 만든 Blazor 서버 앱은 blazorserver 기본적으로 Razor Pages 또는 MVC에 대해 구성 되지 않습니다.Blazor Server apps created from the Blazor Server template (blazorserver) aren't configured for Razor Pages or MVC by default. 레이아웃 페이지 항목을 비워 둡니다.Leave the layout page entry blank.
    • 단추를 선택 + 하 여 새 데이터 컨텍스트 클래스를 만듭니다.Select the + button to create a new Data context class. 기본값을 그대로 적용 하거나 클래스를 지정 합니다 (예: MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
  • 추가를 선택합니다.Select Add.

다음과 유사한 코드를 사용 하 여 클래스를 업데이트 합니다 Startup .Update the Startup class with code similar to the following:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
        services.AddRazorPages();
    }

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

        app.UseRouting();

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

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
            endpoints.MapRazorPages();
        });
    }
}

UseHsts권장 되지만 필수는 아닙니다.UseHsts is recommended but not required. 자세한 내용은 HTTP 엄격한 전송 보안 프로토콜을 참조 하세요.For more information, see HTTP Strict Transport Security Protocol.

생성 된 Id 데이터베이스 코드에는 Entity Framework Core 마이그레이션이필요 합니다.The generated Identity database code requires Entity Framework Core Migrations. 마이그레이션을 만들고 데이터베이스를 업데이트 합니다.Create a migration and update the database. 예를 들어 다음 명령을 실행합니다.For example, run the following commands:

Visual Studio 패키지 관리자 콘솔에서 다음을 수행 합니다.In the Visual Studio Package Manager Console:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

Add-Migration 명령에 대 한 "CreateIdentitySchema" name 매개 변수는 임의입니다.The "CreateIdentitySchema" name parameter for the Add-Migration command is arbitrary. "CreateIdentitySchema" 마이그레이션에 대해 설명 합니다."CreateIdentitySchema" describes the migration.

Identity Razor 기존 권한 부여 없이 프로젝트에 스 캐 폴드Scaffold Identity into a Razor project without existing authorization

Id 스 캐 폴더를 실행 합니다.Run the Identity scaffolder:

  • 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭 하 > Add > 새 스 캐 폴드 항목추가를 클릭 합니다.From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • 새 스 캐 폴드 항목 추가 대화 상자의 왼쪽 창에서 id > 추가를 선택 합니다.From the left pane of the Add New Scaffolded Item dialog, select Identity > Add.
  • Id 추가 대화 상자에서 원하는 옵션을 선택 합니다.In the Add Identity dialog, select the options you want.
    • 기존 레이아웃 페이지를 선택 하거나 잘못 된 태그를 사용 하 여 레이아웃 파일을 덮어씁니다.Select your existing layout page, or your layout file will be overwritten with incorrect markup:
      • ~/Pages/Shared/_Layout.cshtmlRazor Pages~/Pages/Shared/_Layout.cshtml for Razor Pages
      • ~/Views/Shared/_Layout.cshtmlMVC 프로젝트의 경우~/Views/Shared/_Layout.cshtml for MVC projects
      • Blazor 서버 템플릿 ()에서 만든 Blazor 서버 앱은 blazorserver 기본적으로 Razor Pages 또는 MVC에 대해 구성 되지 않습니다.Blazor Server apps created from the Blazor Server template (blazorserver) aren't configured for Razor Pages or MVC by default. 레이아웃 페이지 항목을 비워 둡니다.Leave the layout page entry blank.
    • 단추를 선택 + 하 여 새 데이터 컨텍스트 클래스를 만듭니다.Select the + button to create a new Data context class. 기본값을 그대로 적용 하거나 클래스를 지정 합니다 (예: MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
  • 추가를 선택합니다.Select Add.

Identity영역/ Identity / Identity HostingStartup.cs에서 구성 됩니다. is configured in Areas/Identity/IdentityHostingStartup.cs. 자세한 내용은 IHostingStartup를 참조 하세요.For more information, see IHostingStartup.

마이그레이션, UseAuthentication 및 레이아웃Migrations, UseAuthentication, and layout

생성 된 Id 데이터베이스 코드에는 Entity Framework Core 마이그레이션이필요 합니다.The generated Identity database code requires Entity Framework Core Migrations. 마이그레이션을 만들고 데이터베이스를 업데이트 합니다.Create a migration and update the database. 예를 들어 다음 명령을 실행합니다.For example, run the following commands:

Visual Studio 패키지 관리자 콘솔에서 다음을 수행 합니다.In the Visual Studio Package Manager Console:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

Add-Migration 명령에 대 한 "CreateIdentitySchema" name 매개 변수는 임의입니다.The "CreateIdentitySchema" name parameter for the Add-Migration command is arbitrary. "CreateIdentitySchema" 마이그레이션에 대해 설명 합니다."CreateIdentitySchema" describes the migration.

인증 사용Enable authentication

다음과 유사한 코드를 사용 하 여 클래스를 업데이트 합니다 Startup .Update the Startup class with code similar to the following:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    }

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

UseHsts권장 되지만 필수는 아닙니다.UseHsts is recommended but not required. 자세한 내용은 HTTP 엄격한 전송 보안 프로토콜을 참조 하세요.For more information, see HTTP Strict Transport Security Protocol.

레이아웃 변경Layout changes

선택 사항: 로그인 부분 ( _LoginPartial )을 레이아웃 파일에 추가 합니다.Optional: Add the login partial (_LoginPartial) to the layout file:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - WebRP</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
    <link rel="stylesheet" href="~/css/site.css" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">WebRP</a>
                <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
                    <partial name="_LoginPartial" />
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2019 - WebRP - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

    <script src="~/lib/jquery/dist/jquery.min.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

    @RenderSection("Scripts", required: false)
</body>
</html>

Identity Razor 권한 부여를 사용 하 여 프로젝트로 스 캐 폴드Scaffold Identity into a Razor project with authorization

Id 스 캐 폴더를 실행 합니다.Run the Identity scaffolder:

  • 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭 하 > Add > 새 스 캐 폴드 항목추가를 클릭 합니다.From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • 스 캐 폴드 추가 대화 상자의 왼쪽 창에서 id > 추가를 선택 합니다.From the left pane of the Add Scaffold dialog, select Identity > Add.
  • Id 추가 대화 상자에서 원하는 옵션을 선택 합니다.In the Add Identity dialog, select the options you want.
    • 레이아웃 파일을 잘못 된 태그로 덮어쓰지 않도록 기존 레이아웃 페이지를 선택 합니다.Select your existing layout page so your layout file isn't overwritten with incorrect markup. 기존 * _ 레이아웃* 을 선택한 경우에는이 파일을 덮어쓰지 않습니다 .When an existing _Layout.cshtml file is selected, it is not overwritten. 다음은 그 예입니다.For example:
      • ~/Pages/Shared/_Layout.cshtml기존 Razor Pages 인프라를 사용 하는 Razor Pages 또는 Blazor 서버 프로젝트의 경우~/Pages/Shared/_Layout.cshtml for Razor Pages or Blazor Server projects with existing Razor Pages infrastructure
      • ~/Views/Shared/_Layout.cshtml기존 MVC 인프라를 사용 하는 MVC 프로젝트 또는 Blazor 서버 프로젝트의 경우~/Views/Shared/_Layout.cshtml for MVC projects or Blazor Server projects with existing MVC infrastructure
  • 기존 데이터 컨텍스트를 사용 하려면 재정의할 파일을 하나 이상 선택 합니다.To use your existing data context, select at least one file to override. 데이터 컨텍스트를 추가 하려면 파일을 하나 이상 선택 해야 합니다.You must select at least one file to add your data context.
    • 데이터 컨텍스트 클래스를 선택 합니다.Select your data context class.
    • 추가를 선택합니다.Select Add.
  • 새 사용자 컨텍스트를 만들고 Id에 대 한 사용자 지정 사용자 클래스를 만들 수 있습니다.To create a new user context and possibly create a custom user class for Identity:
    • 단추를 선택 + 하 여 새 데이터 컨텍스트 클래스를 만듭니다.Select the + button to create a new Data context class. 기본값을 그대로 적용 하거나 클래스를 지정 합니다 (예: MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
    • 추가를 선택합니다.Select Add.

참고: 새 사용자 컨텍스트를 만드는 경우 재정의할 파일을 선택할 필요가 없습니다.Note: If you're creating a new user context, you don't have to select a file to override.

Id 스 캐 폴더를 실행 합니다.Run the Identity scaffolder:

  • 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭 하 > Add > 새 스 캐 폴드 항목추가를 클릭 합니다.From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • 스 캐 폴드 추가 대화 상자의 왼쪽 창에서 id > 추가를 선택 합니다.From the left pane of the Add Scaffold dialog, select Identity > Add.
  • Id 추가 대화 상자에서 원하는 옵션을 선택 합니다.In the Add Identity dialog, select the options you want.
    • 기존 레이아웃 페이지를 선택 하거나 잘못 된 태그를 사용 하 여 레이아웃 파일을 덮어씁니다.Select your existing layout page, or your layout file will be overwritten with incorrect markup. 기존 * _ 레이아웃* 을 선택한 경우에는이 파일을 덮어쓰지 않습니다 .When an existing _Layout.cshtml file is selected, it is not overwritten. 다음은 그 예입니다.For example:
      • ~/Pages/Shared/_Layout.cshtmlRazor Pages~/Pages/Shared/_Layout.cshtml for Razor Pages
      • ~/Views/Shared/_Layout.cshtmlMVC 프로젝트의 경우~/Views/Shared/_Layout.cshtml for MVC projects
  • 기존 데이터 컨텍스트를 사용 하려면 재정의할 파일을 하나 이상 선택 합니다.To use your existing data context, select at least one file to override. 데이터 컨텍스트를 추가 하려면 파일을 하나 이상 선택 해야 합니다.You must select at least one file to add your data context.
    • 데이터 컨텍스트 클래스를 선택 합니다.Select your data context class.
    • 추가를 선택합니다.Select Add.
  • 새 사용자 컨텍스트를 만들고 Id에 대 한 사용자 지정 사용자 클래스를 만들 수 있습니다.To create a new user context and possibly create a custom user class for Identity:
    • 단추를 선택 + 하 여 새 데이터 컨텍스트 클래스를 만듭니다.Select the + button to create a new Data context class. 기본값을 그대로 적용 하거나 클래스를 지정 합니다 (예: MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
    • 추가를 선택합니다.Select Add.

참고: 새 사용자 컨텍스트를 만드는 경우 재정의할 파일을 선택할 필요가 없습니다.Note: If you're creating a new user context, you don't have to select a file to override.

일부 Identity 옵션은 영역/ Identity / Identity HostingStartup.cs구성 됩니다.Some Identity options are configured in Areas/Identity/IdentityHostingStartup.cs. 자세한 내용은 IHostingStartup를 참조 하세요.For more information, see IHostingStartup.

Identity기존 권한 부여 없이 MVC 프로젝트에 스 캐 폴드Scaffold Identity into an MVC project without existing authorization

Id 스 캐 폴더를 실행 합니다.Run the Identity scaffolder:

  • 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭 하 > Add > 새 스 캐 폴드 항목추가를 클릭 합니다.From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • 새 스 캐 폴드 항목 추가 대화 상자의 왼쪽 창에서 id > 추가를 선택 합니다.From the left pane of the Add New Scaffolded Item dialog, select Identity > Add.
  • Id 추가 대화 상자에서 원하는 옵션을 선택 합니다.In the Add Identity dialog, select the options you want.
    • 기존 레이아웃 페이지를 선택 하거나 잘못 된 태그를 사용 하 여 레이아웃 파일을 덮어씁니다.Select your existing layout page, or your layout file will be overwritten with incorrect markup:
      • ~/Pages/Shared/_Layout.cshtmlRazor Pages~/Pages/Shared/_Layout.cshtml for Razor Pages
      • ~/Views/Shared/_Layout.cshtmlMVC 프로젝트의 경우~/Views/Shared/_Layout.cshtml for MVC projects
      • Blazor 서버 템플릿 ()에서 만든 Blazor 서버 앱은 blazorserver 기본적으로 Razor Pages 또는 MVC에 대해 구성 되지 않습니다.Blazor Server apps created from the Blazor Server template (blazorserver) aren't configured for Razor Pages or MVC by default. 레이아웃 페이지 항목을 비워 둡니다.Leave the layout page entry blank.
    • 단추를 선택 + 하 여 새 데이터 컨텍스트 클래스를 만듭니다.Select the + button to create a new Data context class. 기본값을 그대로 적용 하거나 클래스를 지정 합니다 (예: MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
  • 추가를 선택합니다.Select Add.

선택 사항: _LoginPartial Views/Shared/_Layout cshtml 파일에 로그인 부분 ()을 추가 합니다.Optional: Add the login partial (_LoginPartial) to the Views/Shared/_Layout.cshtml file:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - WebRP</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
    <link rel="stylesheet" href="~/css/site.css" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">WebRP</a>
                <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
                    <partial name="_LoginPartial" />
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2019 - WebRP - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

    <script src="~/lib/jquery/dist/jquery.min.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

    @RenderSection("Scripts", required: false)
</body>
</html>
  • Pages/shared/_LoginPartial cshtml 파일을 Views/shared/_LoginPartial로 이동 합니다.Move the Pages/Shared/_LoginPartial.cshtml file to Views/Shared/_LoginPartial.cshtml

Identity영역/ Identity / Identity HostingStartup.cs에서 구성 됩니다. is configured in Areas/Identity/IdentityHostingStartup.cs. 자세한 내용은 IHostingStartup를 참조 하세요.For more information, see IHostingStartup.

생성 된 Id 데이터베이스 코드에는 Entity Framework Core 마이그레이션이필요 합니다.The generated Identity database code requires Entity Framework Core Migrations. 마이그레이션을 만들고 데이터베이스를 업데이트 합니다.Create a migration and update the database. 예를 들어 다음 명령을 실행합니다.For example, run the following commands:

Visual Studio 패키지 관리자 콘솔에서 다음을 수행 합니다.In the Visual Studio Package Manager Console:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

Add-Migration 명령에 대 한 "CreateIdentitySchema" name 매개 변수는 임의입니다.The "CreateIdentitySchema" name parameter for the Add-Migration command is arbitrary. "CreateIdentitySchema" 마이그레이션에 대해 설명 합니다."CreateIdentitySchema" describes the migration.

다음과 유사한 코드를 사용 하 여 클래스를 업데이트 합니다 Startup .Update the Startup class with code similar to the following:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
        services.AddRazorPages();
    }

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

        app.UseRouting();

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

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
            endpoints.MapRazorPages();
        });
    }
}

UseHsts권장 되지만 필수는 아닙니다.UseHsts is recommended but not required. 자세한 내용은 HTTP 엄격한 전송 보안 프로토콜을 참조 하세요.For more information, see HTTP Strict Transport Security Protocol.

Identity권한 부여를 사용 하 여 MVC 프로젝트로 스 캐 폴드Scaffold Identity into an MVC project with authorization

Id 스 캐 폴더를 실행 합니다.Run the Identity scaffolder:

  • 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭 하 > Add > 새 스 캐 폴드 항목추가를 클릭 합니다.From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • 스 캐 폴드 추가 대화 상자의 왼쪽 창에서 id > 추가를 선택 합니다.From the left pane of the Add Scaffold dialog, select Identity > Add.
  • Id 추가 대화 상자에서 원하는 옵션을 선택 합니다.In the Add Identity dialog, select the options you want.
    • 레이아웃 파일을 잘못 된 태그로 덮어쓰지 않도록 기존 레이아웃 페이지를 선택 합니다.Select your existing layout page so your layout file isn't overwritten with incorrect markup. 기존 * _ 레이아웃* 을 선택한 경우에는이 파일을 덮어쓰지 않습니다 .When an existing _Layout.cshtml file is selected, it is not overwritten. 다음은 그 예입니다.For example:
      • ~/Pages/Shared/_Layout.cshtml기존 Razor Pages 인프라를 사용 하는 Razor Pages 또는 Blazor 서버 프로젝트의 경우~/Pages/Shared/_Layout.cshtml for Razor Pages or Blazor Server projects with existing Razor Pages infrastructure
      • ~/Views/Shared/_Layout.cshtml기존 MVC 인프라를 사용 하는 MVC 프로젝트 또는 Blazor 서버 프로젝트의 경우~/Views/Shared/_Layout.cshtml for MVC projects or Blazor Server projects with existing MVC infrastructure
  • 기존 데이터 컨텍스트를 사용 하려면 재정의할 파일을 하나 이상 선택 합니다.To use your existing data context, select at least one file to override. 데이터 컨텍스트를 추가 하려면 파일을 하나 이상 선택 해야 합니다.You must select at least one file to add your data context.
    • 데이터 컨텍스트 클래스를 선택 합니다.Select your data context class.
    • 추가를 선택합니다.Select Add.
  • 새 사용자 컨텍스트를 만들고 Id에 대 한 사용자 지정 사용자 클래스를 만들 수 있습니다.To create a new user context and possibly create a custom user class for Identity:
    • 단추를 선택 + 하 여 새 데이터 컨텍스트 클래스를 만듭니다.Select the + button to create a new Data context class. 기본값을 그대로 적용 하거나 클래스를 지정 합니다 (예: MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
    • 추가를 선택합니다.Select Add.

참고: 새 사용자 컨텍스트를 만드는 경우 재정의할 파일을 선택할 필요가 없습니다.Note: If you're creating a new user context, you don't have to select a file to override.

Id 스 캐 폴더를 실행 합니다.Run the Identity scaffolder:

  • 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭 하 > Add > 새 스 캐 폴드 항목추가를 클릭 합니다.From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • 스 캐 폴드 추가 대화 상자의 왼쪽 창에서 id > 추가를 선택 합니다.From the left pane of the Add Scaffold dialog, select Identity > Add.
  • Id 추가 대화 상자에서 원하는 옵션을 선택 합니다.In the Add Identity dialog, select the options you want.
    • 기존 레이아웃 페이지를 선택 하거나 잘못 된 태그를 사용 하 여 레이아웃 파일을 덮어씁니다.Select your existing layout page, or your layout file will be overwritten with incorrect markup. 기존 * _ 레이아웃* 을 선택한 경우에는이 파일을 덮어쓰지 않습니다 .When an existing _Layout.cshtml file is selected, it is not overwritten. 다음은 그 예입니다.For example:
      • ~/Pages/Shared/_Layout.cshtmlRazor Pages~/Pages/Shared/_Layout.cshtml for Razor Pages
      • ~/Views/Shared/_Layout.cshtmlMVC 프로젝트의 경우~/Views/Shared/_Layout.cshtml for MVC projects
  • 기존 데이터 컨텍스트를 사용 하려면 재정의할 파일을 하나 이상 선택 합니다.To use your existing data context, select at least one file to override. 데이터 컨텍스트를 추가 하려면 파일을 하나 이상 선택 해야 합니다.You must select at least one file to add your data context.
    • 데이터 컨텍스트 클래스를 선택 합니다.Select your data context class.
    • 추가를 선택합니다.Select Add.
  • 새 사용자 컨텍스트를 만들고 Id에 대 한 사용자 지정 사용자 클래스를 만들 수 있습니다.To create a new user context and possibly create a custom user class for Identity:
    • 단추를 선택 + 하 여 새 데이터 컨텍스트 클래스를 만듭니다.Select the + button to create a new Data context class. 기본값을 그대로 적용 하거나 클래스를 지정 합니다 (예: MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
    • 추가를 선택합니다.Select Add.

참고: 새 사용자 컨텍스트를 만드는 경우 재정의할 파일을 선택할 필요가 없습니다.Note: If you're creating a new user context, you don't have to select a file to override.

Identity Blazor Server 기존 권한 부여 없이 프로젝트에 스 캐 폴드Scaffold Identity into a Blazor Server project without existing authorization

Id 스 캐 폴더를 실행 합니다.Run the Identity scaffolder:

  • 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭 하 > Add > 새 스 캐 폴드 항목추가를 클릭 합니다.From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • 새 스 캐 폴드 항목 추가 대화 상자의 왼쪽 창에서 id > 추가를 선택 합니다.From the left pane of the Add New Scaffolded Item dialog, select Identity > Add.
  • Id 추가 대화 상자에서 원하는 옵션을 선택 합니다.In the Add Identity dialog, select the options you want.
    • 기존 레이아웃 페이지를 선택 하거나 잘못 된 태그를 사용 하 여 레이아웃 파일을 덮어씁니다.Select your existing layout page, or your layout file will be overwritten with incorrect markup:
      • ~/Pages/Shared/_Layout.cshtmlRazor Pages~/Pages/Shared/_Layout.cshtml for Razor Pages
      • ~/Views/Shared/_Layout.cshtmlMVC 프로젝트의 경우~/Views/Shared/_Layout.cshtml for MVC projects
      • Blazor 서버 템플릿 ()에서 만든 Blazor 서버 앱은 blazorserver 기본적으로 Razor Pages 또는 MVC에 대해 구성 되지 않습니다.Blazor Server apps created from the Blazor Server template (blazorserver) aren't configured for Razor Pages or MVC by default. 레이아웃 페이지 항목을 비워 둡니다.Leave the layout page entry blank.
    • 단추를 선택 + 하 여 새 데이터 컨텍스트 클래스를 만듭니다.Select the + button to create a new Data context class. 기본값을 그대로 적용 하거나 클래스를 지정 합니다 (예: MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
  • 추가를 선택합니다.Select Add.

Identity영역/ Identity / Identity HostingStartup.cs에서 구성 됩니다. is configured in Areas/Identity/IdentityHostingStartup.cs. 자세한 내용은 IHostingStartup를 참조 하세요.For more information, see IHostingStartup.

마이그레이션Migrations

생성 된 Id 데이터베이스 코드에는 Entity Framework Core 마이그레이션이필요 합니다.The generated Identity database code requires Entity Framework Core Migrations. 마이그레이션을 만들고 데이터베이스를 업데이트 합니다.Create a migration and update the database. 예를 들어 다음 명령을 실행합니다.For example, run the following commands:

Visual Studio 패키지 관리자 콘솔에서 다음을 수행 합니다.In the Visual Studio Package Manager Console:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

Add-Migration 명령에 대 한 "CreateIdentitySchema" name 매개 변수는 임의입니다.The "CreateIdentitySchema" name parameter for the Add-Migration command is arbitrary. "CreateIdentitySchema" 마이그레이션에 대해 설명 합니다."CreateIdentitySchema" describes the migration.

앱에 XSRF 토큰 전달Pass an XSRF token to the app

토큰은 구성 요소에 전달할 수 있습니다.Tokens can be passed to components:

  • 인증 토큰을 프로 비전 하 여 인증 쿠키에 저장 하는 경우 구성 요소에 전달할 수 있습니다.When authentication tokens are provisioned and saved to the authentication cookie, they can be passed to components.
  • Razor구성 요소 HttpContext 는 직접 사용할 수 없으므로의 로그 아웃 끝점에 게시 하기 위해 XSRF (요청 방지 위조) 토큰 을 얻을 수 있는 방법이 없습니다 Identity /Identity/Account/Logout . components can't use HttpContext directly, so there's no way to obtain an anti-request forgery (XSRF) token to POST to Identity's logout endpoint at /Identity/Account/Logout. XSRF 토큰을 구성 요소에 전달할 수 있습니다.An XSRF token can be passed to components.

자세한 내용은 ASP.NET Core [Blazor Server 추가 보안 시나리오를 참조하세요.For more information, see ASP.NET Core [Blazor Server 추가 보안 시나리오.

Pages/_Host 파일에서 및 클래스에 토큰을 추가한 후에 토큰을 설정 합니다 InitialApplicationState TokenProvider .In the Pages/_Host.cshtml file, establish the token after adding it to the InitialApplicationState and TokenProvider classes:

@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf

...

var tokens = new InitialApplicationState
{
    ...

    XsrfToken = Xsrf.GetAndStoreTokens(HttpContext).RequestToken
};

App를 할당 하기 위해 구성 요소 (응용 프로그램 razor)를 업데이트 합니다 InitialState.XsrfToken .Update the App component (App.razor) to assign the InitialState.XsrfToken:

@inject TokenProvider TokenProvider

...

TokenProvider.XsrfToken = InitialState.XsrfToken;

항목에서 설명 하는 TokenProvider 서비스는 LoginDisplay 다음 레이아웃 및 인증 흐름 변경 섹션의 구성 요소에서 사용 됩니다.The TokenProvider service demonstrated in the topic is used in the LoginDisplay component in the following Layout and authentication flow changes section.

인증 사용Enable authentication

클래스에서 Startup :In the Startup class:

  • Razor에서 Pages services가 추가 되었는지 확인 Startup.ConfigureServices 합니다.Confirm that Razor Pages services are added in Startup.ConfigureServices.
  • Tokenprovider를 사용 하는 경우 서비스를 등록 합니다.If using the TokenProvider, register the service.
  • UseDatabaseErrorPage Startup.Configure 개발 환경에 대 한의 응용 프로그램 작성기에서를 호출 합니다.Call UseDatabaseErrorPage on the application builder in Startup.Configure for the Development environment.
  • UseAuthentication및 이후를 호출 UseAuthorization UseRouting 합니다.Call UseAuthentication and UseAuthorization after UseRouting.
  • 페이지에 대 한 끝점을 추가 Razor 합니다.Add an endpoint for Razor Pages.
public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();
    services.AddServerSideBlazor();
    services.AddSingleton<WeatherForecastService>();
    services.AddScoped<TokenProvider>();
}

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();
        endpoints.MapBlazorHub();
        endpoints.MapFallbackToPage("/_Host");
    });
}

UseHsts권장 되지만 필수는 아닙니다.UseHsts is recommended but not required. 자세한 내용은 HTTP 엄격한 전송 보안 프로토콜을 참조 하세요.For more information, see HTTP Strict Transport Security Protocol.

레이아웃 및 인증 흐름 변경Layout and authentication flow changes

RedirectToLogin프로젝트 루트의 앱 공유 폴더에 구성 요소 (redirecttologin. razor)를 추가 합니다.Add a RedirectToLogin component (RedirectToLogin.razor) to the app's Shared folder in the project root:

@inject NavigationManager Navigation
@code {
    protected override void OnInitialized()
    {
        Navigation.NavigateTo("Identity/Account/Login?returnUrl=" +
            Uri.EscapeDataString(Navigation.Uri), true);
    }
}

LoginDisplay앱의 공유 폴더에 구성 요소 (LoginDisplay)를 추가 합니다. Tokenprovider 서비스 는 Identity 의 로그 아웃 끝점에 게시 하는 HTML 폼에 XSRF 토큰을 제공 합니다.The TokenProvider service provides the XSRF token for the HTML form that POSTs to Identity's logout endpoint:

@using Microsoft.AspNetCore.Components.Authorization
@inject NavigationManager Navigation
@inject TokenProvider TokenProvider

<AuthorizeView>
    <Authorized>
        <a href="Identity/Account/Manage/Index">
            Hello, @context.User.Identity.Name!
        </a>
        <form action="/Identity/Account/Logout?returnUrl=%2F" method="post">
            <button class="nav-link btn btn-link" type="submit">Logout</button>
            <input name="__RequestVerificationToken" type="hidden" 
                value="@TokenProvider.XsrfToken">
        </form>
    </Authorized>
    <NotAuthorized>
        <a href="Identity/Account/Register">Register</a>
        <a href="Identity/Account/Login">Login</a>
    </NotAuthorized>
</AuthorizeView>

MainLayout구성 요소 (Shared/mainlayout. razor)에서 LoginDisplay 구성 요소를 상위 행 요소 내용에 추가 합니다 <div> .In the MainLayout component (Shared/MainLayout.razor), add the LoginDisplay component to the top-row <div> element's content:

<div class="top-row px-4 auth">
    <LoginDisplay />
    <a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a>
</div>

스타일 인증 끝점Style authentication endpoints

Blazor Server에서는 페이지 Razor 페이지를 사용 하므로 Identity 방문자가 Identity 페이지와 구성 요소 간을 탐색할 때 UI의 스타일이 변경 됩니다.Because Blazor Server uses Razor Pages Identity pages, the styling of the UI changes when a visitor navigates between Identity pages and components. Incongruous 스타일을 해결 하는 두 가지 옵션이 있습니다.You have two options to address the incongruous styles:

빌드 Identity 구성 요소Build Identity components

페이지 대신 구성 요소를 사용 하는 방법은 Identity 구성 요소를 빌드하는 것입니다 Identity .An approach to using components for Identity instead of pages is to build Identity components. SignInManagerUserManager 는 구성 요소에서 지원 되지 않으므로 Razor 앱에서 API 끝점을 사용 Blazor Server 하 여 사용자 계정 작업을 처리 합니다.Because SignInManager and UserManager aren't supported in Razor components, use API endpoints in the Blazor Server app to process user account actions.

앱 스타일을 사용 하 여 사용자 지정 레이아웃 사용 BlazorUse a custom layout with Blazor app styles

Identity페이지 레이아웃 및 스타일을 수정 하 여 기본 테마를 사용 하는 페이지를 만들 수 있습니다 Blazor .The Identity pages layout and styles can be modified to produce pages that use the default Blazor theme.

참고

이 섹션의 예제는 단순히 사용자 지정을 위한 출발점입니다.The example in this section is merely a starting point for customization. 최상의 사용자 환경을 위해 추가 작업이 필요할 수 있습니다.Additional work is likely required for the best user experience.

NavMenu_IdentityLayout 구성 요소 (공유/NavMenu_ Identity 레이아웃. razor)를 만듭니다.Create a new NavMenu_IdentityLayout component (Shared/NavMenu_IdentityLayout.razor). 구성 요소의 태그와 코드에 대해 앱 NavMenu 구성 요소의 동일한 콘텐츠 (Shared/NavMenu)를 사용 합니다.For the markup and code of the component, use the same content of the app's NavMenu component (Shared/NavMenu.razor). NavLink RedirectToLogin 구성 요소의 자동 리디렉션이 인증 또는 권한 부여가 필요한 구성 요소에 대해 실패 하므로 익명으로 연결할 수 없는 구성 요소에 대 한 모든를 제거 합니다.Strip out any NavLinks to components that can't be reached anonymously because automatic redirects in the RedirectToLogin component fail for components requiring authentication or authorization.

Pages/Shared/Layout. cshtml 파일에서 다음과 같이 변경 합니다.In the Pages/Shared/Layout.cshtml file, make the following changes:

  • Razor태그 도우미와 앱의 구성 요소를 공유 폴더에 사용 하려면 파일의 맨 위에 지시문을 추가 합니다.Add Razor directives to the top of the file to use Tag Helpers and the app's components in the Shared folder:

    @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
    @using {APPLICATION ASSEMBLY}.Shared
    

    {APPLICATION ASSEMBLY} 앱의 어셈블리 이름으로 바꿉니다.Replace {APPLICATION ASSEMBLY} with the app's assembly name.

  • <base>콘텐츠에 태그 및 Blazor 스타일 시트를 추가 <link> 합니다 <head> .Add a <base> tag and Blazor stylesheet <link> to the <head> content:

    <base href="~/" />
    <link rel="stylesheet" href="~/css/site.css" />
    
  • 태그의 내용을 <body> 다음과 같이 변경 합니다.Change the content of the <body> tag to the following:

    <div class="sidebar" style="float:left">
        <component type="typeof(NavMenu_IdentityLayout)" 
            render-mode="ServerPrerendered" />
    </div>
    
    <div class="main" style="padding-left:250px">
        <div class="top-row px-4">
            @{
                var result = Engine.FindView(ViewContext, "_LoginPartial", 
                    isMainPage: false);
            }
            @if (result.Success)
            {
                await Html.RenderPartialAsync("_LoginPartial");
            }
            else
            {
                throw new InvalidOperationException("The default Identity UI " +
                    "layout requires a partial view '_LoginPartial'.");
            }
            <a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a>
        </div>
    
        <div class="content px-4">
            @RenderBody()
        </div>
    </div>
    
    <script src="~/Identity/lib/jquery/dist/jquery.min.js"></script>
    <script src="~/Identity/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
    <script src="~/Identity/js/site.js" asp-append-version="true"></script>
    @RenderSection("Scripts", required: false)
    <script src="_framework/blazor.server.js"></script>
    

Identity Blazor Server 권한 부여를 사용 하 여 프로젝트로 스 캐 폴드Scaffold Identity into a Blazor Server project with authorization

Id 스 캐 폴더를 실행 합니다.Run the Identity scaffolder:

  • 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭 하 > Add > 새 스 캐 폴드 항목추가를 클릭 합니다.From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • 스 캐 폴드 추가 대화 상자의 왼쪽 창에서 id > 추가를 선택 합니다.From the left pane of the Add Scaffold dialog, select Identity > Add.
  • Id 추가 대화 상자에서 원하는 옵션을 선택 합니다.In the Add Identity dialog, select the options you want.
    • 레이아웃 파일을 잘못 된 태그로 덮어쓰지 않도록 기존 레이아웃 페이지를 선택 합니다.Select your existing layout page so your layout file isn't overwritten with incorrect markup. 기존 * _ 레이아웃* 을 선택한 경우에는이 파일을 덮어쓰지 않습니다 .When an existing _Layout.cshtml file is selected, it is not overwritten. 다음은 그 예입니다.For example:
      • ~/Pages/Shared/_Layout.cshtml기존 Razor Pages 인프라를 사용 하는 Razor Pages 또는 Blazor 서버 프로젝트의 경우~/Pages/Shared/_Layout.cshtml for Razor Pages or Blazor Server projects with existing Razor Pages infrastructure
      • ~/Views/Shared/_Layout.cshtml기존 MVC 인프라를 사용 하는 MVC 프로젝트 또는 Blazor 서버 프로젝트의 경우~/Views/Shared/_Layout.cshtml for MVC projects or Blazor Server projects with existing MVC infrastructure
  • 기존 데이터 컨텍스트를 사용 하려면 재정의할 파일을 하나 이상 선택 합니다.To use your existing data context, select at least one file to override. 데이터 컨텍스트를 추가 하려면 파일을 하나 이상 선택 해야 합니다.You must select at least one file to add your data context.
    • 데이터 컨텍스트 클래스를 선택 합니다.Select your data context class.
    • 추가를 선택합니다.Select Add.
  • 새 사용자 컨텍스트를 만들고 Id에 대 한 사용자 지정 사용자 클래스를 만들 수 있습니다.To create a new user context and possibly create a custom user class for Identity:
    • 단추를 선택 + 하 여 새 데이터 컨텍스트 클래스를 만듭니다.Select the + button to create a new Data context class. 기본값을 그대로 적용 하거나 클래스를 지정 합니다 (예: MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
    • 추가를 선택합니다.Select Add.

참고: 새 사용자 컨텍스트를 만드는 경우 재정의할 파일을 선택할 필요가 없습니다.Note: If you're creating a new user context, you don't have to select a file to override.

Id 스 캐 폴더를 실행 합니다.Run the Identity scaffolder:

  • 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭 하 > Add > 새 스 캐 폴드 항목추가를 클릭 합니다.From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • 스 캐 폴드 추가 대화 상자의 왼쪽 창에서 id > 추가를 선택 합니다.From the left pane of the Add Scaffold dialog, select Identity > Add.
  • Id 추가 대화 상자에서 원하는 옵션을 선택 합니다.In the Add Identity dialog, select the options you want.
    • 기존 레이아웃 페이지를 선택 하거나 잘못 된 태그를 사용 하 여 레이아웃 파일을 덮어씁니다.Select your existing layout page, or your layout file will be overwritten with incorrect markup. 기존 * _ 레이아웃* 을 선택한 경우에는이 파일을 덮어쓰지 않습니다 .When an existing _Layout.cshtml file is selected, it is not overwritten. 다음은 그 예입니다.For example:
      • ~/Pages/Shared/_Layout.cshtmlRazor Pages~/Pages/Shared/_Layout.cshtml for Razor Pages
      • ~/Views/Shared/_Layout.cshtmlMVC 프로젝트의 경우~/Views/Shared/_Layout.cshtml for MVC projects
  • 기존 데이터 컨텍스트를 사용 하려면 재정의할 파일을 하나 이상 선택 합니다.To use your existing data context, select at least one file to override. 데이터 컨텍스트를 추가 하려면 파일을 하나 이상 선택 해야 합니다.You must select at least one file to add your data context.
    • 데이터 컨텍스트 클래스를 선택 합니다.Select your data context class.
    • 추가를 선택합니다.Select Add.
  • 새 사용자 컨텍스트를 만들고 Id에 대 한 사용자 지정 사용자 클래스를 만들 수 있습니다.To create a new user context and possibly create a custom user class for Identity:
    • 단추를 선택 + 하 여 새 데이터 컨텍스트 클래스를 만듭니다.Select the + button to create a new Data context class. 기본값을 그대로 적용 하거나 클래스를 지정 합니다 (예: MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
    • 추가를 선택합니다.Select Add.

참고: 새 사용자 컨텍스트를 만드는 경우 재정의할 파일을 선택할 필요가 없습니다.Note: If you're creating a new user context, you don't have to select a file to override.

일부 Identity 옵션은 영역/ Identity / Identity HostingStartup.cs구성 됩니다.Some Identity options are configured in Areas/Identity/IdentityHostingStartup.cs. 자세한 내용은 IHostingStartup를 참조 하세요.For more information, see IHostingStartup.

전체 Identity UI 원본 만들기Create full Identity UI source

UI에 대 한 모든 권한을 유지 하려면 Identity 스 캐 폴더을 실행 하 Identity 고 모든 파일 재정의를 선택 합니다.To maintain full control of the Identity UI, run the Identity scaffolder and select Override all files.

다음 강조 표시 된 코드는 Identity Identity ASP.NET Core 2.1 웹 앱에서 기본 UI를 바꿀 변경 내용을 보여 줍니다.The following highlighted code shows the changes to replace the default Identity UI with Identity in an ASP.NET Core 2.1 web app. 이 작업을 수행 하 여 UI에 대 한 모든 권한을 부여할 수 있습니다 Identity .You might want to do this to have full control of the Identity UI.

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.AddIdentity<IdentityUser, IdentityRole>()
        // services.AddDefaultIdentity<IdentityUser>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
        .AddRazorPagesOptions(options =>
        {
            options.AllowAreas = true;
            options.Conventions.AuthorizeAreaFolder("Identity", "/Account/Manage");
            options.Conventions.AuthorizeAreaPage("Identity", "/Account/Logout");
        });

    services.ConfigureApplicationCookie(options =>
    {
        options.LoginPath = $"/Identity/Account/Login";
        options.LogoutPath = $"/Identity/Account/Logout";
        options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
    });

    // using Microsoft.AspNetCore.Identity.UI.Services;
    services.AddSingleton<IEmailSender, EmailSender>();
}

기본값은 Identity 다음 코드에서 대체 됩니다.The default Identity is replaced in the following code:

services.AddIdentity<IdentityUser, IdentityRole>()
    // services.AddDefaultIdentity<IdentityUser>()
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();

다음 코드에서는 LoginPath, LogoutpathAccessDeniedPath를 설정 합니다.The following code sets the LoginPath, LogoutPath, and AccessDeniedPath:

services.ConfigureApplicationCookie(options =>
{
    options.LoginPath = $"/Identity/Account/Login";
    options.LogoutPath = $"/Identity/Account/Logout";
    options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
});

구현을 등록 IEmailSender 합니다. 예를 들면 다음과 같습니다.Register an IEmailSender implementation, for example:

// using Microsoft.AspNetCore.Identity.UI.Services;
services.AddSingleton<IEmailSender, EmailSender>();
public class EmailSender : IEmailSender
{
    public Task SendEmailAsync(string email, string subject, string message)
    {
        return Task.CompletedTask;
    }
}

암호 구성Password configuration

PasswordOptions이에서 구성 된 경우 Startup.ConfigureServices 스 캐 폴드 pages의 속성에 대 한 [StringLength] 특성 구성이 필요할 수 있습니다 Password Identity .If PasswordOptions are configured in Startup.ConfigureServices, [StringLength] attribute configuration might be required for the Password property in scaffolded Identity pages. InputModel``Password속성은 다음 파일에 있습니다.InputModel Password properties are found in the following files:

  • Areas/Identity/Pages/Account/Register.cshtml.cs
  • Areas/Identity/Pages/Account/ResetPassword.cshtml.cs

페이지 사용 안 함Disable a page

이 섹션에서는 등록 페이지를 사용 하지 않도록 설정 하는 방법을 보여 주지만,이 방법을 사용 하 여 페이지를 비활성화할 수 있습니다.This sections show how to disable the register page but the approach can be used to disable any page.

사용자 등록을 사용 하지 않도록 설정 하려면:To disable user registration:

  • 스 캐 폴드 Identity .Scaffold Identity. Account. Register, Account. Login 및 Account. RegisterConfirmation 같이 포함 됩니다.Include Account.Register, Account.Login, and Account.RegisterConfirmation. 예를 들어:For example:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • 사용자가이 끝점에서 등록할 수 없도록 영역/ Identity /Pages/Account/Register.cshtml.cs 를 업데이트 합니다.Update Areas/Identity/Pages/Account/Register.cshtml.cs so users can't register from this endpoint:

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • 이전 변경 내용과 일치 하도록 영역/ Identity /Pages/Account/Register.cshtml 를 업데이트 합니다.Update Areas/Identity/Pages/Account/Register.cshtml to be consistent with the preceding changes:

    @page
    @model RegisterModel
    @{
        ViewData["Title"] = "Go to Login";
    }
    
    <h1>@ViewData["Title"]</h1>
    
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
    </li>
    
  • 영역/ Identity /Pages/Account/Login.cshtml 에서 등록 링크를 주석으로 처리 하거나 제거 합니다.Comment out or remove the registration link from Areas/Identity/Pages/Account/Login.cshtml

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  • 영역/ Identity /Pages/Account/RegisterConfirmation 페이지를 업데이트 합니다.Update the Areas/Identity/Pages/Account/RegisterConfirmation page.

    • Cshtml 파일에서 코드 및 링크를 제거 합니다.Remove the code and links from the cshtml file.
    • 에서 확인 코드를 제거 합니다 PageModel .Remove the confirmation code from the PageModel:
    [AllowAnonymous]
      public class RegisterConfirmationModel : PageModel
      {
          public IActionResult OnGet()
          {  
              return Page();
          }
      }
    

다른 앱을 사용 하 여 사용자 추가Use another app to add users

웹 앱 외부에 사용자를 추가 하는 메커니즘을 제공 합니다.Provide a mechanism to add users outside the web app. 사용자를 추가 하는 옵션은 다음과 같습니다.Options to add users include:

  • 전용 관리 웹 앱입니다.A dedicated admin web app.
  • 콘솔 앱입니다.A console app.

다음 코드에서는 사용자를 추가 하는 한 가지 방법을 간략하게 설명 합니다.The following code outlines one approach to adding users:

  • 사용자 목록을 메모리로 읽습니다.A list of users is read into memory.
  • 각 사용자에 대해 강력한 고유 암호가 생성 됩니다.A strong unique password is generated for each user.
  • 사용자가 데이터베이스에 추가 됩니다 Identity .The user is added to the Identity database.
  • 사용자에 게 알림이 표시 되 고 암호를 변경 하 라는 메시지가 표시 됩니다.The user is notified and told to change the password.
public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();

        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;

            try
            {
                var context = services.GetRequiredService<AppDbCntx>();
                context.Database.Migrate();

                var config = host.Services.GetRequiredService<IConfiguration>();
                var userList = config.GetSection("userList").Get<List<string>>();

                SeedData.Initialize(services, userList).Wait();
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred adding users.");
            }
        }

        host.Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

다음 코드에서는 사용자를 추가 하는 방법을 설명 합니다.The following code outlines adding a user:


public static async Task Initialize(IServiceProvider serviceProvider,
                                    List<string> userList)
{
    var userManager = serviceProvider.GetService<UserManager<IdentityUser>>();

    foreach (var userName in userList)
    {
        var userPassword = GenerateSecurePassword();
        var userId = await EnsureUser(userManager, userName, userPassword);

        NotifyUser(userName, userPassword);
    }
}

private static async Task<string> EnsureUser(UserManager<IdentityUser> userManager,
                                             string userName, string userPassword)
{
    var user = await userManager.FindByNameAsync(userName);

    if (user == null)
    {
        user = new IdentityUser(userName)
        {
            EmailConfirmed = true
        };
        await userManager.CreateAsync(user, userPassword);
    }

    return user.Id;
}

프로덕션 시나리오의 경우 유사한 접근 방식을 사용할 수 있습니다.A similar approach can be followed for production scenarios.

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

정적 Identity 자산을 웹 루트에 게시 하지 않으려면를 참조 하십시오 ASP.NET Core 소개 Identity .To prevent publishing static Identity assets to the web root, see ASP.NET Core 소개 Identity.

추가 자료Additional resources

ASP.NET Core 2.1 이상에서는 ASP.NET Core Identity Razor 클래스 라이브러리로제공 합니다.ASP.NET Core 2.1 and later provides ASP.NET Core Identity as a Razor Class Library. 를 포함 하는 응용 프로그램 Identity 은 스 캐 폴더를 적용 하 여 Identity Razor 클래스 라이브러리 (rcl)에 포함 된 소스 코드를 선택적으로 추가할 수 있습니다.Applications that include Identity can apply the scaffolder to selectively add the source code contained in the Identity Razor Class Library (RCL). 코드를 수정하고 동작을 변경할 수 있도록 소스 코드를 생성할 수 있습니다.You might want to generate source code so you can modify the code and change the behavior. 예를 들어 등록에 사용된 코드를 생성하도록 스캐폴더를 지정할 수 있습니다.For example, you could instruct the scaffolder to generate the code used in registration. 생성된 코드는 Identity RCL의 동일한 코드보다 우선합니다.Generated code takes precedence over the same code in the Identity RCL. 기본 RCL을 사용 하지 않고 UI에 대 한 모든 권한을 얻으려면 전체 ID UI 원본 만들기섹션을 참조 하세요.To gain full control of the UI and not use the default RCL, see the section Create full identity UI source.

인증을 포함 하지 않는 응용 프로그램은 스 캐 폴더를 적용 하 여 rcl 패키지를 추가할 수 있습니다 Identity .Applications that do not include authentication can apply the scaffolder to add the RCL Identity package. 선택한 Identity 코드의 옵션이 생성되어야 합니다.You have the option of selecting Identity code to be generated.

스 캐 폴더는 대부분의 필요한 코드를 생성 하지만 프로세스를 완료 하려면 프로젝트를 업데이트 해야 합니다.Although the scaffolder generates most of the necessary code, you'll have to update your project to complete the process. 이 문서에서는 Identity 스 캐 폴딩 업데이트를 완료 하는 데 필요한 단계를 설명 합니다.This document explains the steps needed to complete an Identity scaffolding update.

스 캐 폴더를 Identity 실행 하면 프로젝트 디렉터리에 ScaffoldingReadme.txt 파일이 만들어집니다.When the Identity scaffolder is run, a ScaffoldingReadme.txt file is created in the project directory. ScaffoldingReadme.txt 파일은 Identity 스 캐 폴딩 업데이트를 완료 하는 데 필요한 사항에 대 한 일반적인 지침을 포함 합니다.The ScaffoldingReadme.txt file contains general instructions on what's needed to complete the Identity scaffolding update. 이 문서에는 ScaffoldingReadme.txt 파일 보다 더 완전 한 지침이 포함 되어 있습니다.This document contains more complete instructions than the ScaffoldingReadme.txt file.

파일 차이를 표시 하는 소스 제어 시스템을 사용 하 여 변경 내용을 되돌릴 수 있도록 하는 것이 좋습니다.We recommend using a source control system that shows file differences and allows you to back out of changes. 스 캐 폴더를 실행 한 후에 변경 내용을 검사 합니다 Identity .Inspect the changes after running the Identity scaffolder.

참고

서비스는 두 가지 요소 인증, 계정 확인 및 암호 복구및 기타 보안 기능을 사용 하는 경우에 필요 Identity 합니다.Services are required when using Two Factor Authentication, Account confirmation and password recovery, and other security features with Identity. 스 캐 폴딩 할 때 서비스 또는 서비스 스텁이 생성 되지 않습니다 Identity .Services or service stubs aren't generated when scaffolding Identity. 이러한 기능을 사용 하도록 설정 하는 서비스는 수동으로 추가 해야 합니다.Services to enable these features must be added manually. 예를 들어 전자 메일 확인 필요를 참조 하세요.For example, see Require Email Confirmation.

Identity빈 프로젝트로 스 캐 폴드Scaffold Identity into an empty project

Id 스 캐 폴더를 실행 합니다.Run the Identity scaffolder:

  • 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭 하 > Add > 새 스 캐 폴드 항목추가를 클릭 합니다.From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • 새 스 캐 폴드 항목 추가 대화 상자의 왼쪽 창에서 id > 추가를 선택 합니다.From the left pane of the Add New Scaffolded Item dialog, select Identity > Add.
  • Id 추가 대화 상자에서 원하는 옵션을 선택 합니다.In the Add Identity dialog, select the options you want.
    • 기존 레이아웃 페이지를 선택 하거나 잘못 된 태그를 사용 하 여 레이아웃 파일을 덮어씁니다.Select your existing layout page, or your layout file will be overwritten with incorrect markup:
      • ~/Pages/Shared/_Layout.cshtmlRazor Pages~/Pages/Shared/_Layout.cshtml for Razor Pages
      • ~/Views/Shared/_Layout.cshtmlMVC 프로젝트의 경우~/Views/Shared/_Layout.cshtml for MVC projects
      • Blazor 서버 템플릿 ()에서 만든 Blazor 서버 앱은 blazorserver 기본적으로 Razor Pages 또는 MVC에 대해 구성 되지 않습니다.Blazor Server apps created from the Blazor Server template (blazorserver) aren't configured for Razor Pages or MVC by default. 레이아웃 페이지 항목을 비워 둡니다.Leave the layout page entry blank.
    • 단추를 선택 + 하 여 새 데이터 컨텍스트 클래스를 만듭니다.Select the + button to create a new Data context class. 기본값을 그대로 적용 하거나 클래스를 지정 합니다 (예: MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
  • 추가를 선택합니다.Select Add.

클래스에 다음의 강조 표시 된 호출을 추가 합니다 Startup .Add the following highlighted calls to the Startup class:

public class Startup
{        
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

    // 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();
        }
        else
        {
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseAuthentication();
        app.UseMvc();
    }
}

UseHsts권장 되지만 필수는 아닙니다.UseHsts is recommended but not required. 자세한 내용은 HTTP 엄격한 전송 보안 프로토콜을 참조 하세요.For more information, see HTTP Strict Transport Security Protocol.

생성 된 Id 데이터베이스 코드에는 Entity Framework Core 마이그레이션이필요 합니다.The generated Identity database code requires Entity Framework Core Migrations. 마이그레이션을 만들고 데이터베이스를 업데이트 합니다.Create a migration and update the database. 예를 들어 다음 명령을 실행합니다.For example, run the following commands:

Visual Studio 패키지 관리자 콘솔에서 다음을 수행 합니다.In the Visual Studio Package Manager Console:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

Add-Migration 명령에 대 한 "CreateIdentitySchema" name 매개 변수는 임의입니다.The "CreateIdentitySchema" name parameter for the Add-Migration command is arbitrary. "CreateIdentitySchema" 마이그레이션에 대해 설명 합니다."CreateIdentitySchema" describes the migration.

Identity Razor 기존 권한 부여 없이 프로젝트에 스 캐 폴드Scaffold Identity into a Razor project without existing authorization

Id 스 캐 폴더를 실행 합니다.Run the Identity scaffolder:

  • 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭 하 > Add > 새 스 캐 폴드 항목추가를 클릭 합니다.From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • 새 스 캐 폴드 항목 추가 대화 상자의 왼쪽 창에서 id > 추가를 선택 합니다.From the left pane of the Add New Scaffolded Item dialog, select Identity > Add.
  • Id 추가 대화 상자에서 원하는 옵션을 선택 합니다.In the Add Identity dialog, select the options you want.
    • 기존 레이아웃 페이지를 선택 하거나 잘못 된 태그를 사용 하 여 레이아웃 파일을 덮어씁니다.Select your existing layout page, or your layout file will be overwritten with incorrect markup:
      • ~/Pages/Shared/_Layout.cshtmlRazor Pages~/Pages/Shared/_Layout.cshtml for Razor Pages
      • ~/Views/Shared/_Layout.cshtmlMVC 프로젝트의 경우~/Views/Shared/_Layout.cshtml for MVC projects
      • Blazor 서버 템플릿 ()에서 만든 Blazor 서버 앱은 blazorserver 기본적으로 Razor Pages 또는 MVC에 대해 구성 되지 않습니다.Blazor Server apps created from the Blazor Server template (blazorserver) aren't configured for Razor Pages or MVC by default. 레이아웃 페이지 항목을 비워 둡니다.Leave the layout page entry blank.
    • 단추를 선택 + 하 여 새 데이터 컨텍스트 클래스를 만듭니다.Select the + button to create a new Data context class. 기본값을 그대로 적용 하거나 클래스를 지정 합니다 (예: MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
  • 추가를 선택합니다.Select Add.

Identity영역/ Identity / Identity HostingStartup.cs에서 구성 됩니다. is configured in Areas/Identity/IdentityHostingStartup.cs. 자세한 내용은 IHostingStartup를 참조 하세요.For more information, see IHostingStartup.

마이그레이션, UseAuthentication 및 레이아웃Migrations, UseAuthentication, and layout

생성 된 Id 데이터베이스 코드에는 Entity Framework Core 마이그레이션이필요 합니다.The generated Identity database code requires Entity Framework Core Migrations. 마이그레이션을 만들고 데이터베이스를 업데이트 합니다.Create a migration and update the database. 예를 들어 다음 명령을 실행합니다.For example, run the following commands:

Visual Studio 패키지 관리자 콘솔에서 다음을 수행 합니다.In the Visual Studio Package Manager Console:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

Add-Migration 명령에 대 한 "CreateIdentitySchema" name 매개 변수는 임의입니다.The "CreateIdentitySchema" name parameter for the Add-Migration command is arbitrary. "CreateIdentitySchema" 마이그레이션에 대해 설명 합니다."CreateIdentitySchema" describes the migration.

인증 사용Enable authentication

Configure클래스의 메서드에서 다음 Startup 이후에 useauthentication 을 호출 합니다 UseStaticFiles .In the Configure method of the Startup class, call UseAuthentication after UseStaticFiles:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

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

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

        app.UseMvc();
    }
}

UseHsts권장 되지만 필수는 아닙니다.UseHsts is recommended but not required. 자세한 내용은 HTTP 엄격한 전송 보안 프로토콜을 참조 하세요.For more information, see HTTP Strict Transport Security Protocol.

레이아웃 변경Layout changes

선택 사항: 로그인 부분 ( _LoginPartial )을 레이아웃 파일에 추가 합니다.Optional: Add the login partial (_LoginPartial) to the layout file:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - RazorNoAuth8</title>

    <environment include="Development">
        <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
        <link rel="stylesheet" href="~/css/site.css" />
    </environment>
    <environment exclude="Development">
        <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"
              asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
              asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
        <link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
    </environment>
</head>
<body>
    <nav class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a asp-page="/Index" class="navbar-brand">RazorNoAuth8</a>
            </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li><a asp-page="/Index">Home</a></li>
                    <li><a asp-page="/About">About</a></li>
                    <li><a asp-page="/Contact">Contact</a></li>
                </ul>
                <partial name="_LoginPartial" />
            </div>
        </div>
    </nav>

    <partial name="_CookieConsentPartial" />

    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <p>&copy; 2018 - RazorNoAuth8</p>
        </footer>
    </div>

    <environment include="Development">
        <script src="~/lib/jquery/dist/jquery.js"></script>
        <script src="~/lib/bootstrap/dist/js/bootstrap.js"></script>
        <script src="~/js/site.js" asp-append-version="true"></script>
    </environment>
    <environment exclude="Development">
        <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.3.1.min.js"
                asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
                asp-fallback-test="window.jQuery"
                crossorigin="anonymous"
                integrity="sha384-K+ctZQ+LL8q6tP7I94W+qzQsfRV2a+AfHIi9k8z8l9ggpc8X+Ytst4yBo/hH+8Fk">
        </script>
        <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/bootstrap.min.js"
                asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js"
                asp-fallback-test="window.jQuery && window.jQuery.fn && window.jQuery.fn.modal"
                crossorigin="anonymous"
                integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa">
        </script>
        <script src="~/js/site.min.js" asp-append-version="true"></script>
    </environment>

    @RenderSection("Scripts", required: false)
</body>
</html>

Identity Razor 권한 부여를 사용 하 여 프로젝트로 스 캐 폴드Scaffold Identity into a Razor project with authorization

Id 스 캐 폴더를 실행 합니다.Run the Identity scaffolder:

  • 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭 하 > Add > 새 스 캐 폴드 항목추가를 클릭 합니다.From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • 스 캐 폴드 추가 대화 상자의 왼쪽 창에서 id > 추가를 선택 합니다.From the left pane of the Add Scaffold dialog, select Identity > Add.
  • Id 추가 대화 상자에서 원하는 옵션을 선택 합니다.In the Add Identity dialog, select the options you want.
    • 레이아웃 파일을 잘못 된 태그로 덮어쓰지 않도록 기존 레이아웃 페이지를 선택 합니다.Select your existing layout page so your layout file isn't overwritten with incorrect markup. 기존 * _ 레이아웃* 을 선택한 경우에는이 파일을 덮어쓰지 않습니다 .When an existing _Layout.cshtml file is selected, it is not overwritten. 다음은 그 예입니다.For example:
      • ~/Pages/Shared/_Layout.cshtml기존 Razor Pages 인프라를 사용 하는 Razor Pages 또는 Blazor 서버 프로젝트의 경우~/Pages/Shared/_Layout.cshtml for Razor Pages or Blazor Server projects with existing Razor Pages infrastructure
      • ~/Views/Shared/_Layout.cshtml기존 MVC 인프라를 사용 하는 MVC 프로젝트 또는 Blazor 서버 프로젝트의 경우~/Views/Shared/_Layout.cshtml for MVC projects or Blazor Server projects with existing MVC infrastructure
  • 기존 데이터 컨텍스트를 사용 하려면 재정의할 파일을 하나 이상 선택 합니다.To use your existing data context, select at least one file to override. 데이터 컨텍스트를 추가 하려면 파일을 하나 이상 선택 해야 합니다.You must select at least one file to add your data context.
    • 데이터 컨텍스트 클래스를 선택 합니다.Select your data context class.
    • 추가를 선택합니다.Select Add.
  • 새 사용자 컨텍스트를 만들고 Id에 대 한 사용자 지정 사용자 클래스를 만들 수 있습니다.To create a new user context and possibly create a custom user class for Identity:
    • 단추를 선택 + 하 여 새 데이터 컨텍스트 클래스를 만듭니다.Select the + button to create a new Data context class. 기본값을 그대로 적용 하거나 클래스를 지정 합니다 (예: MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
    • 추가를 선택합니다.Select Add.

참고: 새 사용자 컨텍스트를 만드는 경우 재정의할 파일을 선택할 필요가 없습니다.Note: If you're creating a new user context, you don't have to select a file to override.

Id 스 캐 폴더를 실행 합니다.Run the Identity scaffolder:

  • 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭 하 > Add > 새 스 캐 폴드 항목추가를 클릭 합니다.From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • 스 캐 폴드 추가 대화 상자의 왼쪽 창에서 id > 추가를 선택 합니다.From the left pane of the Add Scaffold dialog, select Identity > Add.
  • Id 추가 대화 상자에서 원하는 옵션을 선택 합니다.In the Add Identity dialog, select the options you want.
    • 기존 레이아웃 페이지를 선택 하거나 잘못 된 태그를 사용 하 여 레이아웃 파일을 덮어씁니다.Select your existing layout page, or your layout file will be overwritten with incorrect markup. 기존 * _ 레이아웃* 을 선택한 경우에는이 파일을 덮어쓰지 않습니다 .When an existing _Layout.cshtml file is selected, it is not overwritten. 다음은 그 예입니다.For example:
      • ~/Pages/Shared/_Layout.cshtmlRazor Pages~/Pages/Shared/_Layout.cshtml for Razor Pages
      • ~/Views/Shared/_Layout.cshtmlMVC 프로젝트의 경우~/Views/Shared/_Layout.cshtml for MVC projects
  • 기존 데이터 컨텍스트를 사용 하려면 재정의할 파일을 하나 이상 선택 합니다.To use your existing data context, select at least one file to override. 데이터 컨텍스트를 추가 하려면 파일을 하나 이상 선택 해야 합니다.You must select at least one file to add your data context.
    • 데이터 컨텍스트 클래스를 선택 합니다.Select your data context class.
    • 추가를 선택합니다.Select Add.
  • 새 사용자 컨텍스트를 만들고 Id에 대 한 사용자 지정 사용자 클래스를 만들 수 있습니다.To create a new user context and possibly create a custom user class for Identity:
    • 단추를 선택 + 하 여 새 데이터 컨텍스트 클래스를 만듭니다.Select the + button to create a new Data context class. 기본값을 그대로 적용 하거나 클래스를 지정 합니다 (예: MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
    • 추가를 선택합니다.Select Add.

참고: 새 사용자 컨텍스트를 만드는 경우 재정의할 파일을 선택할 필요가 없습니다.Note: If you're creating a new user context, you don't have to select a file to override.

일부 Identity 옵션은 영역/ Identity / Identity HostingStartup.cs구성 됩니다.Some Identity options are configured in Areas/Identity/IdentityHostingStartup.cs. 자세한 내용은 IHostingStartup를 참조 하세요.For more information, see IHostingStartup.

Identity기존 권한 부여 없이 MVC 프로젝트에 스 캐 폴드Scaffold Identity into an MVC project without existing authorization

Id 스 캐 폴더를 실행 합니다.Run the Identity scaffolder:

  • 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭 하 > Add > 새 스 캐 폴드 항목추가를 클릭 합니다.From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • 새 스 캐 폴드 항목 추가 대화 상자의 왼쪽 창에서 id > 추가를 선택 합니다.From the left pane of the Add New Scaffolded Item dialog, select Identity > Add.
  • Id 추가 대화 상자에서 원하는 옵션을 선택 합니다.In the Add Identity dialog, select the options you want.
    • 기존 레이아웃 페이지를 선택 하거나 잘못 된 태그를 사용 하 여 레이아웃 파일을 덮어씁니다.Select your existing layout page, or your layout file will be overwritten with incorrect markup:
      • ~/Pages/Shared/_Layout.cshtmlRazor Pages~/Pages/Shared/_Layout.cshtml for Razor Pages
      • ~/Views/Shared/_Layout.cshtmlMVC 프로젝트의 경우~/Views/Shared/_Layout.cshtml for MVC projects
      • Blazor 서버 템플릿 ()에서 만든 Blazor 서버 앱은 blazorserver 기본적으로 Razor Pages 또는 MVC에 대해 구성 되지 않습니다.Blazor Server apps created from the Blazor Server template (blazorserver) aren't configured for Razor Pages or MVC by default. 레이아웃 페이지 항목을 비워 둡니다.Leave the layout page entry blank.
    • 단추를 선택 + 하 여 새 데이터 컨텍스트 클래스를 만듭니다.Select the + button to create a new Data context class. 기본값을 그대로 적용 하거나 클래스를 지정 합니다 (예: MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
  • 추가를 선택합니다.Select Add.

선택 사항: _LoginPartial Views/Shared/_Layout cshtml 파일에 로그인 부분 ()을 추가 합니다.Optional: Add the login partial (_LoginPartial) to the Views/Shared/_Layout.cshtml file:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - MvcNoAuth3</title>

    <environment include="Development">
        <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
        <link rel="stylesheet" href="~/css/site.css" />
    </environment>
    <environment exclude="Development">
        <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"
              asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
              asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
        <link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
    </environment>
</head>
<body>
    <nav class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a asp-area="" asp-controller="Home" asp-action="Index" class="navbar-brand">MvcNoAuth3</a>
            </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li><a asp-area="" asp-controller="Home" asp-action="Index">Home</a></li>
                    <li><a asp-area="" asp-controller="Home" asp-action="About">About</a></li>
                    <li><a asp-area="" asp-controller="Home" asp-action="Contact">Contact</a></li>
                </ul>
                <partial name="_LoginPartial" />
            </div>
        </div>
    </nav>

    <partial name="_CookieConsentPartial" />

    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <p>&copy; 2018 - MvcNoAuth3</p>
        </footer>
    </div>

    <environment include="Development">
        <script src="~/lib/jquery/dist/jquery.js"></script>
        <script src="~/lib/bootstrap/dist/js/bootstrap.js"></script>
        <script src="~/js/site.js" asp-append-version="true"></script>
    </environment>
    <environment exclude="Development">
        <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.3.1.min.js"
                asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
                asp-fallback-test="window.jQuery"
                crossorigin="anonymous"
                integrity="sha384-K+ctZQ+LL8q6tP7I94W+qzQsfRV2a+AfHIi9k8z8l9ggpc8X+Ytst4yBo/hH+8Fk">
        </script>
        <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/bootstrap.min.js"
                asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js"
                asp-fallback-test="window.jQuery && window.jQuery.fn && window.jQuery.fn.modal"
                crossorigin="anonymous"
                integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa">
        </script>
        <script src="~/js/site.min.js" asp-append-version="true"></script>
    </environment>

    @RenderSection("Scripts", required: false)
</body>
</html>
  • Pages/shared/_LoginPartial cshtml 파일을 Views/shared/_LoginPartial로 이동 합니다.Move the Pages/Shared/_LoginPartial.cshtml file to Views/Shared/_LoginPartial.cshtml

Identity영역/ Identity / Identity HostingStartup.cs에서 구성 됩니다. is configured in Areas/Identity/IdentityHostingStartup.cs. 자세한 내용은 IHostingStartup를 참조 하세요.For more information, see IHostingStartup.

생성 된 Id 데이터베이스 코드에는 Entity Framework Core 마이그레이션이필요 합니다.The generated Identity database code requires Entity Framework Core Migrations. 마이그레이션을 만들고 데이터베이스를 업데이트 합니다.Create a migration and update the database. 예를 들어 다음 명령을 실행합니다.For example, run the following commands:

Visual Studio 패키지 관리자 콘솔에서 다음을 수행 합니다.In the Visual Studio Package Manager Console:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

Add-Migration 명령에 대 한 "CreateIdentitySchema" name 매개 변수는 임의입니다.The "CreateIdentitySchema" name parameter for the Add-Migration command is arbitrary. "CreateIdentitySchema" 마이그레이션에 대해 설명 합니다."CreateIdentitySchema" describes the migration.

다음 이후에 Useauthentication 호출 UseStaticFiles :Call UseAuthentication after UseStaticFiles:

public class Startup
{

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

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

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseAuthentication();
        app.UseMvcWithDefaultRoute();
    }
}

UseHsts권장 되지만 필수는 아닙니다.UseHsts is recommended but not required. 자세한 내용은 HTTP 엄격한 전송 보안 프로토콜을 참조 하세요.For more information, see HTTP Strict Transport Security Protocol.

Identity권한 부여를 사용 하 여 MVC 프로젝트로 스 캐 폴드Scaffold Identity into an MVC project with authorization

Id 스 캐 폴더를 실행 합니다.Run the Identity scaffolder:

  • 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭 하 > Add > 새 스 캐 폴드 항목추가를 클릭 합니다.From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • 스 캐 폴드 추가 대화 상자의 왼쪽 창에서 id > 추가를 선택 합니다.From the left pane of the Add Scaffold dialog, select Identity > Add.
  • Id 추가 대화 상자에서 원하는 옵션을 선택 합니다.In the Add Identity dialog, select the options you want.
    • 레이아웃 파일을 잘못 된 태그로 덮어쓰지 않도록 기존 레이아웃 페이지를 선택 합니다.Select your existing layout page so your layout file isn't overwritten with incorrect markup. 기존 * _ 레이아웃* 을 선택한 경우에는이 파일을 덮어쓰지 않습니다 .When an existing _Layout.cshtml file is selected, it is not overwritten. 다음은 그 예입니다.For example:
      • ~/Pages/Shared/_Layout.cshtml기존 Razor Pages 인프라를 사용 하는 Razor Pages 또는 Blazor 서버 프로젝트의 경우~/Pages/Shared/_Layout.cshtml for Razor Pages or Blazor Server projects with existing Razor Pages infrastructure
      • ~/Views/Shared/_Layout.cshtml기존 MVC 인프라를 사용 하는 MVC 프로젝트 또는 Blazor 서버 프로젝트의 경우~/Views/Shared/_Layout.cshtml for MVC projects or Blazor Server projects with existing MVC infrastructure
  • 기존 데이터 컨텍스트를 사용 하려면 재정의할 파일을 하나 이상 선택 합니다.To use your existing data context, select at least one file to override. 데이터 컨텍스트를 추가 하려면 파일을 하나 이상 선택 해야 합니다.You must select at least one file to add your data context.
    • 데이터 컨텍스트 클래스를 선택 합니다.Select your data context class.
    • 추가를 선택합니다.Select Add.
  • 새 사용자 컨텍스트를 만들고 Id에 대 한 사용자 지정 사용자 클래스를 만들 수 있습니다.To create a new user context and possibly create a custom user class for Identity:
    • 단추를 선택 + 하 여 새 데이터 컨텍스트 클래스를 만듭니다.Select the + button to create a new Data context class. 기본값을 그대로 적용 하거나 클래스를 지정 합니다 (예: MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
    • 추가를 선택합니다.Select Add.

참고: 새 사용자 컨텍스트를 만드는 경우 재정의할 파일을 선택할 필요가 없습니다.Note: If you're creating a new user context, you don't have to select a file to override.

Id 스 캐 폴더를 실행 합니다.Run the Identity scaffolder:

  • 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭 하 > Add > 새 스 캐 폴드 항목추가를 클릭 합니다.From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • 스 캐 폴드 추가 대화 상자의 왼쪽 창에서 id > 추가를 선택 합니다.From the left pane of the Add Scaffold dialog, select Identity > Add.
  • Id 추가 대화 상자에서 원하는 옵션을 선택 합니다.In the Add Identity dialog, select the options you want.
    • 기존 레이아웃 페이지를 선택 하거나 잘못 된 태그를 사용 하 여 레이아웃 파일을 덮어씁니다.Select your existing layout page, or your layout file will be overwritten with incorrect markup. 기존 * _ 레이아웃* 을 선택한 경우에는이 파일을 덮어쓰지 않습니다 .When an existing _Layout.cshtml file is selected, it is not overwritten. 다음은 그 예입니다.For example:
      • ~/Pages/Shared/_Layout.cshtmlRazor Pages~/Pages/Shared/_Layout.cshtml for Razor Pages
      • ~/Views/Shared/_Layout.cshtmlMVC 프로젝트의 경우~/Views/Shared/_Layout.cshtml for MVC projects
  • 기존 데이터 컨텍스트를 사용 하려면 재정의할 파일을 하나 이상 선택 합니다.To use your existing data context, select at least one file to override. 데이터 컨텍스트를 추가 하려면 파일을 하나 이상 선택 해야 합니다.You must select at least one file to add your data context.
    • 데이터 컨텍스트 클래스를 선택 합니다.Select your data context class.
    • 추가를 선택합니다.Select Add.
  • 새 사용자 컨텍스트를 만들고 Id에 대 한 사용자 지정 사용자 클래스를 만들 수 있습니다.To create a new user context and possibly create a custom user class for Identity:
    • 단추를 선택 + 하 여 새 데이터 컨텍스트 클래스를 만듭니다.Select the + button to create a new Data context class. 기본값을 그대로 적용 하거나 클래스를 지정 합니다 (예: MyApplication.Data.ApplicationDbContext ).Accept the default value or specify a class (for example, MyApplication.Data.ApplicationDbContext).
    • 추가를 선택합니다.Select Add.

참고: 새 사용자 컨텍스트를 만드는 경우 재정의할 파일을 선택할 필요가 없습니다.Note: If you're creating a new user context, you don't have to select a file to override.

Pages/Shared 폴더와 해당 폴더의 파일을 삭제 합니다.Delete the Pages/Shared folder and the files in that folder.

전체 Identity UI 원본 만들기Create full Identity UI source

UI에 대 한 모든 권한을 유지 하려면 Identity 스 캐 폴더을 실행 하 Identity 고 모든 파일 재정의를 선택 합니다.To maintain full control of the Identity UI, run the Identity scaffolder and select Override all files.

다음 강조 표시 된 코드는 Identity Identity ASP.NET Core 2.1 웹 앱에서 기본 UI를 바꿀 변경 내용을 보여 줍니다.The following highlighted code shows the changes to replace the default Identity UI with Identity in an ASP.NET Core 2.1 web app. 이 작업을 수행 하 여 UI에 대 한 모든 권한을 부여할 수 있습니다 Identity .You might want to do this to have full control of the Identity UI.

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.AddIdentity<IdentityUser, IdentityRole>()
        // services.AddDefaultIdentity<IdentityUser>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
        .AddRazorPagesOptions(options =>
        {
            options.AllowAreas = true;
            options.Conventions.AuthorizeAreaFolder("Identity", "/Account/Manage");
            options.Conventions.AuthorizeAreaPage("Identity", "/Account/Logout");
        });

    services.ConfigureApplicationCookie(options =>
    {
        options.LoginPath = $"/Identity/Account/Login";
        options.LogoutPath = $"/Identity/Account/Logout";
        options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
    });

    // using Microsoft.AspNetCore.Identity.UI.Services;
    services.AddSingleton<IEmailSender, EmailSender>();
}

기본값은 Identity 다음 코드에서 대체 됩니다.The default Identity is replaced in the following code:

services.AddIdentity<IdentityUser, IdentityRole>()
    // services.AddDefaultIdentity<IdentityUser>()
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();

다음 코드에서는 LoginPath, LogoutpathAccessDeniedPath를 설정 합니다.The following code sets the LoginPath, LogoutPath, and AccessDeniedPath:

services.ConfigureApplicationCookie(options =>
{
    options.LoginPath = $"/Identity/Account/Login";
    options.LogoutPath = $"/Identity/Account/Logout";
    options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
});

구현을 등록 IEmailSender 합니다. 예를 들면 다음과 같습니다.Register an IEmailSender implementation, for example:

// using Microsoft.AspNetCore.Identity.UI.Services;
services.AddSingleton<IEmailSender, EmailSender>();
public class EmailSender : IEmailSender
{
    public Task SendEmailAsync(string email, string subject, string message)
    {
        return Task.CompletedTask;
    }
}

암호 구성Password configuration

PasswordOptions이에서 구성 된 경우 Startup.ConfigureServices 스 캐 폴드 pages의 속성에 대 한 [StringLength] 특성 구성이 필요할 수 있습니다 Password Identity .If PasswordOptions are configured in Startup.ConfigureServices, [StringLength] attribute configuration might be required for the Password property in scaffolded Identity pages. InputModel``Password속성은 다음 파일에 있습니다.InputModel Password properties are found in the following files:

  • Areas/Identity/Pages/Account/Register.cshtml.cs
  • Areas/Identity/Pages/Account/ResetPassword.cshtml.cs

등록 페이지 사용 안 함Disable register page

사용자 등록을 사용 하지 않도록 설정 하려면:To disable user registration:

  • 스 캐 폴드 Identity .Scaffold Identity. Account. Register, Account. Login 및 Account. RegisterConfirmation 같이 포함 됩니다.Include Account.Register, Account.Login, and Account.RegisterConfirmation. 예를 들어:For example:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • 사용자가이 끝점에서 등록할 수 없도록 영역/ Identity /Pages/Account/Register.cshtml.cs 를 업데이트 합니다.Update Areas/Identity/Pages/Account/Register.cshtml.cs so users can't register from this endpoint:

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • 이전 변경 내용과 일치 하도록 영역/ Identity /Pages/Account/Register.cshtml 를 업데이트 합니다.Update Areas/Identity/Pages/Account/Register.cshtml to be consistent with the preceding changes:

    @page
    @model RegisterModel
    @{
        ViewData["Title"] = "Go to Login";
    }
    
    <h1>@ViewData["Title"]</h1>
    
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
    </li>
    
  • 영역/ Identity /Pages/Account/Login.cshtml 에서 등록 링크를 주석으로 처리 하거나 제거 합니다.Comment out or remove the registration link from Areas/Identity/Pages/Account/Login.cshtml

@*
<p>
    <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
</p>
*@
  • 영역/ Identity /Pages/Account/RegisterConfirmation 페이지를 업데이트 합니다.Update the Areas/Identity/Pages/Account/RegisterConfirmation page.

    • Cshtml 파일에서 코드 및 링크를 제거 합니다.Remove the code and links from the cshtml file.
    • 에서 확인 코드를 제거 합니다 PageModel .Remove the confirmation code from the PageModel:
    [AllowAnonymous]
      public class RegisterConfirmationModel : PageModel
      {
          public IActionResult OnGet()
          {  
              return Page();
          }
      }
    

다른 앱을 사용 하 여 사용자 추가Use another app to add users

웹 앱 외부에 사용자를 추가 하는 메커니즘을 제공 합니다.Provide a mechanism to add users outside the web app. 사용자를 추가 하는 옵션은 다음과 같습니다.Options to add users include:

  • 전용 관리 웹 앱입니다.A dedicated admin web app.
  • 콘솔 앱입니다.A console app.

다음 코드에서는 사용자를 추가 하는 한 가지 방법을 간략하게 설명 합니다.The following code outlines one approach to adding users:

  • 사용자 목록을 메모리로 읽습니다.A list of users is read into memory.
  • 각 사용자에 대해 강력한 고유 암호가 생성 됩니다.A strong unique password is generated for each user.
  • 사용자가 데이터베이스에 추가 됩니다 Identity .The user is added to the Identity database.
  • 사용자에 게 알림이 표시 되 고 암호를 변경 하 라는 메시지가 표시 됩니다.The user is notified and told to change the password.
public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();

        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;

            try
            {
                var context = services.GetRequiredService<AppDbCntx>();
                context.Database.Migrate();

                var config = host.Services.GetRequiredService<IConfiguration>();
                var userList = config.GetSection("userList").Get<List<string>>();

                SeedData.Initialize(services, userList).Wait();
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred adding users.");
            }
        }

        host.Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

다음 코드에서는 사용자를 추가 하는 방법을 설명 합니다.The following code outlines adding a user:


public static async Task Initialize(IServiceProvider serviceProvider,
                                    List<string> userList)
{
    var userManager = serviceProvider.GetService<UserManager<IdentityUser>>();

    foreach (var userName in userList)
    {
        var userPassword = GenerateSecurePassword();
        var userId = await EnsureUser(userManager, userName, userPassword);

        NotifyUser(userName, userPassword);
    }
}

private static async Task<string> EnsureUser(UserManager<IdentityUser> userManager,
                                             string userName, string userPassword)
{
    var user = await userManager.FindByNameAsync(userName);

    if (user == null)
    {
        user = new IdentityUser(userName)
        {
            EmailConfirmed = true
        };
        await userManager.CreateAsync(user, userPassword);
    }

    return user.Id;
}

프로덕션 시나리오의 경우 유사한 접근 방식을 사용할 수 있습니다.A similar approach can be followed for production scenarios.

추가 자료Additional resources