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

작성자: Rick AndersonBy Rick Anderson

ASP.NET Core 2.1 이상에서는 Razor 클래스 라이브러리로 ASP.NET Core id 를 제공 합니다.ASP.NET Core 2.1 and later provides ASP.NET Core Identity as a Razor Class Library. Id를 포함 하는 응용 프로그램은 스 캐 폴더를 적용 하 여 RCL (Identity Razor 클래스 라이브러리)에 포함 된 소스 코드를 선택적으로 추가할 수 있습니다.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. 생성된 코드는 ID 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 id 패키지를 추가할 수 있습니다.Applications that do not include authentication can apply the scaffolder to add the RCL Identity package. 선택한 ID 코드의 옵션이 생성되어야 합니다.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. 이 문서에서는 Id 스 캐 폴딩 업데이트를 완료 하는 데 필요한 단계를 설명 합니다.This document explains the steps needed to complete an Identity scaffolding update.

Id 스 캐 폴더를 실행 하면 프로젝트 디렉터리에 ScaffoldingReadme 파일이 만들어집니다.When the Identity scaffolder is run, a ScaffoldingReadme.txt file is created in the project directory. ScaffoldingReadme 파일에는 id 스 캐 폴딩 업데이트를 완료 하는 데 필요한 사항에 대 한 일반적인 지침이 포함 되어 있습니다.The ScaffoldingReadme.txt file contains general instructions on what's needed to complete the Identity scaffolding update. 이 문서에는 ScaffoldingReadme 파일 보다 더 완전 한 지침이 포함 되어 있습니다.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. Id 스 캐 폴더를 실행 한 후에 변경 내용을 검사 합니다.Inspect the changes after running the Identity scaffolder.

참고

서비스는 두 가지 요소 인증, 계정 확인 및 암호 복구및 id를 사용 하는 기타 보안 기능을 사용 하는 경우에 필요 합니다.Services are required when using Two Factor Authentication, Account confirmation and password recovery, and other security features with Identity. Id를 스 캐 폴딩을 사용할 때 서비스 또는 서비스 스텁이 생성 되지 않습니다.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.

빈 프로젝트에 id 스 캐 폴드Scaffold identity into an empty project

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

  • 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭 > 추가 > 스 캐 폴드 된 새 항목합니다.From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • 왼쪽된 창에서 합니다 스 캐 폴드 추가 대화 상자에서 Identity > 추가합니다.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. 예를 ~/Pages/Shared/_Layout.cshtml 들어 MVC ~/Views/Shared/_Layout.cshtml 프로젝트에 대 한 Razor PagesFor example ~/Pages/Shared/_Layout.cshtml for Razor Pages ~/Views/Shared/_Layout.cshtml for MVC projects
    • 선택 된 + 새 단추 데이터 컨텍스트 클래스합니다.Select the + button to create a new Data context class.
  • 선택 추가합니다.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 엄격한 전송 보안 프로토콜 자세한 내용은 합니다.See HTTP Strict Transport Security Protocol for more information.

생성 된 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:

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.

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

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

  • 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭 > 추가 > 스 캐 폴드 된 새 항목합니다.From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • 왼쪽된 창에서 합니다 스 캐 폴드 추가 대화 상자에서 Identity > 추가합니다.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. 예를 ~/Pages/Shared/_Layout.cshtml 들어 MVC ~/Views/Shared/_Layout.cshtml 프로젝트에 대 한 Razor PagesFor example ~/Pages/Shared/_Layout.cshtml for Razor Pages ~/Views/Shared/_Layout.cshtml for MVC projects
    • 선택 된 + 새 단추 데이터 컨텍스트 클래스합니다.Select the + button to create a new Data context class.
  • 선택 추가합니다.Select ADD.

Id는 Areas/identity/IdentityHostingStartup에서 구성 됩니다.Identity 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:

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 클래스의 Configure 메서드에서 UseStaticFiles후에 Useauthentication 을 호출 합니다.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 엄격한 전송 보안 프로토콜 자세한 내용은 합니다.See HTTP Strict Transport Security Protocol for more information.

레이아웃 변경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>

권한 부여가 있는 Razor 프로젝트로 id 스 캐 폴드Scaffold identity into a Razor project with authorization

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

  • 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭 하 > 새 스 캐 폴드 항목 > 추가 를 클릭 합니다.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.

예: MVC 프로젝트에 대 한 Razor Pages ~/Views/Shared/_Layout.cshtml에 대 한 ~/Pages/Shared/_Layout.cshtmlFor example: ~/Pages/Shared/_Layout.cshtml for Razor Pages ~/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.
    • 추가를 선택합니다.Select Add.

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

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

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

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

  • 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭 > 추가 > 스 캐 폴드 된 새 항목합니다.From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • 왼쪽된 창에서 합니다 스 캐 폴드 추가 대화 상자에서 Identity > 추가합니다.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. 예를 ~/Pages/Shared/_Layout.cshtml 들어 MVC ~/Views/Shared/_Layout.cshtml 프로젝트에 대 한 Razor PagesFor example ~/Pages/Shared/_Layout.cshtml for Razor Pages ~/Views/Shared/_Layout.cshtml for MVC projects
    • 선택 된 + 새 단추 데이터 컨텍스트 클래스합니다.Select the + button to create a new Data context class.
  • 선택 추가합니다.Select ADD.

선택 사항: Views/Shared/Layout. cshtml 파일에 로그인 부분 (_LoginPartial)을 추가 합니다.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 파일을 Views/shared/_LoginPartial 로 이동 합니다.Move the Pages/Shared/_LoginPartial.cshtml file to Views/Shared/_LoginPartial.cshtml

Id는 Areas/identity/IdentityHostingStartup에서 구성 됩니다.Identity 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:

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.

UseStaticFiles후에 Useauthentication 을 호출 합니다.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 엄격한 전송 보안 프로토콜 자세한 내용은 합니다.See HTTP Strict Transport Security Protocol for more information.

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

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

  • 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭 하 > 새 스 캐 폴드 항목 > 추가 를 클릭 합니다.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.

예: MVC 프로젝트에 대 한 Razor Pages ~/Views/Shared/_Layout.cshtml에 대 한 ~/Pages/Shared/_Layout.cshtmlFor example: ~/Pages/Shared/_Layout.cshtml for Razor Pages ~/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.
    • 추가를 선택합니다.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.

전체 id UI 원본 만들기Create full identity UI source

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

다음 강조 표시 된 코드는 ASP.NET Core 2.1 웹 앱에서 기본 Id UI를 Id로 바꾸는 변경 내용을 보여 줍니다.The following highlighted code shows the changes to replace the default Identity UI with Identity in an ASP.NET Core 2.1 web app. 이 작업을 수행 하 여 Id UI에 대 한 모든 권한을 부여할 수 있습니다.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>();
}

기본 Id는 다음 코드에서 바뀝니다.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;
    }
}

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

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

  • 스 캐 폴드 Id입니다.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"
    
  • 사용자가이 끝점에서 등록할 수 없도록 영역/i d/페이지/계정/등록을 업데이트 합니다 .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");
        }
    }
    
  • 이전 변경 내용과 일치 하도록 영역/i d/페이지/계정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>
    
  • 영역/i d/페이지/계정/로그인 에서 등록 링크를 주석으로 처리 하거나 제거 합니다.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>
*@
  • 영역/i d/페이지/계정/ a p 확인 페이지를 업데이트 합니다.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.
  • 사용자가 Id 데이터베이스에 추가 됩니다.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