ASP.NET Core プロジェクトでの Identity のスキャフォールディング
作成者: Rick Anderson
ASP.NET Core では、ASP.NET Core Identity を Razor クラス ライブラリとして提供しています。 Identity を含むアプリケーションで、IdentityRazor クラス ライブラリ (RCL) に含まれるソース コードを選択的に追加するようにスキャフォールディングを適用できます。 コードを変更して動作を変更できるように、ソース コードを生成できます。 たとえば、登録で使用するコードを生成するようにスキャフォルダーに指示できます。 生成されたコードは、Identity RCL の同じコードよりも優先されます。 UI を完全に制御し、既定の RCL を使用しないようにするには、「完全な Identity UI ソースを作成する」セクションを参照してください。
認証を含まないアプリケーションでは、RCL Identity パッケージを追加するようにスキャフォールディングを適用できます。 生成される Identity コードの選択オプションがあります。
スキャフォールディングによって、必要なコードの大部分が生成されますが、プロセスを完了するにはプロジェクトを更新する必要があります。 このドキュメントでは、Identity スキャフォールディングの更新を完了するために必要な手順について説明します。
ファイルの差分が表示され、変更を取り消すことができるソース管理システムを使用することをお勧めします。 Identity スキャフォールディングを実行した後、変更内容を検査します。
サービスは、Identity で 2 要素認証、アカウントの確認とパスワードの回復、およびその他のセキュリティ機能を使用する場合に必要です。 サービスまたはサービス スタブは、Identity のスキャフォールディング時に生成されません。 これらの機能を有効にするサービスは、手動で追加する必要があります。 たとえば、電子メール確認の要求に関する記事をご覧ください。
通常は、個別のアカウントで作成されたアプリで、新しいデータ コンテキストを作成 "しない" ようにする必要があります。
Razor プロジェクトに既存の認可なしで Identity をスキャフォールディングする
次の Microsoft.VisualStudio.Web.CodeGeneration.Design NuGet パッケージをインストールします。
Visual Studio パッケージ マネージャー コンソールの場合:
Install-Package Microsoft.VisualStudio.Web.CodeGeneration.Design
Identity スキャフォルダーを実行します。
- [ソリューション エクスプローラー] で、プロジェクトを右クリックし、>[追加]>[新しいスキャフォールディング アイテム] の順に選択します。
- [新規スキャフォールディング アイテムの追加] の左ペインから [Identity]>[追加] の順に選択します。
- [Identity の追加] ダイアログで、必要なオプションを選択します。
- 既存のレイアウト ページを選択します。しない場合、正しくないマークアップでレイアウトファイルが上書きされます。
- Razor Pages の場合は
~/Pages/Shared/_Layout.cshtml
- MVC プロジェクトの場合は
~/Views/Shared/_Layout.cshtml
- Blazor Server テンプレート (
blazorserver
) から作成された Blazor Server アプリは、既定では Razor Pages 用または MVC 用に構成されていません。 レイアウト ページは空白のままにします。
- Razor Pages の場合は
- + ボタンを選択して、新しいデータ コンテキスト クラスを作成します。 既定値を受け入れるか、クラスを指定します (例:
MyApplication.Data.ApplicationDbContext
)。
- 既存のレイアウト ページを選択します。しない場合、正しくないマークアップでレイアウトファイルが上書きされます。
- [追加] を選択します。
移行、UseAuthentication、レイアウト
生成された Identity データベース コードには、Entity Framework Core 移行が必要です。 移行を作成し、データベースを更新します。 たとえば、次のコマンドを実行します。
Visual Studio パッケージ マネージャー コンソールの場合:
Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database
Add-Migration
コマンドの "CreateIdentitySchema" name パラメーターは任意です。 "CreateIdentitySchema"
は移行について説明するものです。
レイアウトの変更
省略可能: ログイン部分 (_LoginPartial
) をレイアウト ファイルに追加します。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - WebRPnoAuth2Auth</title>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
<link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
<link rel="stylesheet" href="~/WebRPnoAuth2Auth.styles.css" asp-append-version="true" />
</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">WebRPnoAuth2Auth</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-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 justify-content-between">
<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>
<partial name="_LoginPartial" />
</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">
© 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
</div>
</footer>
<script src="~/lib/jquery/dist/jquery.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
@await RenderSectionAsync("Scripts", required: false)
</body>
</html>
Razor プロジェクトに認可ありで Identity をスキャフォールディングする
次の Microsoft.VisualStudio.Web.CodeGeneration.Design NuGet パッケージをインストールします。
Visual Studio パッケージ マネージャー コンソールの場合:
Install-Package Microsoft.VisualStudio.Web.CodeGeneration.Design
Identity スキャフォルダーを実行します。
- [ソリューション エクスプローラー] で、プロジェクトを右クリックし、>[追加]>[新しいスキャフォールディング アイテム] の順に選択します。
- [新規スキャフォールディング アイテムの追加] の左ペインから [Identity] を選択します。 中央のウィンドウで [Identity] を選択します。 [追加] ボタンを選びます。
- [Identity の追加] ダイアログで、必要なオプションを選択します。
- レイアウト ファイルが正しくないマークアップで上書きされないように、既存のレイアウト ページを選択します。 既存の
_Layout.cshtml
ファイルが選択されている場合は、上書きされません。 次に例を示します。- 既存の Razor Pages インフラストラクチャが含まれる、Razor Pages プロジェクトまたは Blazor Server プロジェクトの
~/Pages/Shared/_Layout.cshtml
- 既存の MVC インフラストラクチャが含まれる、MVC プロジェクトまたは Blazor Server プロジェクトの
~/Views/Shared/_Layout.cshtml
- 既存の Razor Pages インフラストラクチャが含まれる、Razor Pages プロジェクトまたは Blazor Server プロジェクトの
- レイアウト ファイルが正しくないマークアップで上書きされないように、既存のレイアウト ページを選択します。 既存の
- 既存のデータ コンテキストを使用するには、オーバーライドするファイルを 1 つ以上選択します。 データ コンテキストを追加するには、1 つ以上のファイルを選択する必要があります。
- データ コンテキスト クラスを選択します。
- [追加] を選択します。
- 新しいユーザー コンテキストを作成し、場合によって Identity カスタム ユーザー クラスを作成するには、次の操作を行います。
- + ボタンを選択して、新しいデータ コンテキスト クラスを作成します。 既定値を受け入れるか、クラスを指定します (例:
MyApplication.Data.ApplicationDbContext
)。 - [追加] を選択します。
- + ボタンを選択して、新しいデータ コンテキスト クラスを作成します。 既定値を受け入れるか、クラスを指定します (例:
注: 新しいユーザー コンテキストを作成している場合、上書きするファイルを選択する必要はありません。
Identity スキャフォールディングを実行します。
- [ソリューション エクスプローラー] で、プロジェクトを右クリックし、>[追加]>[新しいスキャフォールディング アイテム] の順に選択します。
- [スキャフォールディングを追加] ダイアログの左ペインで、[Identity]>[追加] の順に選択します。
- [Identity の追加] ダイアログで、必要なオプションを選択します。
- レイアウト ファイルが正しくないマークアップで上書きされないように、既存のレイアウト ページを選択します。 既存の _Layout.cshtml ファイルが選択されている場合は、上書きされません。 次に例を示します。
- 既存の Razor Pages インフラストラクチャが含まれる、Razor Pages プロジェクトまたは Blazor Server プロジェクトの
~/Pages/Shared/_Layout.cshtml
- 既存の MVC インフラストラクチャが含まれる、MVC プロジェクトまたは Blazor Server プロジェクトの
~/Views/Shared/_Layout.cshtml
- 既存の Razor Pages インフラストラクチャが含まれる、Razor Pages プロジェクトまたは Blazor Server プロジェクトの
- レイアウト ファイルが正しくないマークアップで上書きされないように、既存のレイアウト ページを選択します。 既存の _Layout.cshtml ファイルが選択されている場合は、上書きされません。 次に例を示します。
- 既存のデータ コンテキストを使用するには、オーバーライドするファイルを 1 つ以上選択します。 データ コンテキストを追加するには、1 つ以上のファイルを選択する必要があります。
- データ コンテキスト クラスを選択します。
- [追加] を選択します。
- 新しいユーザー コンテキストを作成し、場合によって Identity カスタム ユーザー クラスを作成するには、次の操作を行います。
- + ボタンを選択して、新しいデータ コンテキスト クラスを作成します。 既定値を受け入れるか、クラスを指定します (例:
MyApplication.Data.ApplicationDbContext
)。 - [追加] を選択します。
- + ボタンを選択して、新しいデータ コンテキスト クラスを作成します。 既定値を受け入れるか、クラスを指定します (例:
注: 新しいユーザー コンテキストを作成している場合、上書きするファイルを選択する必要はありません。
MVC プロジェクトに既存の認可なしで Identity をスキャフォールディングする
次の Microsoft.VisualStudio.Web.CodeGeneration.Design NuGet パッケージをインストールします。
Visual Studio パッケージ マネージャー コンソールの場合:
Install-Package Microsoft.VisualStudio.Web.CodeGeneration.Design
Identity スキャフォルダーを実行します。
- [ソリューション エクスプローラー] で、プロジェクトを右クリックし、>[追加]>[新しいスキャフォールディング アイテム] の順に選択します。
- [新規スキャフォールディング アイテムの追加] の左ペインから [Identity]>[追加] の順に選択します。
- [Identity の追加] ダイアログで、必要なオプションを選択します。
- 既存のレイアウト ページを選択します。しない場合、正しくないマークアップでレイアウトファイルが上書きされます。
- Razor Pages の場合は
~/Pages/Shared/_Layout.cshtml
- MVC プロジェクトの場合は
~/Views/Shared/_Layout.cshtml
- Blazor Server テンプレート (
blazorserver
) から作成された Blazor Server アプリは、既定では Razor Pages 用または MVC 用に構成されていません。 レイアウト ページは空白のままにします。
- Razor Pages の場合は
- + ボタンを選択して、新しいデータ コンテキスト クラスを作成します。 既定値を受け入れるか、クラスを指定します (例:
MyApplication.Data.ApplicationDbContext
)。
- 既存のレイアウト ページを選択します。しない場合、正しくないマークアップでレイアウトファイルが上書きされます。
- [追加] を選択します。
省略可能: ログイン部分 (_LoginPartial
) を Views/Shared/_Layout.cshtml
ファイルに追加します。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - WebRPnoAuth2Auth</title>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
<link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
<link rel="stylesheet" href="~/WebRPnoAuth2Auth.styles.css" asp-append-version="true" />
</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">WebRPnoAuth2Auth</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-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 justify-content-between">
<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>
<partial name="_LoginPartial" />
</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">
© 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
</div>
</footer>
<script src="~/lib/jquery/dist/jquery.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
@await RenderSectionAsync("Scripts", required: false)
</body>
</html>
生成された Identity データベース コードには、Entity Framework Core 移行が必要です。 移行を作成し、データベースを更新します。 たとえば、次のコマンドを実行します。
Visual Studio パッケージ マネージャー コンソールの場合:
Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database
Add-Migration
コマンドの "CreateIdentitySchema" name パラメーターは任意です。 "CreateIdentitySchema"
は移行について説明するものです。
次の強調表示されたコードに示すように、MapRazorPages
を Program.cs
に追加します。
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebMVCauth.Data;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddControllersWithViews();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();
app.Run();
MVC プロジェクトに認可ありで Identity をスキャフォールディングする
次の Microsoft.VisualStudio.Web.CodeGeneration.Design NuGet パッケージをインストールします。
Visual Studio パッケージ マネージャー コンソールの場合:
Install-Package Microsoft.VisualStudio.Web.CodeGeneration.Design
Identity スキャフォルダーを実行します。
- [ソリューション エクスプローラー] で、プロジェクトを右クリックし、>[追加]>[新しいスキャフォールディング アイテム] の順に選択します。
- [新規スキャフォールディング アイテムの追加] の左ペインから [Identity] を選択します。 中央のウィンドウで [Identity] を選択します。 [追加] ボタンを選びます。
- [Identity の追加] ダイアログで、必要なオプションを選択します。
- レイアウト ファイルが正しくないマークアップで上書きされないように、既存のレイアウト ページを選択します。 既存の
_Layout.cshtml
ファイルが選択されている場合は、上書きされません。 次に例を示します。- 既存の Razor Pages インフラストラクチャが含まれる、Razor Pages プロジェクトまたは Blazor Server プロジェクトの
~/Pages/Shared/_Layout.cshtml
- 既存の MVC インフラストラクチャが含まれる、MVC プロジェクトまたは Blazor Server プロジェクトの
~/Views/Shared/_Layout.cshtml
- 既存の Razor Pages インフラストラクチャが含まれる、Razor Pages プロジェクトまたは Blazor Server プロジェクトの
- レイアウト ファイルが正しくないマークアップで上書きされないように、既存のレイアウト ページを選択します。 既存の
- 既存のデータ コンテキストを使用するには、オーバーライドするファイルを 1 つ以上選択します。 データ コンテキストを追加するには、1 つ以上のファイルを選択する必要があります。
- データ コンテキスト クラスを選択します。
- [追加] を選択します。
- 新しいユーザー コンテキストを作成し、場合によって Identity カスタム ユーザー クラスを作成するには、次の操作を行います。
- + ボタンを選択して、新しいデータ コンテキスト クラスを作成します。 既定値を受け入れるか、クラスを指定します (例:
MyApplication.Data.ApplicationDbContext
)。 - [追加] を選択します。
- + ボタンを選択して、新しいデータ コンテキスト クラスを作成します。 既定値を受け入れるか、クラスを指定します (例:
注: 新しいユーザー コンテキストを作成している場合、上書きするファイルを選択する必要はありません。
Identity スキャフォールディングを実行します。
- [ソリューション エクスプローラー] で、プロジェクトを右クリックし、>[追加]>[新しいスキャフォールディング アイテム] の順に選択します。
- [スキャフォールディングを追加] ダイアログの左ペインで、[Identity]>[追加] の順に選択します。
- [Identity の追加] ダイアログで、必要なオプションを選択します。
- レイアウト ファイルが正しくないマークアップで上書きされないように、既存のレイアウト ページを選択します。 既存の _Layout.cshtml ファイルが選択されている場合は、上書きされません。 次に例を示します。
- 既存の Razor Pages インフラストラクチャが含まれる、Razor Pages プロジェクトまたは Blazor Server プロジェクトの
~/Pages/Shared/_Layout.cshtml
- 既存の MVC インフラストラクチャが含まれる、MVC プロジェクトまたは Blazor Server プロジェクトの
~/Views/Shared/_Layout.cshtml
- 既存の Razor Pages インフラストラクチャが含まれる、Razor Pages プロジェクトまたは Blazor Server プロジェクトの
- レイアウト ファイルが正しくないマークアップで上書きされないように、既存のレイアウト ページを選択します。 既存の _Layout.cshtml ファイルが選択されている場合は、上書きされません。 次に例を示します。
- 既存のデータ コンテキストを使用するには、オーバーライドするファイルを 1 つ以上選択します。 データ コンテキストを追加するには、1 つ以上のファイルを選択する必要があります。
- データ コンテキスト クラスを選択します。
- [追加] を選択します。
- 新しいユーザー コンテキストを作成し、場合によって Identity カスタム ユーザー クラスを作成するには、次の操作を行います。
- + ボタンを選択して、新しいデータ コンテキスト クラスを作成します。 既定値を受け入れるか、クラスを指定します (例:
MyApplication.Data.ApplicationDbContext
)。 - [追加] を選択します。
- + ボタンを選択して、新しいデータ コンテキスト クラスを作成します。 既定値を受け入れるか、クラスを指定します (例:
注: 新しいユーザー コンテキストを作成している場合、上書きするファイルを選択する必要はありません。
Identity を Blazor Server プロジェクトにスキャフォールディングする
次の Microsoft.VisualStudio.Web.CodeGeneration.Design NuGet パッケージをインストールします。
Visual Studio パッケージ マネージャー コンソールの場合:
Install-Package Microsoft.VisualStudio.Web.CodeGeneration.Design
Identity スキャフォルダーを実行します。
- [ソリューション エクスプローラー] で、プロジェクトを右クリックし、>[追加]>[新しいスキャフォールディング アイテム] の順に選択します。
- [新規スキャフォールディング アイテムの追加] の左ペインから [Identity] を選択します。 中央のウィンドウで [Identity] を選択します。 [追加] ボタンを選びます。
- [Identity の追加] ダイアログで、必要なオプションを選択します。
- レイアウト ファイルが正しくないマークアップで上書きされないように、既存のレイアウト ページを選択します。 既存の
_Layout.cshtml
ファイルが選択されている場合は、上書きされません。 次に例を示します。- 既存の Razor Pages インフラストラクチャが含まれる、Razor Pages プロジェクトまたは Blazor Server プロジェクトの
~/Pages/Shared/_Layout.cshtml
- 既存の MVC インフラストラクチャが含まれる、MVC プロジェクトまたは Blazor Server プロジェクトの
~/Views/Shared/_Layout.cshtml
- 既存の Razor Pages インフラストラクチャが含まれる、Razor Pages プロジェクトまたは Blazor Server プロジェクトの
- レイアウト ファイルが正しくないマークアップで上書きされないように、既存のレイアウト ページを選択します。 既存の
- 既存のデータ コンテキストを使用するには、オーバーライドするファイルを 1 つ以上選択します。 データ コンテキストを追加するには、1 つ以上のファイルを選択する必要があります。
- データ コンテキスト クラスを選択します。
- [追加] を選択します。
- 新しいユーザー コンテキストを作成し、場合によって Identity カスタム ユーザー クラスを作成するには、次の操作を行います。
- + ボタンを選択して、新しいデータ コンテキスト クラスを作成します。 既定値を受け入れるか、クラスを指定します (例:
MyApplication.Data.ApplicationDbContext
)。 - [追加] を選択します。
- + ボタンを選択して、新しいデータ コンテキスト クラスを作成します。 既定値を受け入れるか、クラスを指定します (例:
注: 新しいユーザー コンテキストを作成している場合、上書きするファイルを選択する必要はありません。
Identity スキャフォールディングを実行します。
- [ソリューション エクスプローラー] で、プロジェクトを右クリックし、>[追加]>[新しいスキャフォールディング アイテム] の順に選択します。
- [スキャフォールディングを追加] ダイアログの左ペインで、[Identity]>[追加] の順に選択します。
- [Identity の追加] ダイアログで、必要なオプションを選択します。
- レイアウト ファイルが正しくないマークアップで上書きされないように、既存のレイアウト ページを選択します。 既存の _Layout.cshtml ファイルが選択されている場合は、上書きされません。 次に例を示します。
- 既存の Razor Pages インフラストラクチャが含まれる、Razor Pages プロジェクトまたは Blazor Server プロジェクトの
~/Pages/Shared/_Layout.cshtml
- 既存の MVC インフラストラクチャが含まれる、MVC プロジェクトまたは Blazor Server プロジェクトの
~/Views/Shared/_Layout.cshtml
- 既存の Razor Pages インフラストラクチャが含まれる、Razor Pages プロジェクトまたは Blazor Server プロジェクトの
- レイアウト ファイルが正しくないマークアップで上書きされないように、既存のレイアウト ページを選択します。 既存の _Layout.cshtml ファイルが選択されている場合は、上書きされません。 次に例を示します。
- 既存のデータ コンテキストを使用するには、オーバーライドするファイルを 1 つ以上選択します。 データ コンテキストを追加するには、1 つ以上のファイルを選択する必要があります。
- データ コンテキスト クラスを選択します。
- [追加] を選択します。
- 新しいユーザー コンテキストを作成し、場合によって Identity カスタム ユーザー クラスを作成するには、次の操作を行います。
- + ボタンを選択して、新しいデータ コンテキスト クラスを作成します。 既定値を受け入れるか、クラスを指定します (例:
MyApplication.Data.ApplicationDbContext
)。 - [追加] を選択します。
- + ボタンを選択して、新しいデータ コンテキスト クラスを作成します。 既定値を受け入れるか、クラスを指定します (例:
注: 新しいユーザー コンテキストを作成している場合、上書きするファイルを選択する必要はありません。
移行
生成された Identity データベース コードには、Entity Framework Core 移行が必要です。 移行を作成し、データベースを更新します。 たとえば、次のコマンドを実行します。
Visual Studio パッケージ マネージャー コンソールの場合:
Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database
Add-Migration
コマンドの "CreateIdentitySchema" name パラメーターは任意です。 "CreateIdentitySchema"
は移行について説明するものです。
XSRF トークンをアプリに渡す
トークンは、コンポーネントに渡すことができます。
- 認証トークンは、プロビジョニングされて認証 cookie に保存されると、コンポーネントに渡すことができるようになります。
- Razor コンポーネントで
HttpContext
を直接使用することはできないため、要求偽造防止 (XSRF) トークンを取得して/Identity/Account/Logout
で Identity のログアウト エンドポイントに POST する方法がありません。 XSRF トークンは、コンポーネントに渡すことができます。
詳細については、「ASP.NET Core Blazor Server のその他のセキュリティ シナリオ」を参照してください。
Pages/_Host.cshtml
ファイルで、トークンを InitialApplicationState
および TokenProvider
クラスに追加した後で設定します。
@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf
...
var tokens = new InitialApplicationState
{
...
XsrfToken = Xsrf.GetAndStoreTokens(HttpContext).RequestToken
};
App
コンポーネント (App.razor
) を更新して InitialState.XsrfToken
を割り当てます。
@inject TokenProvider TokenProvider
...
TokenProvider.XsrfToken = InitialState.XsrfToken;
このトピックで示した TokenProvider
サービスは、次の「レイアウトと認証フローの変更」セクションの LoginDisplay
コンポーネントで使用します。
トークン プロバイダー サービスを登録する
トークン プロバイダー サービスを使用している場合は、次のように Program.cs
にサービスを登録します。
builder.Services.AddScoped<TokenProvider>();
レイアウトと認証のフローの変更
プロジェクト ルートにあるアプリの Shared
フォルダーに RedirectToLogin
コンポーネント (RedirectToLogin.razor
) を追加します。
@inject NavigationManager Navigation
@code {
protected override void OnInitialized()
{
Navigation.NavigateTo("Identity/Account/Login?returnUrl=" +
Uri.EscapeDataString(Navigation.Uri), true);
}
}
アプリの Shared
フォルダーに LoginDisplay
コンポーネント (LoginDisplay.razor
) を追加します。 次の例のトークン プロバイダー サービスである TokenProvider
から、Identity のログアウト エンドポイントに POST する HTML フォームの XSRF トークンが提供されます。
@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>
要素のコンテンツに追加します。
<div class="top-row px-4 auth">
<LoginDisplay />
<a href="https://learn.microsoft.com/aspnet/" target="_blank">About</a>
</div>
認証エンドポイントをスタイル設定する
Blazor Server では Razor Pages Identity ページが使用されているため、訪問者が Identity ページとコンポーネント間を移動すると、UI のスタイル設定が変わります。 調和していないスタイルに対処するには、次の 2 つの選択肢があります。
カスタム Identity コンポーネント
ASP.NET Core Identity は、要求と応答の HTTP 通信のコンテキストで動作するように設計されています。これは、Blazor アプリの主要なクライアント/サーバー通信モデルではありません。 ユーザー管理に ASP.NET Core Identity を使用する ASP.NET Core アプリでは、ユーザー登録、ログイン、ログアウト、その他のユーザー管理タスクなど、Identity 関連の UI 用に、Razor コンポーネントではなく Razor Pages を使用する必要があります。
SignInManager<TUser> と UserManager<TUser> は Razor コンポーネントではサポートされていないため、Web API を使って、サーバー側 Identity 対応 ASP.NET Core アプリを介して Razor コンポーネントから Identity アクションを管理することをお勧めします。 Blazor アプリ用の Web API を作成するためのガイダンスについては、ASP.NET Core Blazor アプリから Web API を呼び出す方法に関する記事を参照してください。
Razor Pages の代わりに Identity に対して Razor コンポーネントを使用する方法の 1 つは、独自のカスタム IdentityRazor コンポーネントを作成することですが、Microsoft ではこの方法を推奨しておらず、サポートもしていません。 その他のコンテキストについては、以下のディスカッションを参照してください。 以下のディスカッションにおいて、イシュー コメントのコード例と、Microsoft 以外の GitHub リポジトリにクロスリンクされているコード例は、Microsoft ではサポートされていませんが、一部の開発者にとっては役立つかもしれません。
- Identity を使う場合のカスタム ログイン コンポーネントのサポート (dotnet/aspnetcore #13601)
- Razor コンポーネントでサポートされていない
SigninManager<T>
での繰り返し (dotnet/aspnetcore #34095) - サーバー側 blazor のカスタム ログイン フォームを実際に実装する方法に関する情報がありません (dotnet/AspNetCore.Docs #16813)
カスタム IdentityRazor コンポーネントを作成したい場合や、サードパーティの Razor コンポーネントを探している場合のさらなるサポートについては、次のリソースをお勧めします。
- Stack Overflow (タグ:
blazor
) (パブリック サポート フォーラム) - ASP.NET Core Slack Team (パブリック サポート チャット)
- Blazor Gitter (パブリック サポート チャット)
- Awesome Blazor (コミュニティによって管理されている Blazor リソースへのリンク)
Blazor アプリのスタイルでカスタム レイアウトを使用する
Identity ページのレイアウトとスタイルを変更して、既定の Blazor テーマを使用するページを生成できます。
注意
このセクションの例は、カスタマイズの開始点にすぎません。 最適なユーザー エクスペリエンスを実現するには、追加の作業が必要になる可能性があります。
新しい NavMenu_IdentityLayout
コンポーネント (Shared/NavMenu_IdentityLayout.razor
) を作成します。 コンポーネントのマークアップとコードについては、アプリの NavMenu
コンポーネントの同じコンテンツ (Shared/NavMenu.razor
) を使用します。 認証または認可を必要とするコンポーネントに対して RedirectToLogin
コンポーネントの自動リダイレクトが失敗するため、匿名でアクセスできないコンポーネントに対する NavLink
はすべて除去します。
Pages/Shared/Layout.cshtml
ファイルで、次の変更を行います。
ファイルの先頭に Razor ディレクティブを追加して、タグ ヘルパーと
Shared
フォルダー内のアプリのコンポーネントを使用します。@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers @using {APPLICATION ASSEMBLY}.Shared
{APPLICATION ASSEMBLY}
をアプリのアセンブリ名に置き換えます。<head>
コンテンツに<base>
タグと Blazor スタイルシート<link>
を追加します。<base href="~/" /> <link rel="stylesheet" href="~/css/site.css" />
<body>
タグの内容を以下のように変更します。<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://learn.microsoft.com/aspnet/" target="_blank">About</a> </div> <div class="content px-4"> @RenderBody() </div> </div> <script src="~/Identity/lib/jquery/dist/jquery.js"></script> <script src="~/Identity/lib/bootstrap/dist/js/bootstrap.bundle.js"></script> <script src="~/Identity/js/site.js" asp-append-version="true"></script> @RenderSection("Scripts", required: false) <script src="_framework/blazor.server.js"></script>
スタンドアロンまたはホストされた Blazor WebAssembly アプリ
クライアント側の Blazor WebAssembly アプリでは独自の Identity UI アプローチを使用し、ASP.NET Core Identity スキャフォールディングを使用することはできません。 ホストされた Blazor ソリューションのサーバー側の ASP.NET Core アプリは、この記事の Razor Pages/MVC ガイダンスに従うことができ、Identity をサポートする他の種類の ASP.NET Core アプリと同様に構成します。
Blazor フレームワークには、Razor コンポーネント バージョンの Identity UI ページは含まれていません。 Identity UI Razor コンポーネントは、カスタムで作成するか、サポートされていないサードパーティのソースから取得できます。
詳細については、Blazor セキュリティと Identity に関する記事をご覧ください。
完全な Identity UI ソースを作成する
Identity UI の完全な制御を維持するには、Identity スキャフォールディングを実行し、 [すべてのファイルをオーバーライド] を選択します。
パスワードの構成
PasswordOptions が Startup.ConfigureServices
で構成されている場合、[StringLength]
属性の構成が、スキャフォールディングされる Identity ページの Password
プロパティに必要になることがあります。 InputModel
Password
プロパティは、次のファイルにあります。
Areas/Identity/Pages/Account/Register.cshtml.cs
Areas/Identity/Pages/Account/ResetPassword.cshtml.cs
ページを無効にする
このセクションでは、登録ページを無効にする方法を示しますが、この方法を使用して任意のページを無効にできます。
ユーザー登録を無効にするには、次のようにします。
Identity をスキャフォールディングします。 Account.Register、Account.Login、Account.RegisterConfirmation を含めます。 次に例を示します。
dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
Areas/Identity/Pages/Account/Register.cshtml.cs
を更新して、ユーザーがこのエンドポイントから登録できないようにします。public class RegisterModel : PageModel { public IActionResult OnGet() { return RedirectToPage("Login"); } public IActionResult OnPost() { return RedirectToPage("Login"); } }
前の変更と一致するように
Areas/Identity/Pages/Account/Register.cshtml
を更新します。@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>
コメント アウトするか
Areas/Identity/Pages/Account/Login.cshtml
から登録リンクを削除します@* <p> <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a> </p> *@
Areas/Identity/Pages/Account/RegisterConfirmation ページを更新します。
- cshtml ファイルからコードとリンクを削除します。
PageModel
から確認コードを削除します。
[AllowAnonymous] public class RegisterConfirmationModel : PageModel { public IActionResult OnGet() { return Page(); } }
別のアプリを使用してユーザーを追加する
Web アプリの外部にユーザーを追加するメカニズムを提供します。 ユーザーを追加するオプションには次のものがあります。
- 専用管理者の Web アプリ。
- コンソール アプリ。
次のコードは、ユーザーを追加する 1 つの方法の概要を示しています。
- ユーザーの一覧がメモリに読み込まれる。
- ユーザーごとに強力な一意のパスワードが生成される。
- ユーザーが Identity データベースに追加される。
- ユーザーに通知され、パスワードを変更するように指示される。
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>();
});
}
次のコードは、ユーザー追加の概要を示しています。
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;
}
実稼働シナリオでも、同様のアプローチに従うことができます。
静的 Identity アセットを発行しないようにする
静的 Identity アセットを Web ルートに発行しないようにするには、「ASP.NET Core の Identity の概要」を参照してください。
ASP.NET Core では、ASP.NET Core Identity を Razor クラス ライブラリとして提供しています。 Identity を含むアプリケーションで、IdentityRazor クラス ライブラリ (RCL) に含まれるソース コードを選択的に追加するようにスキャフォールディングを適用できます。 コードを変更して動作を変更できるように、ソース コードを生成できます。 たとえば、登録で使用するコードを生成するようにスキャフォルダーに指示できます。 生成されたコードは、Identity RCL の同じコードよりも優先されます。 UI を完全に制御し、既定の RCL を使用しないようにするには、「完全な Identity UI ソースを作成する」セクションを参照してください。
認証を含まないアプリケーションでは、RCL Identity パッケージを追加するようにスキャフォールディングを適用できます。 生成される Identity コードの選択オプションがあります。
スキャフォールディングによって、必要なコードの大部分が生成されますが、プロセスを完了するにはプロジェクトを更新する必要があります。 このドキュメントでは、Identity スキャフォールディングの更新を完了するために必要な手順について説明します。
ファイルの差分が表示され、変更を取り消すことができるソース管理システムを使用することをお勧めします。 Identity スキャフォールディングを実行した後、変更内容を検査します。
サービスは、Identity で 2 要素認証、アカウントの確認とパスワードの回復、およびその他のセキュリティ機能を使用する場合に必要です。 サービスまたはサービス スタブは、Identity のスキャフォールディング時に生成されません。 これらの機能を有効にするサービスは、手動で追加する必要があります。 たとえば、電子メール確認の要求に関する記事をご覧ください。
既存の個別のアカウントで、新しいデータ コンテキストを持つプロジェクトに Identity をスキャフォールディングする場合は、次のようにします。
Startup.ConfigureServices
で、次の呼び出しを削除します。AddDbContext
AddDefaultIdentity
たとえば、次のコードでは、AddDbContext
と AddDefaultIdentity
がコメントアウトされています。
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();
}
上記のコードでは、Areas/Identity/IdentityHostingStartup.cs
内で重複しているコードがコメント アウトされています
通常は、個別のアカウントで作成されたアプリで、新しいデータ コンテキストを作成 "しない" ようにする必要があります。
空のプロジェクトに Identity をスキャフォールディングする
Identity スキャフォルダーを実行します。
- [ソリューション エクスプローラー] で、プロジェクトを右クリックし、>[追加]>[新しいスキャフォールディング アイテム] の順に選択します。
- [新規スキャフォールディング アイテムの追加] の左ペインから [Identity]>[追加] の順に選択します。
- [Identity の追加] ダイアログで、必要なオプションを選択します。
- 既存のレイアウト ページを選択します。しない場合、正しくないマークアップでレイアウトファイルが上書きされます。
- Razor Pages の場合は
~/Pages/Shared/_Layout.cshtml
- MVC プロジェクトの場合は
~/Views/Shared/_Layout.cshtml
- Blazor Server テンプレート (
blazorserver
) から作成された Blazor Server アプリは、既定では Razor Pages 用または MVC 用に構成されていません。 レイアウト ページは空白のままにします。
- Razor Pages の場合は
- + ボタンを選択して、新しいデータ コンテキスト クラスを作成します。 既定値を受け入れるか、クラスを指定します (例:
MyApplication.Data.ApplicationDbContext
)。
- 既存のレイアウト ページを選択します。しない場合、正しくないマークアップでレイアウトファイルが上書きされます。
- [追加] を選択します。
Startup
クラスを次のようなコードで更新します。
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
は推奨されますが必須ではありません。 詳細については、HTTP トランスポート セキュリティのプロトコルに関するページを参照してください。
生成された Identity データベース コードには、Entity Framework Core 移行が必要です。 移行を作成し、データベースを更新します。 たとえば、次のコマンドを実行します。
Visual Studio パッケージ マネージャー コンソールの場合:
Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database
Add-Migration
コマンドの "CreateIdentitySchema" name パラメーターは任意です。 "CreateIdentitySchema"
は移行について説明するものです。
Razor プロジェクトに既存の認可なしで Identity をスキャフォールディングする
Identity スキャフォルダーを実行します。
- [ソリューション エクスプローラー] で、プロジェクトを右クリックし、>[追加]>[新しいスキャフォールディング アイテム] の順に選択します。
- [新規スキャフォールディング アイテムの追加] の左ペインから [Identity]>[追加] の順に選択します。
- [Identity の追加] ダイアログで、必要なオプションを選択します。
- 既存のレイアウト ページを選択します。しない場合、正しくないマークアップでレイアウトファイルが上書きされます。
- Razor Pages の場合は
~/Pages/Shared/_Layout.cshtml
- MVC プロジェクトの場合は
~/Views/Shared/_Layout.cshtml
- Blazor Server テンプレート (
blazorserver
) から作成された Blazor Server アプリは、既定では Razor Pages 用または MVC 用に構成されていません。 レイアウト ページは空白のままにします。
- Razor Pages の場合は
- + ボタンを選択して、新しいデータ コンテキスト クラスを作成します。 既定値を受け入れるか、クラスを指定します (例:
MyApplication.Data.ApplicationDbContext
)。
- 既存のレイアウト ページを選択します。しない場合、正しくないマークアップでレイアウトファイルが上書きされます。
- [追加] を選択します。
Identity は Areas/Identity/IdentityHostingStartup.cs
で構成されます。 詳細については、IHostingStartup に関する記事をご覧ください。
移行、UseAuthentication、レイアウト
生成された Identity データベース コードには、Entity Framework Core 移行が必要です。 移行を作成し、データベースを更新します。 たとえば、次のコマンドを実行します。
Visual Studio パッケージ マネージャー コンソールの場合:
Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database
Add-Migration
コマンドの "CreateIdentitySchema" name パラメーターは任意です。 "CreateIdentitySchema"
は移行について説明するものです。
認証を有効にする
Startup
クラスを次のようなコードで更新します。
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
は推奨されますが必須ではありません。 詳細については、HTTP トランスポート セキュリティのプロトコルに関するページを参照してください。
レイアウトの変更
省略可能: ログイン部分 (_LoginPartial
) をレイアウト ファイルに追加します。
<!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.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">
© 2019 - WebRP - <a asp-area="" asp-page="/Privacy">Privacy</a>
</div>
</footer>
<script src="~/lib/jquery/dist/jquery.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
@RenderSection("Scripts", required: false)
</body>
</html>
Razor プロジェクトに認可ありで Identity をスキャフォールディングする
Identity スキャフォルダーを実行します。
- [ソリューション エクスプローラー] で、プロジェクトを右クリックし、>[追加]>[新しいスキャフォールディング アイテム] の順に選択します。
- [新規スキャフォールディング アイテムの追加] の左ペインから [Identity] を選択します。 中央のウィンドウで [Identity] を選択します。 [追加] ボタンを選びます。
- [Identity の追加] ダイアログで、必要なオプションを選択します。
- レイアウト ファイルが正しくないマークアップで上書きされないように、既存のレイアウト ページを選択します。 既存の
_Layout.cshtml
ファイルが選択されている場合は、上書きされません。 次に例を示します。- 既存の Razor Pages インフラストラクチャが含まれる、Razor Pages プロジェクトまたは Blazor Server プロジェクトの
~/Pages/Shared/_Layout.cshtml
- 既存の MVC インフラストラクチャが含まれる、MVC プロジェクトまたは Blazor Server プロジェクトの
~/Views/Shared/_Layout.cshtml
- 既存の Razor Pages インフラストラクチャが含まれる、Razor Pages プロジェクトまたは Blazor Server プロジェクトの
- レイアウト ファイルが正しくないマークアップで上書きされないように、既存のレイアウト ページを選択します。 既存の
- 既存のデータ コンテキストを使用するには、オーバーライドするファイルを 1 つ以上選択します。 データ コンテキストを追加するには、1 つ以上のファイルを選択する必要があります。
- データ コンテキスト クラスを選択します。
- [追加] を選択します。
- 新しいユーザー コンテキストを作成し、場合によって Identity カスタム ユーザー クラスを作成するには、次の操作を行います。
- + ボタンを選択して、新しいデータ コンテキスト クラスを作成します。 既定値を受け入れるか、クラスを指定します (例:
MyApplication.Data.ApplicationDbContext
)。 - [追加] を選択します。
- + ボタンを選択して、新しいデータ コンテキスト クラスを作成します。 既定値を受け入れるか、クラスを指定します (例:
注: 新しいユーザー コンテキストを作成している場合、上書きするファイルを選択する必要はありません。
Identity スキャフォールディングを実行します。
- [ソリューション エクスプローラー] で、プロジェクトを右クリックし、>[追加]>[新しいスキャフォールディング アイテム] の順に選択します。
- [スキャフォールディングを追加] ダイアログの左ペインで、[Identity]>[追加] の順に選択します。
- [Identity の追加] ダイアログで、必要なオプションを選択します。
- レイアウト ファイルが正しくないマークアップで上書きされないように、既存のレイアウト ページを選択します。 既存の _Layout.cshtml ファイルが選択されている場合は、上書きされません。 次に例を示します。
- 既存の Razor Pages インフラストラクチャが含まれる、Razor Pages プロジェクトまたは Blazor Server プロジェクトの
~/Pages/Shared/_Layout.cshtml
- 既存の MVC インフラストラクチャが含まれる、MVC プロジェクトまたは Blazor Server プロジェクトの
~/Views/Shared/_Layout.cshtml
- 既存の Razor Pages インフラストラクチャが含まれる、Razor Pages プロジェクトまたは Blazor Server プロジェクトの
- レイアウト ファイルが正しくないマークアップで上書きされないように、既存のレイアウト ページを選択します。 既存の _Layout.cshtml ファイルが選択されている場合は、上書きされません。 次に例を示します。
- 既存のデータ コンテキストを使用するには、オーバーライドするファイルを 1 つ以上選択します。 データ コンテキストを追加するには、1 つ以上のファイルを選択する必要があります。
- データ コンテキスト クラスを選択します。
- [追加] を選択します。
- 新しいユーザー コンテキストを作成し、場合によって Identity カスタム ユーザー クラスを作成するには、次の操作を行います。
- + ボタンを選択して、新しいデータ コンテキスト クラスを作成します。 既定値を受け入れるか、クラスを指定します (例:
MyApplication.Data.ApplicationDbContext
)。 - [追加] を選択します。
- + ボタンを選択して、新しいデータ コンテキスト クラスを作成します。 既定値を受け入れるか、クラスを指定します (例:
注: 新しいユーザー コンテキストを作成している場合、上書きするファイルを選択する必要はありません。
一部の Identity オプションは、Areas/Identity/IdentityHostingStartup.cs
内で構成されます。 詳細については、IHostingStartup に関する記事をご覧ください。
MVC プロジェクトに既存の認可なしで Identity をスキャフォールディングする
Identity スキャフォルダーを実行します。
- [ソリューション エクスプローラー] で、プロジェクトを右クリックし、>[追加]>[新しいスキャフォールディング アイテム] の順に選択します。
- [新規スキャフォールディング アイテムの追加] の左ペインから [Identity]>[追加] の順に選択します。
- [Identity の追加] ダイアログで、必要なオプションを選択します。
- 既存のレイアウト ページを選択します。しない場合、正しくないマークアップでレイアウトファイルが上書きされます。
- Razor Pages の場合は
~/Pages/Shared/_Layout.cshtml
- MVC プロジェクトの場合は
~/Views/Shared/_Layout.cshtml
- Blazor Server テンプレート (
blazorserver
) から作成された Blazor Server アプリは、既定では Razor Pages 用または MVC 用に構成されていません。 レイアウト ページは空白のままにします。
- Razor Pages の場合は
- + ボタンを選択して、新しいデータ コンテキスト クラスを作成します。 既定値を受け入れるか、クラスを指定します (例:
MyApplication.Data.ApplicationDbContext
)。
- 既存のレイアウト ページを選択します。しない場合、正しくないマークアップでレイアウトファイルが上書きされます。
- [追加] を選択します。
省略可能: ログイン部分 (_LoginPartial
) を Views/Shared/_Layout.cshtml
ファイルに追加します。
<!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.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">
© 2019 - WebRP - <a asp-area="" asp-page="/Privacy">Privacy</a>
</div>
</footer>
<script src="~/lib/jquery/dist/jquery.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.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.cshtml
に移動します
Identity は Areas/Identity/IdentityHostingStartup.cs
で構成されます。 詳細については、IHostingStartup に関する記事をご覧ください。
生成された Identity データベース コードには、Entity Framework Core 移行が必要です。 移行を作成し、データベースを更新します。 たとえば、次のコマンドを実行します。
Visual Studio パッケージ マネージャー コンソールの場合:
Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database
Add-Migration
コマンドの "CreateIdentitySchema" name パラメーターは任意です。 "CreateIdentitySchema"
は移行について説明するものです。
Startup
クラスを次のようなコードで更新します。
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
は推奨されますが必須ではありません。 詳細については、HTTP トランスポート セキュリティのプロトコルに関するページを参照してください。
MVC プロジェクトに認可ありで Identity をスキャフォールディングする
Identity スキャフォルダーを実行します。
- [ソリューション エクスプローラー] で、プロジェクトを右クリックし、>[追加]>[新しいスキャフォールディング アイテム] の順に選択します。
- [新規スキャフォールディング アイテムの追加] の左ペインから [Identity] を選択します。 中央のウィンドウで [Identity] を選択します。 [追加] ボタンを選びます。
- [Identity の追加] ダイアログで、必要なオプションを選択します。
- レイアウト ファイルが正しくないマークアップで上書きされないように、既存のレイアウト ページを選択します。 既存の
_Layout.cshtml
ファイルが選択されている場合は、上書きされません。 次に例を示します。- 既存の Razor Pages インフラストラクチャが含まれる、Razor Pages プロジェクトまたは Blazor Server プロジェクトの
~/Pages/Shared/_Layout.cshtml
- 既存の MVC インフラストラクチャが含まれる、MVC プロジェクトまたは Blazor Server プロジェクトの
~/Views/Shared/_Layout.cshtml
- 既存の Razor Pages インフラストラクチャが含まれる、Razor Pages プロジェクトまたは Blazor Server プロジェクトの
- レイアウト ファイルが正しくないマークアップで上書きされないように、既存のレイアウト ページを選択します。 既存の
- 既存のデータ コンテキストを使用するには、オーバーライドするファイルを 1 つ以上選択します。 データ コンテキストを追加するには、1 つ以上のファイルを選択する必要があります。
- データ コンテキスト クラスを選択します。
- [追加] を選択します。
- 新しいユーザー コンテキストを作成し、場合によって Identity カスタム ユーザー クラスを作成するには、次の操作を行います。
- + ボタンを選択して、新しいデータ コンテキスト クラスを作成します。 既定値を受け入れるか、クラスを指定します (例:
MyApplication.Data.ApplicationDbContext
)。 - [追加] を選択します。
- + ボタンを選択して、新しいデータ コンテキスト クラスを作成します。 既定値を受け入れるか、クラスを指定します (例:
注: 新しいユーザー コンテキストを作成している場合、上書きするファイルを選択する必要はありません。
Identity スキャフォールディングを実行します。
- [ソリューション エクスプローラー] で、プロジェクトを右クリックし、>[追加]>[新しいスキャフォールディング アイテム] の順に選択します。
- [スキャフォールディングを追加] ダイアログの左ペインで、[Identity]>[追加] の順に選択します。
- [Identity の追加] ダイアログで、必要なオプションを選択します。
- レイアウト ファイルが正しくないマークアップで上書きされないように、既存のレイアウト ページを選択します。 既存の _Layout.cshtml ファイルが選択されている場合は、上書きされません。 次に例を示します。
- 既存の Razor Pages インフラストラクチャが含まれる、Razor Pages プロジェクトまたは Blazor Server プロジェクトの
~/Pages/Shared/_Layout.cshtml
- 既存の MVC インフラストラクチャが含まれる、MVC プロジェクトまたは Blazor Server プロジェクトの
~/Views/Shared/_Layout.cshtml
- 既存の Razor Pages インフラストラクチャが含まれる、Razor Pages プロジェクトまたは Blazor Server プロジェクトの
- レイアウト ファイルが正しくないマークアップで上書きされないように、既存のレイアウト ページを選択します。 既存の _Layout.cshtml ファイルが選択されている場合は、上書きされません。 次に例を示します。
- 既存のデータ コンテキストを使用するには、オーバーライドするファイルを 1 つ以上選択します。 データ コンテキストを追加するには、1 つ以上のファイルを選択する必要があります。
- データ コンテキスト クラスを選択します。
- [追加] を選択します。
- 新しいユーザー コンテキストを作成し、場合によって Identity カスタム ユーザー クラスを作成するには、次の操作を行います。
- + ボタンを選択して、新しいデータ コンテキスト クラスを作成します。 既定値を受け入れるか、クラスを指定します (例:
MyApplication.Data.ApplicationDbContext
)。 - [追加] を選択します。
- + ボタンを選択して、新しいデータ コンテキスト クラスを作成します。 既定値を受け入れるか、クラスを指定します (例:
注: 新しいユーザー コンテキストを作成している場合、上書きするファイルを選択する必要はありません。
Blazor Server プロジェクトに既存の認可なしで Identity をスキャフォールディングする
Identity スキャフォルダーを実行します。
- [ソリューション エクスプローラー] で、プロジェクトを右クリックし、>[追加]>[新しいスキャフォールディング アイテム] の順に選択します。
- [新規スキャフォールディング アイテムの追加] の左ペインから [Identity]>[追加] の順に選択します。
- [Identity の追加] ダイアログで、必要なオプションを選択します。
- 既存のレイアウト ページを選択します。しない場合、正しくないマークアップでレイアウトファイルが上書きされます。
- Razor Pages の場合は
~/Pages/Shared/_Layout.cshtml
- MVC プロジェクトの場合は
~/Views/Shared/_Layout.cshtml
- Blazor Server テンプレート (
blazorserver
) から作成された Blazor Server アプリは、既定では Razor Pages 用または MVC 用に構成されていません。 レイアウト ページは空白のままにします。
- Razor Pages の場合は
- + ボタンを選択して、新しいデータ コンテキスト クラスを作成します。 既定値を受け入れるか、クラスを指定します (例:
MyApplication.Data.ApplicationDbContext
)。
- 既存のレイアウト ページを選択します。しない場合、正しくないマークアップでレイアウトファイルが上書きされます。
- [追加] を選択します。
Identity は Areas/Identity/IdentityHostingStartup.cs
で構成されます。 詳細については、IHostingStartup に関する記事をご覧ください。
移行
生成された Identity データベース コードには、Entity Framework Core 移行が必要です。 移行を作成し、データベースを更新します。 たとえば、次のコマンドを実行します。
Visual Studio パッケージ マネージャー コンソールの場合:
Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database
Add-Migration
コマンドの "CreateIdentitySchema" name パラメーターは任意です。 "CreateIdentitySchema"
は移行について説明するものです。
XSRF トークンをアプリに渡す
トークンは、コンポーネントに渡すことができます。
- 認証トークンは、プロビジョニングされて認証 cookie に保存されると、コンポーネントに渡すことができるようになります。
- Razor コンポーネントで
HttpContext
を直接使用することはできないため、要求偽造防止 (XSRF) トークンを取得して/Identity/Account/Logout
で Identity のログアウト エンドポイントに POST する方法がありません。 XSRF トークンは、コンポーネントに渡すことができます。
詳細については、「ASP.NET Core Blazor Server のその他のセキュリティ シナリオ」を参照してください。
Pages/_Host.cshtml
ファイルで、トークンを InitialApplicationState
および TokenProvider
クラスに追加した後で設定します。
@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf
...
var tokens = new InitialApplicationState
{
...
XsrfToken = Xsrf.GetAndStoreTokens(HttpContext).RequestToken
};
App
コンポーネント (App.razor
) を更新して InitialState.XsrfToken
を割り当てます。
@inject TokenProvider TokenProvider
...
TokenProvider.XsrfToken = InitialState.XsrfToken;
このトピックで示した TokenProvider
サービスは、次の「レイアウトと認証フローの変更」セクションの LoginDisplay
コンポーネントで使用します。
認証を有効にする
Startup
クラスで、以下を実行します。
- Razor Pages サービスが
Startup.ConfigureServices
に追加されていることを確認します。 - TokenProvider を使用する場合に、このサービスを登録します。
- 開発環境用に
Startup.Configure
でアプリケーション ビルダーのUseDatabaseErrorPage
を呼び出します。 UseAuthentication
とUseAuthorization
をUseRouting
の後に呼び出します。- 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
は推奨されますが必須ではありません。 詳細については、HTTP トランスポート セキュリティのプロトコルに関するページを参照してください。
レイアウトと認証のフローの変更
プロジェクト ルートにあるアプリの Shared フォルダーに RedirectToLogin
コンポーネント (RedirectToLogin.razor
) を追加します。
@inject NavigationManager Navigation
@code {
protected override void OnInitialized()
{
Navigation.NavigateTo("Identity/Account/Login?returnUrl=" +
Uri.EscapeDataString(Navigation.Uri), true);
}
}
アプリの Shared フォルダーに LoginDisplay
コンポーネント (LoginDisplay.razor
) を追加します。 TokenProvider サービスから、Identity のログアウト エンドポイントに POST する HTML フォームの XSRF トークンが提供されます。
@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>
要素のコンテンツに追加します。
<div class="top-row px-4 auth">
<LoginDisplay />
<a href="https://learn.microsoft.com/aspnet/" target="_blank">About</a>
</div>
認証エンドポイントをスタイル設定する
Blazor Server では Razor Pages Identity ページが使用されているため、訪問者が Identity ページとコンポーネント間を移動すると、UI のスタイル設定が変わります。 調和していないスタイルに対処するには、次の 2 つの選択肢があります。
Identity コンポーネントを構築する
ページの代わりに Identity のコンポーネントを使用する方法で、Identity コンポーネントを構築します。 SignInManager
と UserManager
は Razor コンポーネントでサポートされていないため、Blazor Server アプリで API エンドポイントを使用してユーザー アカウントの操作を処理します。
Blazor アプリのスタイルでカスタム レイアウトを使用する
Identity ページのレイアウトとスタイルを変更して、既定の Blazor テーマを使用するページを生成できます。
注意
このセクションの例は、カスタマイズの開始点にすぎません。 最適なユーザー エクスペリエンスを実現するには、追加の作業が必要になる可能性があります。
新しい NavMenu_IdentityLayout
コンポーネント (Shared/NavMenu_IdentityLayout.razor
) を作成します。 コンポーネントのマークアップとコードについては、アプリの NavMenu
コンポーネントの同じコンテンツ (Shared/NavMenu.razor
) を使用します。 認証または認可を必要とするコンポーネントに対して RedirectToLogin
コンポーネントの自動リダイレクトが失敗するため、匿名でアクセスできないコンポーネントに対する NavLink
はすべて除去します。
Pages/Shared/Layout.cshtml
ファイルで、次の変更を行います。
ファイルの先頭に Razor ディレクティブを追加して、タグ ヘルパーと Shared フォルダー内のアプリのコンポーネントを使用します。
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers @using {APPLICATION ASSEMBLY}.Shared
{APPLICATION ASSEMBLY}
をアプリのアセンブリ名に置き換えます。<head>
コンテンツに<base>
タグと Blazor スタイルシート<link>
を追加します。<base href="~/" /> <link rel="stylesheet" href="~/css/site.css" />
<body>
タグの内容を以下のように変更します。<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://learn.microsoft.com/aspnet/" target="_blank">About</a> </div> <div class="content px-4"> @RenderBody() </div> </div> <script src="~/Identity/lib/jquery/dist/jquery.js"></script> <script src="~/Identity/lib/bootstrap/dist/js/bootstrap.bundle.js"></script> <script src="~/Identity/js/site.js" asp-append-version="true"></script> @RenderSection("Scripts", required: false) <script src="_framework/blazor.server.js"></script>
Blazor Server プロジェクトに認可ありで Identity をスキャフォールディングする
Identity スキャフォルダーを実行します。
- [ソリューション エクスプローラー] で、プロジェクトを右クリックし、>[追加]>[新しいスキャフォールディング アイテム] の順に選択します。
- [新規スキャフォールディング アイテムの追加] の左ペインから [Identity] を選択します。 中央のウィンドウで [Identity] を選択します。 [追加] ボタンを選びます。
- [Identity の追加] ダイアログで、必要なオプションを選択します。
- レイアウト ファイルが正しくないマークアップで上書きされないように、既存のレイアウト ページを選択します。 既存の
_Layout.cshtml
ファイルが選択されている場合は、上書きされません。 次に例を示します。- 既存の Razor Pages インフラストラクチャが含まれる、Razor Pages プロジェクトまたは Blazor Server プロジェクトの
~/Pages/Shared/_Layout.cshtml
- 既存の MVC インフラストラクチャが含まれる、MVC プロジェクトまたは Blazor Server プロジェクトの
~/Views/Shared/_Layout.cshtml
- 既存の Razor Pages インフラストラクチャが含まれる、Razor Pages プロジェクトまたは Blazor Server プロジェクトの
- レイアウト ファイルが正しくないマークアップで上書きされないように、既存のレイアウト ページを選択します。 既存の
- 既存のデータ コンテキストを使用するには、オーバーライドするファイルを 1 つ以上選択します。 データ コンテキストを追加するには、1 つ以上のファイルを選択する必要があります。
- データ コンテキスト クラスを選択します。
- [追加] を選択します。
- 新しいユーザー コンテキストを作成し、場合によって Identity カスタム ユーザー クラスを作成するには、次の操作を行います。
- + ボタンを選択して、新しいデータ コンテキスト クラスを作成します。 既定値を受け入れるか、クラスを指定します (例:
MyApplication.Data.ApplicationDbContext
)。 - [追加] を選択します。
- + ボタンを選択して、新しいデータ コンテキスト クラスを作成します。 既定値を受け入れるか、クラスを指定します (例:
注: 新しいユーザー コンテキストを作成している場合、上書きするファイルを選択する必要はありません。
Identity スキャフォールディングを実行します。
- [ソリューション エクスプローラー] で、プロジェクトを右クリックし、>[追加]>[新しいスキャフォールディング アイテム] の順に選択します。
- [スキャフォールディングを追加] ダイアログの左ペインで、[Identity]>[追加] の順に選択します。
- [Identity の追加] ダイアログで、必要なオプションを選択します。
- レイアウト ファイルが正しくないマークアップで上書きされないように、既存のレイアウト ページを選択します。 既存の _Layout.cshtml ファイルが選択されている場合は、上書きされません。 次に例を示します。
- 既存の Razor Pages インフラストラクチャが含まれる、Razor Pages プロジェクトまたは Blazor Server プロジェクトの
~/Pages/Shared/_Layout.cshtml
- 既存の MVC インフラストラクチャが含まれる、MVC プロジェクトまたは Blazor Server プロジェクトの
~/Views/Shared/_Layout.cshtml
- 既存の Razor Pages インフラストラクチャが含まれる、Razor Pages プロジェクトまたは Blazor Server プロジェクトの
- レイアウト ファイルが正しくないマークアップで上書きされないように、既存のレイアウト ページを選択します。 既存の _Layout.cshtml ファイルが選択されている場合は、上書きされません。 次に例を示します。
- 既存のデータ コンテキストを使用するには、オーバーライドするファイルを 1 つ以上選択します。 データ コンテキストを追加するには、1 つ以上のファイルを選択する必要があります。
- データ コンテキスト クラスを選択します。
- [追加] を選択します。
- 新しいユーザー コンテキストを作成し、場合によって Identity カスタム ユーザー クラスを作成するには、次の操作を行います。
- + ボタンを選択して、新しいデータ コンテキスト クラスを作成します。 既定値を受け入れるか、クラスを指定します (例:
MyApplication.Data.ApplicationDbContext
)。 - [追加] を選択します。
- + ボタンを選択して、新しいデータ コンテキスト クラスを作成します。 既定値を受け入れるか、クラスを指定します (例:
注: 新しいユーザー コンテキストを作成している場合、上書きするファイルを選択する必要はありません。
一部の Identity オプションは、Areas/Identity/IdentityHostingStartup.cs
内で構成されます。 詳細については、IHostingStartup に関する記事をご覧ください。
スタンドアロンまたはホストされた Blazor WebAssembly アプリ
クライアント側の Blazor WebAssembly アプリでは独自の Identity UI アプローチを使用し、ASP.NET Core Identity スキャフォールディングを使用することはできません。 ホストされた Blazor ソリューションのサーバー側の ASP.NET Core アプリは、この記事の Razor Pages/MVC ガイダンスに従うことができ、Identity をサポートする他の種類の ASP.NET Core アプリと同様に構成します。
Blazor フレームワークには、Razor コンポーネント バージョンの Identity UI ページは含まれていません。 Identity UI Razor コンポーネントは、カスタムで作成するか、サポートされていないサードパーティのソースから取得できます。
詳細については、Blazor セキュリティと Identity に関する記事をご覧ください。
完全な Identity UI ソースを作成する
Identity UI の完全な制御を維持するには、Identity スキャフォールディングを実行し、 [すべてのファイルをオーバーライド] を選択します。
次の強調表示されたコードは、ASP.NET Core 2.1 Web アプリで既定の Identity UI を Identity に置き換える変更を示しています。 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()
.AddRazorPagesOptions(options =>
{
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 が置き換えられています。
services.AddIdentity<IdentityUser, IdentityRole>()
// services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
次のコードでは、LoginPath、LogoutPath、AccessDeniedPath を設定します。
services.ConfigureApplicationCookie(options =>
{
options.LoginPath = $"/Identity/Account/Login";
options.LogoutPath = $"/Identity/Account/Logout";
options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
});
たとえば、IEmailSender
の実装を登録します。
// 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;
}
}
パスワードの構成
PasswordOptions が Startup.ConfigureServices
で構成されている場合、[StringLength]
属性の構成が、スキャフォールディングされる Identity ページの Password
プロパティに必要になることがあります。 InputModel
Password
プロパティは、次のファイルにあります。
Areas/Identity/Pages/Account/Register.cshtml.cs
Areas/Identity/Pages/Account/ResetPassword.cshtml.cs
ページを無効にする
このセクションでは、登録ページを無効にする方法を示しますが、この方法を使用して任意のページを無効にできます。
ユーザー登録を無効にするには、次のようにします。
Identity をスキャフォールディングします。 Account.Register、Account.Login、Account.RegisterConfirmation を含めます。 次に例を示します。
dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
Areas/Identity/Pages/Account/Register.cshtml.cs
を更新して、ユーザーがこのエンドポイントから登録できないようにします。public class RegisterModel : PageModel { public IActionResult OnGet() { return RedirectToPage("Login"); } public IActionResult OnPost() { return RedirectToPage("Login"); } }
前の変更と一致するように
Areas/Identity/Pages/Account/Register.cshtml
を更新します。@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>
コメント アウトするか
Areas/Identity/Pages/Account/Login.cshtml
から登録リンクを削除します@* <p> <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a> </p> *@
Areas/Identity/Pages/Account/RegisterConfirmation ページを更新します。
- cshtml ファイルからコードとリンクを削除します。
PageModel
から確認コードを削除します。
[AllowAnonymous] public class RegisterConfirmationModel : PageModel { public IActionResult OnGet() { return Page(); } }
別のアプリを使用してユーザーを追加する
Web アプリの外部にユーザーを追加するメカニズムを提供します。 ユーザーを追加するオプションには次のものがあります。
- 専用管理者の Web アプリ。
- コンソール アプリ。
次のコードは、ユーザーを追加する 1 つの方法の概要を示しています。
- ユーザーの一覧がメモリに読み込まれる。
- ユーザーごとに強力な一意のパスワードが生成される。
- ユーザーが Identity データベースに追加される。
- ユーザーに通知され、パスワードを変更するように指示される。
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>();
});
}
次のコードは、ユーザー追加の概要を示しています。
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;
}
実稼働シナリオでも、同様のアプローチに従うことができます。
静的 Identity アセットを発行しないようにする
静的 Identity アセットを Web ルートに発行しないようにするには、「ASP.NET Core の Identity の概要」を参照してください。