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

作成者: Rick AndersonBy Rick Anderson

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

認証を含ま ない アプリケーションでは、scaffolder を適用して 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.

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

サービスは、 2 要素認証、アカウントの 確認とパスワードの回復、およびの他のセキュリティ機能を使用する場合に必要です 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 scaffolder を実行します。Run the Identity scaffolder:

  • ソリューションエクスプローラーで、プロジェクトを右クリックし、[ Add > New スキャフォールディング Item] > ます。From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • [ Add New スキャフォールディング Item ] ダイアログボックスの左ペインで、[ Identityadd] を選択し > Addます。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 Strict Transport Security Protocol」を参照してください。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 scaffolder を実行します。Run the Identity scaffolder:

  • ソリューションエクスプローラーで、プロジェクトを右クリックし、[ Add > New スキャフォールディング Item] > ます。From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • [ Add New スキャフォールディング Item ] ダイアログボックスの左ペインで、[ Identityadd] を選択し > Addます。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は _Areas/HostingStartup.cs * で構成され Identity / Identity ます。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:

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 Strict Transport Security Protocol」を参照してください。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 scaffolder を実行します。Run the Identity scaffolder:

  • ソリューションエクスプローラーで、プロジェクトを右クリックし、[ Add > New スキャフォールディング Item] > ます。From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • [ Add スキャフォールディング] ダイアログボックスの左ペインで、[ Identity add] を選択し > 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 so your layout file isn't overwritten with incorrect markup. 既存の* _ Layout*ファイルが選択されている場合、そのファイルは上書きされませんWhen an existing _Layout.cshtml file is selected, it is not overwritten. 次に例を示します。For example:
      • ~/Pages/Shared/_Layout.cshtml既存の Razor Pages インフラストラクチャを使用する Razor Pages または Blazor Server プロジェクトの場合~/Pages/Shared/_Layout.cshtml for Razor Pages or Blazor Server projects with existing Razor Pages infrastructure
      • ~/Views/Shared/_Layout.cshtmlmvc プロジェクトの場合、または既存の MVC インフラストラクチャを使用する Blazor Server プロジェクトの場合~/Views/Shared/_Layout.cshtml for MVC projects or Blazor Server projects with existing MVC infrastructure
  • 既存のデータコンテキストを使用するには、オーバーライドするファイルを少なくとも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. 既定値をそのまま使用するか、クラス (など) を指定し 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 scaffolder を実行します。Run the Identity scaffolder:

  • ソリューションエクスプローラーで、プロジェクトを右クリックし、[ Add > New スキャフォールディング Item] > ます。From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • [ Add スキャフォールディング] ダイアログボックスの左ペインで、[ Identity add] を選択し > 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. 次に例を示します。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
  • 既存のデータコンテキストを使用するには、オーバーライドするファイルを少なくとも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. 既定値をそのまま使用するか、クラス (など) を指定し 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 のオプションは、 Areas/ 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 scaffolder を実行します。Run the Identity scaffolder:

  • ソリューションエクスプローラーで、プロジェクトを右クリックし、[ Add > New スキャフォールディング Item] > ます。From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • [ Add New スキャフォールディング Item ] ダイアログボックスの左ペインで、[ Identityadd] を選択し > Addます。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は、 Areas/ Identity / Identity HostingStartup.cs で構成されます。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:

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 Strict Transport Security Protocol」を参照してください。For more information, see HTTP Strict Transport Security Protocol.

