ASP.NET Core プロジェクト内のスキャフォールディング IdScaffold Identity in ASP.NET Core projects

作成者: Rick AndersonBy Rick Anderson

ASP.NET Core 2.1 以降では、 ASP.NET Core idRazor クラスライブラリとして提供します。ASP.NET Core 2.1 and later provides ASP.NET Core Identity as a Razor Class Library. Id を含むアプリケーションでは、scaffolder を適用して、Id 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. UI を完全に制御し、既定の RCL を使用しないようにするには、「完全な ID UI ソースの作成」セクションを参照してください。To gain full control of the UI and not use the default RCL, see the section Create full identity UI source.

認証を含まないアプリケーションでは、scaffolder を適用して Rcl id パッケージを追加できます。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.

Scaffolder は、必要なコードの大部分を生成しますが、プロセスを完了するにはプロジェクトを更新する必要があります。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 scaffolder を実行すると、 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 scaffolder を実行した後に変更を確認します。Inspect the changes after running the Identity scaffolder.

注意

サービスは、 2 要素認証、アカウントの確認とパスワードの回復、および 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 scaffolder を実行します。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. たとえば、MVC プロジェクト~/Views/Shared/_Layout.cshtmlの Razor Pages の場合~/Pages/Shared/_Layout.cshtmlFor 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.

既存の承認なしでスキャフォールディング id を Razor プロジェクトにScaffold identity into a Razor project without existing authorization

Id scaffolder を実行します。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. たとえば、MVC プロジェクト~/Views/Shared/_Layout.cshtmlの Razor Pages の場合~/Pages/Shared/_Layout.cshtmlFor 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>

承認を使用して id を Razor プロジェクトにスキャフォールディングScaffold identity into a Razor project with authorization

Id scaffolder を実行します。Run the Identity scaffolder:

  • ソリューションエクスプローラーで、プロジェクトを右クリックして > 新しいスキャフォールディング項目追加> ます。From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • [Add スキャフォールディング] ダイアログボックスの左ペインで、[ > Identity ] を選択して [add] を選択します。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. 既存の _Layoutファイルが選択されている場合、そのファイルは上書きされません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

  • 既存のデータコンテキストを使用するには、オーバーライドするファイルを少なくとも1つ選択します。To use your existing data context, select at least one file to override. データコンテキストを追加するには、少なくとも1つのファイルを選択する必要があります。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.

既存の承認なしでスキャフォールディング identity を MVC プロジェクトにScaffold identity into an MVC project without existing authorization

Id scaffolder を実行します。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. たとえば、MVC プロジェクト~/Views/Shared/_Layout.cshtmlの Razor Pages の場合~/Pages/Shared/_Layout.cshtmlFor 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ファイルにログイン部分 (_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/loginfileViews/shared/loginの部分ファイルに移動します。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.

承認を使用して id を MVC プロジェクトにスキャフォールディングScaffold identity into an MVC project with authorization

Id scaffolder を実行します。Run the Identity scaffolder:

  • ソリューションエクスプローラーで、プロジェクトを右クリックして > 新しいスキャフォールディング項目追加> ます。From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • [Add スキャフォールディング] ダイアログボックスの左ペインで、[ > Identity ] を選択して [add] を選択します。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. 既存の _Layoutファイルが選択されている場合、そのファイルは上書きされません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

  • 既存のデータコンテキストを使用するには、オーバーライドするファイルを少なくとも1つ選択します。To use your existing data context, select at least one file to override. データコンテキストを追加するには、少なくとも1つのファイルを選択する必要があります。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.

ページ/共有フォルダーとそのフォルダー内のファイルを削除します。Delete the Pages/Shared folder and the files in that folder.

完全な id UI ソースの作成Create full identity UI source

Id UI の完全な制御を維持するには、Identity scaffolder を実行し、[すべてのファイルを上書きする] を選択します。To maintain full control of the Identity UI, run the Identity scaffolder and select Override all files.

次の強調表示されたコードは、既定の Id UI を ASP.NET Core 2.1 web アプリの 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();

次のコードでは、 Loginpathlogoutpath、およびAccessDeniedPathを設定しています。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、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"
    
  • ユーザーがこのエンドポイントから登録できないように、区分/id/ページ/アカウント/登録を更新します。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");
        }
    }
    
  • 前の変更との一貫性を保つために、区分/id/ページ/アカウント/登録を更新します。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>
    
  • 区分/id/ページ/アカウント/ログイン. 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>
*@
  • [区分/id/ページ/アカウント/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

Web アプリの外部にユーザーを追加するためのメカニズムを提供します。Provide a mechanism to add users outside the web app. ユーザーを追加するためのオプションは次のとおりです。Options to add users include:

  • 専用管理者 web アプリ。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