Identity承認を使用した MVC プロジェクトへのスキャフォールディングScaffold Identity into an MVC project with authorization

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

  • ソリューションエクスプローラーで、プロジェクトを右クリックし、[ Add > New スキャフォールディング Item] > ます。From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • [ Add スキャフォールディング] ダイアログボックスの左ペインで、[ Identity add] を選択し > 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 so your layout file isn't overwritten with incorrect markup. 既存の* _ Layout*ファイルが選択されている場合、そのファイルは上書きされませんWhen an existing _Layout.cshtml file is selected, it is not overwritten. 次に例を示します。For example:
      • ~/Pages/Shared/_Layout.cshtml既存の Razor Pages インフラストラクチャを使用する Razor Pages または Blazor Server プロジェクトの場合~/Pages/Shared/_Layout.cshtml for Razor Pages or Blazor Server projects with existing Razor Pages infrastructure
      • ~/Views/Shared/_Layout.cshtmlmvc プロジェクトの場合、または既存の MVC インフラストラクチャを使用する Blazor Server プロジェクトの場合~/Views/Shared/_Layout.cshtml for MVC projects or Blazor Server projects with existing MVC infrastructure
  • 既存のデータコンテキストを使用するには、オーバーライドするファイルを少なくとも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. 既定値をそのまま使用するか、クラス (など) を指定し 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 scaffolder を実行します。Run the Identity scaffolder:

  • ソリューションエクスプローラーで、プロジェクトを右クリックし、[ Add > New スキャフォールディング Item] > ます。From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • [ Add スキャフォールディング] ダイアログボックスの左ペインで、[ Identity add] を選択し > 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. 次に例を示します。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
  • 既存のデータコンテキストを使用するには、オーバーライドするファイルを少なくとも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. 既定値をそのまま使用するか、クラス (など) を指定し 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 scaffolder を実行します。Run the Identity scaffolder:

  • ソリューションエクスプローラーで、プロジェクトを右クリックし、[ Add > New スキャフォールディング Item] > ます。From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • [ Add New スキャフォールディング Item ] ダイアログボックスの左ペインで、[ Identityadd] を選択し > Addます。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は、 Areas/ Identity / Identity HostingStartup.cs で構成されます。Identity 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:

  • 認証トークンがプロビジョニングされ、認証に保存されると cookie 、コンポーネントに渡すことができます。When authentication tokens are provisioned and saved to the authentication cookie, they can be passed to components.
  • Razor コンポーネントでを直接使用することはできない HttpContext ため、のログアウトエンドポイントをに送信するための 要求防止偽造 (XSRF) トークン を取得する方法はありません Identity /Identity/Account/LogoutRazor 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 cshtml ファイルで、クラスおよびクラスに追加した後、トークンを設定し 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コンポーネント ( app.xaml ) を更新して、次の 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 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 Strict Transport Security Protocol」を参照してください。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. razor ) を追加します。 TokenProvider サービスは、ログアウトエンドポイントにポストする HTML フォームの XSRF トークンを提供し Identity ます。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 ビジターがページとコンポーネントの間を移動すると、UI のスタイルが変更され Identity ます。Because Blazor Server uses Razor Pages Identity pages, the styling of the UI changes when a visitor navigates between Identity pages and components. Incongruous スタイルに対処するには、次の2つのオプションがあります。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. SignInManagerとは UserManager コンポーネントでサポートされていないため 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 コンポーネント ( Shared/NavMenu_ Identity Layout ) を作成します。Create a new NavMenu_IdentityLayout component ( Shared/NavMenu_IdentityLayout.razor ). コンポーネントのマークアップとコードについては、アプリのコンポーネントの同じコンテンツを使用し NavMenu ます ( 共有/ナビゲーションメニュー。 razor )。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 scaffolder を実行します。Run the Identity scaffolder:

  • ソリューションエクスプローラーで、プロジェクトを右クリックし、[ Add > New スキャフォールディング Item] > ます。From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • [ Add スキャフォールディング] ダイアログボックスの左ペインで、[ Identity add] を選択し > 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 so your layout file isn't overwritten with incorrect markup. 既存の* _ Layout*ファイルが選択されている場合、そのファイルは上書きされませんWhen an existing _Layout.cshtml file is selected, it is not overwritten. 次に例を示します。For example:
      • ~/Pages/Shared/_Layout.cshtml既存の Razor Pages インフラストラクチャを使用する Razor Pages または Blazor Server プロジェクトの場合~/Pages/Shared/_Layout.cshtml for Razor Pages or Blazor Server projects with existing Razor Pages infrastructure
      • ~/Views/Shared/_Layout.cshtmlmvc プロジェクトの場合、または既存の MVC インフラストラクチャを使用する Blazor Server プロジェクトの場合~/Views/Shared/_Layout.cshtml for MVC projects or Blazor Server projects with existing MVC infrastructure
  • 既存のデータコンテキストを使用するには、オーバーライドするファイルを少なくとも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. 既定値をそのまま使用するか、クラス (など) を指定し 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 scaffolder を実行します。Run the Identity scaffolder:

  • ソリューションエクスプローラーで、プロジェクトを右クリックし、[ Add > New スキャフォールディング Item] > ます。From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • [ Add スキャフォールディング] ダイアログボックスの左ペインで、[ Identity add] を選択し > 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. 次に例を示します。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
  • 既存のデータコンテキストを使用するには、オーバーライドするファイルを少なくとも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. 既定値をそのまま使用するか、クラス (など) を指定し 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 のオプションは、 Areas/ Identity / Identity HostingStartup.cs で構成されています。Some Identity options are configured in Areas/Identity/IdentityHostingStartup.cs . 詳細については、「 IHostingStartup」を参照してください。For more information, see IHostingStartup.

スタンドアロンまたはホストされた Blazor WebAssembly アプリStandalone or hosted Blazor WebAssembly apps

クライアント側 Blazor WebAssembly アプリは独自の Identity UI アプローチを使用し、スキャフォールディングを使用することはできません ASP.NET Core Identity 。Client-side Blazor WebAssembly apps use their own Identity UI approaches and can't use ASP.NET Core Identity scaffolding. ホストされたソリューションのサーバー側 ASP.NET Core アプリ Blazor は、 Razor この記事のページ/MVC ガイダンスに従うことができ、をサポートする他の種類の ASP.NET Core アプリと同様に構成され Identity ます。Server-side ASP.NET Core apps of hosted Blazor solutions can follow the Razor Pages/MVC guidance in this article and are configured just like any other type of ASP.NET Core app that supports Identity.

フレームワークには、 Blazor Razor コンポーネントバージョンの Identity UI ページは含まれません。The Blazor framework doesn't include Razor component versions of Identity UI pages. Identity UI Razor コンポーネントは、サポートされていないサードパーティソースから作成または取得できます。Identity UI Razor components can be custom built or obtained from unsupported third-party sources.

詳細については、「 Blazor セキュリティと Identity 記事」を参照してください。For more information, see the Blazor Security and Identity articles.

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

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

次の強調表示されたコードは、 Identity ASP.NET Core 2.1 web アプリで既定の UI をに置き換える変更を示して Identity います。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();

次のコードでは、 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;
    }
}

パスワードの構成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、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 はを更新します。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 //// から登録リンクをコメントアウトまたは削除します。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 アカウント/ 登録の確認] ページを更新します。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.
  • ユーザーがデータベースに追加され 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

静的なアセットが web ルートに発行されないようにするに Identity は、「」を参照してください IdentityASP.NET Core の概要To prevent publishing static Identity assets to the web root, see IdentityASP.NET Core の概要.

その他の資料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 では、scaffolder を適用して、 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. 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 パッケージを追加でき 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.

Scaffolder は、必要なコードの大部分を生成しますが、プロセスを完了するにはプロジェクトを更新する必要があります。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.

Scaffolder を 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. Scaffolder を実行した後に変更を確認し Identity ます。Inspect the changes after running the Identity scaffolder.

注意

サービスは、 2 要素認証、アカウントの 確認とパスワードの回復、およびの他のセキュリティ機能を使用する場合に必要です 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 scaffolder を実行します。Run the Identity scaffolder:

  • ソリューションエクスプローラーで、プロジェクトを右クリックし、[ Add > New スキャフォールディング Item] > ます。From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • [ Add New スキャフォールディング Item ] ダイアログボックスの左ペインで、[ Identityadd] を選択し > Addます。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 Strict Transport Security Protocol」を参照してください。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 scaffolder を実行します。Run the Identity scaffolder:

  • ソリューションエクスプローラーで、プロジェクトを右クリックし、[ Add > New スキャフォールディング Item] > ます。From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • [ Add New スキャフォールディング Item ] ダイアログボックスの左ペインで、[ Identityadd] を選択し > Addます。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は、 Areas/ Identity / Identity HostingStartup.cs で構成されます。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:

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 Strict Transport Security Protocol」を参照してください。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 scaffolder を実行します。Run the Identity scaffolder:

  • ソリューションエクスプローラーで、プロジェクトを右クリックし、[ Add > New スキャフォールディング Item] > ます。From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • [ Add スキャフォールディング] ダイアログボックスの左ペインで、[ Identity add] を選択し > 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 so your layout file isn't overwritten with incorrect markup. 既存の* _ Layout*ファイルが選択されている場合、そのファイルは上書きされませんWhen an existing _Layout.cshtml file is selected, it is not overwritten. 次に例を示します。For example:
      • ~/Pages/Shared/_Layout.cshtml既存の Razor Pages インフラストラクチャを使用する Razor Pages または Blazor Server プロジェクトの場合~/Pages/Shared/_Layout.cshtml for Razor Pages or Blazor Server projects with existing Razor Pages infrastructure
      • ~/Views/Shared/_Layout.cshtmlmvc プロジェクトの場合、または既存の MVC インフラストラクチャを使用する Blazor Server プロジェクトの場合~/Views/Shared/_Layout.cshtml for MVC projects or Blazor Server projects with existing MVC infrastructure
  • 既存のデータコンテキストを使用するには、オーバーライドするファイルを少なくとも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. 既定値をそのまま使用するか、クラス (など) を指定し 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 scaffolder を実行します。Run the Identity scaffolder:

  • ソリューションエクスプローラーで、プロジェクトを右クリックし、[ Add > New スキャフォールディング Item] > ます。From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • [ Add スキャフォールディング] ダイアログボックスの左ペインで、[ Identity add] を選択し > 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. 次に例を示します。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
  • 既存のデータコンテキストを使用するには、オーバーライドするファイルを少なくとも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. 既定値をそのまま使用するか、クラス (など) を指定し 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 のオプションは、 Areas/ 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 scaffolder を実行します。Run the Identity scaffolder:

  • ソリューションエクスプローラーで、プロジェクトを右クリックし、[ Add > New スキャフォールディング Item] > ます。From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • [ Add New スキャフォールディング Item ] ダイアログボックスの左ペインで、[ Identityadd] を選択し > Addます。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は、 Areas/ Identity / Identity HostingStartup.cs で構成されます。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:

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.

呼び出しの UseAuthenticationUseStaticFiles :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 Strict Transport Security Protocol」を参照してください。For more information, see HTTP Strict Transport Security Protocol.

Identity承認を使用した MVC プロジェクトへのスキャフォールディングScaffold Identity into an MVC project with authorization

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

  • ソリューションエクスプローラーで、プロジェクトを右クリックし、[ Add > New スキャフォールディング Item] > ます。From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • [ Add スキャフォールディング] ダイアログボックスの左ペインで、[ Identity add] を選択し > 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 so your layout file isn't overwritten with incorrect markup. 既存の* _ Layout*ファイルが選択されている場合、そのファイルは上書きされませんWhen an existing _Layout.cshtml file is selected, it is not overwritten. 次に例を示します。For example:
      • ~/Pages/Shared/_Layout.cshtml既存の Razor Pages インフラストラクチャを使用する Razor Pages または Blazor Server プロジェクトの場合~/Pages/Shared/_Layout.cshtml for Razor Pages or Blazor Server projects with existing Razor Pages infrastructure
      • ~/Views/Shared/_Layout.cshtmlmvc プロジェクトの場合、または既存の MVC インフラストラクチャを使用する Blazor Server プロジェクトの場合~/Views/Shared/_Layout.cshtml for MVC projects or Blazor Server projects with existing MVC infrastructure
  • 既存のデータコンテキストを使用するには、オーバーライドするファイルを少なくとも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. 既定値をそのまま使用するか、クラス (など) を指定し 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 scaffolder を実行します。Run the Identity scaffolder:

  • ソリューションエクスプローラーで、プロジェクトを右クリックし、[ Add > New スキャフォールディング Item] > ます。From Solution Explorer, right-click on the project > Add > New Scaffolded Item.
  • [ Add スキャフォールディング] ダイアログボックスの左ペインで、[ Identity add] を選択し > 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. 次に例を示します。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
  • 既存のデータコンテキストを使用するには、オーバーライドするファイルを少なくとも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. 既定値をそのまま使用するか、クラス (など) を指定し 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.

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

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

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

次の強調表示されたコードは、 Identity ASP.NET Core 2.1 web アプリで既定の UI をに置き換える変更を示して Identity います。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();

次のコードでは、 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;
    }
}

パスワードの構成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、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 はを更新します。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 //// から登録リンクをコメントアウトまたは削除します。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 アカウント/ 登録の確認] ページを更新します。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.
  • ユーザーがデータベースに追加され 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