ASP.NET Core Identity:
- ユーザー インターフェイス (UI) ログイン機能をサポートする API です。
- ユーザー、パスワード、プロファイル データ、ロール、要求、トークン、電子メールの確認などを管理します。
ユーザーは、Identity に格納されているログイン情報を使用してアカウントを作成することができます。あるいは、外部ログイン プロバイダーを使用できます。 サポートされている外部ログイン プロバイダーには、Facebook、Google、Microsoft アカウント、Twitter があります。
すべてのアプリ ユーザーに認証を要求する方法については、「承認によって保護されたユーザー データを使用して ASP.NET Core アプリを作成するを参照してください。
Identity ソース コードは、GitHubで使用できます。 Identity をスキャフォールディングし、生成されたファイルを表示してテンプレートと Identity とのやりとりを確認します。
Identityは、通常、ユーザー名、パスワード、プロファイル データを格納するためにSQL Server データベースを使用して構成されます。 別の永続的なストアを使用することもできます (たとえば、table Storage Azure)。
このトピックでは、Identity を使用して、ユーザーの登録、ログイン、およびログアウトを行う方法について学習します。 注: テンプレートでは、ユーザーのユーザー名と電子メールを同じものとして扱います。 Identity を使用するアプリの作成に関する詳細な手順については、「次の手順」を参照してください。
Identity アプリのBlazorの詳細については、ASP.NET Core Blazor 認証と承認およびBlazor ドキュメントの記事を参照してください。
ASP.NET Core Identity は、Microsoft ID プラットフォームに関連していません。 Microsoft ID プラットフォームは次のとおりです。
- Azure Active Directory (Azure AD) 開発者プラットフォームの進化。
- ASP.NET Core アプリでの認証と承認のための代替 ID ソリューション。
ASP.NET Core Identity は、ユーザー インターフェイス (UI) ログイン機能を ASP.NET Core web appsに追加します。 Web API と SPA をセキュリティで保護するには、次のいずれかを使用します。
Duende Identity Server は、ASP.NET Core用の OpenID Connect および OAuth 2.0 フレームワークです。 Duende Identity Server により、次のセキュリティ機能が有効になります。
- サービスとしての認証 (AaaS)
- 複数のアプリケーションの種類でのシングル サインオン/オフ (SSO)
- API のアクセス制御
- フェデレーション ゲートウェイ
Important
Duende Software により、Duende Identity Server を実稼働で使用することのライセンス料の支払いが求められる場合があります。 詳細については、.NET 5 の ASP.NET Core から .NET 6 への移行を参照してください。
詳細については、 Duende Identity Server のドキュメント (Duende Software Web サイト) を参照してください。
サンプル コードを表示またはダウンロード (ダウンロードする方法)。
認証を使用して Blazor Web App を作成する
個々のアカウントで ASP.NET Core Blazor Web App project を作成します。
Note
Razor Pages エクスペリエンスについては、「認証を使用して Razor Pages アプリを作成する」セクションを参照してください。
MVC エクスペリエンスについては、「認証を使用 した MVC アプリの作成 」セクションを参照してください。
- Blazor Web App テンプレートを選択します。 次へを選択します。
- 次の選択を行います。
- 認証の種類: 個々のアカウント
- 対話型レンダリング モード: サーバー
- 対話機能の場所: グローバル
- を選択してを作成します。
生成されたprojectには、IdentityRazor コンポーネントが含まれます。 コンポーネントは、サーバー projectの Components/Account フォルダーにあります。 例えば次が挙げられます。
Components/Account/Pages/Register.razorComponents/Account/Pages/Login.razorComponents/Account/Pages/Manage/ChangePassword.razor
Identity
Razor コンポーネントは、特定のユース ケースのドキュメントで個別に説明されており、リリースごとに変更される可能性があります。 個々のアカウントで Blazor Web App を生成すると、IdentityRazor コンポーネントが生成されたprojectに含まれます。
Identity
Razor コンポーネントは、Components/Accountのサーバー projectの Blazor Web App フォルダーでも検査できます。
Note
.NET参照ソースへのドキュメント リンクは、通常、リポジトリの既定のブランチを読み込みます。これは、.NETの次のリリースの現在の開発を表します。 特定のリリースのタグを選択するには、[Switch branches or tags](ブランチまたはタグの切り替え) ドロップダウン リストを使います。 詳細については、「ASP.NET Core ソース コードのバージョン タグを選択する方法 (dotnet/AspNetCore.Docs #26205)を参照してください。
詳細については、ASP.NET Core Blazor 認証と承認 および Blazor ドキュメントの記事を参照してください。 メイン ASP.NET Core ドキュメント セットの Security と Identity 領域のほとんどの記事は、Blazor アプリに適用されます。 ただし、 Blazor ドキュメント セットには、情報を置き換えたり追加したりする記事とガイダンスが含まれています。 最初に設定された一般的な ASP.NET Coreのドキュメントを確認してから、BlazorSecurity および Identity ドキュメントの記事にアクセスすることをお勧めします。
認証を使用して Razor Pages アプリを作成する
個別アカウントを使用して、ASP.NET Core Web アプリケーション (Razor ページ) プロジェクトを作成します。
- ASP.NET Core Web App (Razor ページ) テンプレートを選択します。 次へを選択します。
- [認証の種類] で、[個々のアカウント] を選択します。
- を選択してを作成します。
生成されたprojectは、ASP.NET Core Identityを Razor クラス ライブラリ (RCL) として提供します。
Identity
Razor クラス ライブラリにより、Identity 領域でエンドポイントが公開されます。 例えば次が挙げられます。
Areas/Identity/Pages/Account/RegisterAreas/Identity/Pages/Account/LoginAreas/Identity/Pages/Account/Manage/ChangePassword
ページは、特定のユース ケースのドキュメントで個別に説明されており、リリースごとに変更される可能性があります。 RCL 内のすべてのページを表示するには、ASP.NET Core参照ソース (dotnet/aspnetcore GitHub リポジトリ、Identity/UI/src/Areas/Identity/Pages フォルダー)を参照してください。 個々のページまたはすべてのページをアプリに スキャフォールディング できます。 詳細については、ASP.NET Core プロジェクトの Scaffold Identityを参照してください。
認証を使用して MVC アプリを作成する
個々のアカウントで ASP.NET Core MVC projectを作成します。
- ASP.NET Core Web App (Model-View-Controller) テンプレートを選択します。 次へを選択します。
- [認証の種類] で、[個々のアカウント] を選択します。
- を選択してを作成します。
生成されたprojectは、ASP.NET Core Identityを Razor クラス ライブラリ (RCL) として提供します。
Identity
Razor クラス ライブラリは、Razor Pages に基づいており、Identity領域を持つエンドポイントを公開します。 例えば次が挙げられます。
Areas/Identity/Pages/Account/RegisterAreas/Identity/Pages/Account/LoginAreas/Identity/Pages/Account/Manage/ChangePassword
ページは、特定のユース ケースのドキュメントで個別に説明されており、リリースごとに変更される可能性があります。 RCL 内のすべてのページを表示するには、ASP.NET Core参照ソース (dotnet/aspnetcore GitHub リポジトリ、Identity/UI/src/Areas/Identity/Pages フォルダー)を参照してください。 個々のページまたはすべてのページをアプリに スキャフォールディング できます。 詳細については、ASP.NET Core プロジェクトの Scaffold Identityを参照してください。
移行を適用する
移行を適用してデータベースを初期化します。
パッケージ マネージャー コンソール (PMC) で次のコマンドを実行します。
Update-Database
登録とログインをテストする
アプリを実行し、ユーザーを登録します。 ご利用の画面のサイズによっては、ナビゲーション トグル ボタンを選択して [登録] および [ログイン] リンクを表示する必要がある場合があります。
Identity データベースを表示する
- View メニューから SQL Server オブジェクト エクスプローラー (SSOX) を選択します。
- (localdb)MSSQLLocalDB(SQL Server 13) に移動します。 dbo.AspNetUsers>View Data を右クリックします。
SQL Server オブジェクト エクスプローラー の
Contextual menu on AspNetUsers table in SQL Server オブジェクト エクスプローラーテーブル AspNetUsers のコンテキストメニュー
Identity サービスを構成する
サービスは Program.cs に追加されます。 一般的なパターンは、次の順序でメソッドを呼び出すことです。
Add{Service}builder.Services.Configure{Service}
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebApp1.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.AddRazorPages();
builder.Services.Configure<IdentityOptions>(options =>
{
// Password settings.
options.Password.RequireDigit = true;
options.Password.RequireLowercase = true;
options.Password.RequireNonAlphanumeric = true;
options.Password.RequireUppercase = true;
options.Password.RequiredLength = 6;
options.Password.RequiredUniqueChars = 1;
// Lockout settings.
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 5;
options.Lockout.AllowedForNewUsers = true;
// User settings.
options.User.AllowedUserNameCharacters =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
options.User.RequireUniqueEmail = false;
});
builder.Services.ConfigureApplicationCookie(options =>
{
// Cookie settings
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(5);
options.LoginPath = "/Identity/Account/Login";
options.AccessDeniedPath = "/Identity/Account/AccessDenied";
options.SlidingExpiration = true;
});
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
前のコードでは、既定のオプション値で Identity を構成します。 サービスは、依存性の挿入を介してアプリで使用できるようになります。
Identity は、UseAuthentication を呼び出すことによって有効になります。
UseAuthentication では、要求パイプラインに認証ミドルウェアを追加します。
テンプレートで生成されたアプリでは、承認は使用されません。
app.UseAuthorization は、アプリで承認が追加された場合に確実に正しい順序で追加されるようにするために含まれています。
UseRouting、UseAuthentication、UseAuthorization は、前のコードに示されている順序で呼び出す必要があります。
IdentityOptions の詳細については、「IdentityOptions」およびアプリケーションの起動に関するページを参照してください。
ASP.NET Core Identity メトリック
ASP.NET Core Identity メトリックは、ユーザー管理と認証プロセスの監視機能を提供します。 これらのメトリックは、セキュリティ上の脅威を示す可能性がある通常とは異なるサインイン パターンを検出し、ID 操作のパフォーマンスを追跡し、ユーザーが 2 要素認証などの認証機能と対話する方法を理解するのに役立ちます。 この可観測性は、セキュリティ要件が厳しいアプリや、認証トラフィックが多いアプリにとって特に重要です。
使用可能なメトリックとその使用方法の詳細については、「ASP.NET Core metrics」を参照してください。
スキャフォールディングで、登録、ログイン、ログアウト、登録確認を行う
Register、Login、LogOut、および RegisterConfirmation ファイルを追加します。
Razor の手順に従って、承認付きのを生成し、このセクションに示されているコードを作成します。
レジスタを調べる
ユーザーが ページの Register ボタンをクリックすると、RegisterModel.OnPostAsync アクションが呼び出されます。 ユーザーは、CreateAsync(TUser) オブジェクトで _userManager によって作成されます。
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync())
.ToList();
if (ModelState.IsValid)
{
var user = new IdentityUser { UserName = Input.Email, Email = Input.Email };
var result = await _userManager.CreateAsync(user, Input.Password);
if (result.Succeeded)
{
_logger.LogInformation("User created a new account with password.");
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
var callbackUrl = Url.Page(
"/Account/ConfirmEmail",
pageHandler: null,
values: new { area = "Identity", userId = user.Id, code = code },
protocol: Request.Scheme);
await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
$"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");
if (_userManager.Options.SignIn.RequireConfirmedAccount)
{
return RedirectToPage("RegisterConfirmation",
new { email = Input.Email });
}
else
{
await _signInManager.SignInAsync(user, isPersistent: false);
return LocalRedirect(returnUrl);
}
}
foreach (var error in result.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
}
// If we got this far, something failed, redisplay form
return Page();
}
既定のアカウント検証を無効にする
既定のテンプレートでは、ユーザーは Account.RegisterConfirmation にリダイレクトされ、アカウントを確認するリンクを選択できます。 既定値 Account.RegisterConfirmation は、テスト目的で "のみ" 使用されます。運用アプリでは、自動アカウント検証を無効にしてください。
確認済みのアカウントを必須にして、登録時に即時ログインできないようにするには、DisplayConfirmAccountLink = false に /Areas/Identity/Pages/Account/RegisterConfirmation.cshtml.cs を設定します。
[AllowAnonymous]
public class RegisterConfirmationModel : PageModel
{
private readonly UserManager<IdentityUser> _userManager;
private readonly IEmailSender _sender;
public RegisterConfirmationModel(UserManager<IdentityUser> userManager, IEmailSender sender)
{
_userManager = userManager;
_sender = sender;
}
public string Email { get; set; }
public bool DisplayConfirmAccountLink { get; set; }
public string EmailConfirmationUrl { get; set; }
public async Task<IActionResult> OnGetAsync(string email, string returnUrl = null)
{
if (email == null)
{
return RedirectToPage("/Index");
}
var user = await _userManager.FindByEmailAsync(email);
if (user == null)
{
return NotFound($"Unable to load user with email '{email}'.");
}
Email = email;
// Once you add a real email sender, you should remove this code that lets you confirm the account
DisplayConfirmAccountLink = false;
if (DisplayConfirmAccountLink)
{
var userId = await _userManager.GetUserIdAsync(user);
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
EmailConfirmationUrl = Url.Page(
"/Account/ConfirmEmail",
pageHandler: null,
values: new { area = "Identity", userId = userId, code = code, returnUrl = returnUrl },
protocol: Request.Scheme);
}
return Page();
}
}
ログイン
ログイン フォームは次の場合に表示されます。
- [ログイン] リンクが選択されている。
- ユーザーがシステムによって認証されていない、または承認されていない制限付きページにアクセスしようとしています。
[ログイン] ページのフォームが送信されると、OnPostAsync アクションが呼び出されます。
PasswordSignInAsync は _signInManager オブジェクトで呼び出されます。
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
if (ModelState.IsValid)
{
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout,
// set lockoutOnFailure: true
var result = await _signInManager.PasswordSignInAsync(Input.Email,
Input.Password, Input.RememberMe, lockoutOnFailure: true);
if (result.Succeeded)
{
_logger.LogInformation("User logged in.");
return LocalRedirect(returnUrl);
}
if (result.RequiresTwoFactor)
{
return RedirectToPage("./LoginWith2fa", new
{
ReturnUrl = returnUrl,
RememberMe = Input.RememberMe
});
}
if (result.IsLockedOut)
{
_logger.LogWarning("User account locked out.");
return RedirectToPage("./Lockout");
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return Page();
}
}
// If we got this far, something failed, redisplay form
return Page();
}
承認決定を行う方法については、
ログアウトする
[ログアウト] リンクによって LogoutModel.OnPost アクションが呼び出されます。
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;
namespace WebApp1.Areas.Identity.Pages.Account
{
[AllowAnonymous]
public class LogoutModel : PageModel
{
private readonly SignInManager<IdentityUser> _signInManager;
private readonly ILogger<LogoutModel> _logger;
public LogoutModel(SignInManager<IdentityUser> signInManager, ILogger<LogoutModel> logger)
{
_signInManager = signInManager;
_logger = logger;
}
public void OnGet()
{
}
public async Task<IActionResult> OnPost(string returnUrl = null)
{
await _signInManager.SignOutAsync();
_logger.LogInformation("User logged out.");
if (returnUrl != null)
{
return LocalRedirect(returnUrl);
}
else
{
return RedirectToPage();
}
}
}
}
前のコードでは、ブラウザーが新しい要求を実行し、ユーザーの ID が更新されるように、コード return RedirectToPage(); がリダイレクトである必要があります。
SignOutAsync により、cookie に格納されているユーザーのクレームがクリアされます。
post は、Pages/Shared/_LoginPartial.cshtml で指定されます。
@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager
<ul class="navbar-nav">
@if (SignInManager.IsSignedIn(User))
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Manage/Index"
title="Manage">Hello @User.Identity.Name!</a>
</li>
<li class="nav-item">
<form class="form-inline" asp-area="Identity" asp-page="/Account/Logout"
asp-route-returnUrl="@Url.Page("/", new { area = "" })"
method="post" >
<button type="submit" class="nav-link btn btn-link text-dark">Logout</button>
</form>
</li>
}
else
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Register">Register</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
</li>
}
</ul>
Identity をテストする
既定の Web project テンプレートでは、ホーム ページへの匿名accessが許可されます。
Identity をテストするには、[Authorize] を追加します。
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
namespace WebApp1.Pages
{
[Authorize]
public class PrivacyModel : PageModel
{
private readonly ILogger<PrivacyModel> _logger;
public PrivacyModel(ILogger<PrivacyModel> logger)
{
_logger = logger;
}
public void OnGet()
{
}
}
}
サインインしている場合は、サインアウトします。アプリを実行し、Privacy リンクを選択します。 ログイン ページにリダイレクトされます。
Identity について確認する
Identity をさらに詳しく調べるには、次のようにします。
- 完全な ID UI ソースを作成する
- 各ページのソースを確認し、デバッガーをステップ実行して調べる。
Identity コンポーネント
すべての Identity 依存 NuGet パッケージは、ASP.NET Core共有フレームワークに含まれています。
Identity のプライマリ パッケージは Microsoft.AspNetCore.Identity です。 このパッケージには、ASP.NET Core Identity 用のインターフェイスのコア セットが含まれており、Microsoft.AspNetCore.Identity.EntityFrameworkCore に含まれています。
ASP.NET Core Identity への移行
既存の Identity ストアの移行に関する詳細とガイダンスについては、認証と Identity の移行に関するページを参照してください。
パスワードの強度の設定
パスワードの最小要件を設定するサンプルについては、「構成」を参照してください。
AddDefaultIdentity と AddIdentity
AddDefaultIdentity は、ASP.NET Core 2.1 で導入されました。
AddDefaultIdentity の呼び出しは次の呼び出しに似ています。
詳細については、「AddDefaultIdentity source」を参照してください。
静的 Identity アセットを発行しないようにする
静的な Identity アセット (Identity UI 用のスタイルシートと JavaScript ファイル) を Web ルートに発行しないようにするには、次の ResolveStaticWebAssetsInputsDependsOn プロパティと RemoveIdentityAssets ターゲットをアプリのproject ファイルに追加します。
<PropertyGroup>
<ResolveStaticWebAssetsInputsDependsOn>RemoveIdentityAssets</ResolveStaticWebAssetsInputsDependsOn>
</PropertyGroup>
<Target Name="RemoveIdentityAssets">
<ItemGroup>
<StaticWebAsset Remove="@(StaticWebAsset)" Condition="%(SourceId) == 'Microsoft.AspNetCore.Identity.UI'" />
</ItemGroup>
</Target>
次のステップ
- ASP.NET Core Blazor 認証と承認
- ASP.NET Core Identity ソース コード
ASP.NET Core でロールを使用する方法
- SQLite を使用して Identity を構成する方法については、「SQLite (Identity #5131) における
dotnet/AspNetCore.Docsの構成方法」をご参照ください。 - Identity のコンフィギュレーション
- 承認によって保護されたユーザー データを使用して ASP.NET Core アプリを作成します
- ASP.NET Core プロジェクトIdentity にユーザー データを追加、ダウンロード、および削除します
ASP.NET Core - 認証と Identity を ASP.NET Core に移行する
- アカウントの確認とパスワードの回復
ASP.NET Core - ASP.NET Core をウェブファームでホストする
作成者: Rick Anderson
ASP.NET Core Identity:
- ユーザー インターフェイス (UI) ログイン機能をサポートする API です。
- ユーザー、パスワード、プロファイル データ、ロール、要求、トークン、電子メールの確認などを管理します。
ユーザーは、Identity に格納されているログイン情報を使用してアカウントを作成することができます。あるいは、外部ログイン プロバイダーを使用できます。 サポートされている外部ログイン プロバイダーには、Facebook、Google、Microsoft アカウント、Twitter があります。
すべてのアプリ ユーザーに認証を要求する方法については、「承認によって保護されたユーザー データを使用して ASP.NET Core アプリを作成するを参照してください。
Identity ソース コードは、GitHubで使用できます。 Identity をスキャフォールディングし、生成されたファイルを表示してテンプレートと Identity とのやりとりを確認します。
Identityは、通常、ユーザー名、パスワード、プロファイル データを格納するためにSQL Server データベースを使用して構成されます。 別の永続的なストアを使用することもできます (たとえば、table Storage Azure)。
このトピックでは、Identity を使用して、ユーザーの登録、ログイン、およびログアウトを行う方法について学習します。 注: テンプレートでは、ユーザーのユーザー名と電子メールを同じものとして扱います。 Identity を使用するアプリの作成に関する詳細な手順については、「次の手順」を参照してください。
ASP.NET Core Identity は、Microsoft ID プラットフォームに関連していません。 Microsoft ID プラットフォームは次のとおりです。
- Azure Active Directory (Azure AD) 開発者プラットフォームの進化。
- ASP.NET Core アプリでの認証と承認のための代替 ID ソリューション。
ASP.NET Core Identity は、ユーザー インターフェイス (UI) ログイン機能を ASP.NET Core web appsに追加します。 Web API と SPA をセキュリティで保護するには、次のいずれかを使用します。
Duende Identity Server は、ASP.NET Core用の OpenID Connect および OAuth 2.0 フレームワークです。 Duende Identity Server により、次のセキュリティ機能が有効になります。
- サービスとしての認証 (AaaS)
- 複数のアプリケーションの種類でのシングル サインオン/オフ (SSO)
- API のアクセス制御
- フェデレーション ゲートウェイ
Important
Duende Software により、Duende Identity Server を実稼働で使用することのライセンス料の支払いが求められる場合があります。 詳細については、.NET 5 の ASP.NET Core から .NET 6 への移行を参照してください。
詳細については、 Duende Identity Server のドキュメント (Duende Software Web サイト) を参照してください。
サンプル コードを表示またはダウンロード (ダウンロードする方法)。
認証を使用して Web アプリを作成する
個々のユーザー アカウントで ASP.NET Core Web アプリケーション projectを作成します。
- ASP.NET Core Web App テンプレートを選択します。 プロジェクトにWebApp1という名前を付け、プロジェクトのダウンロードと同じ名前空間にします。 [OK] をクリックします。
- [認証の種類] の入力で、[個々のユーザー アカウント] を選択します。
生成されたprojectは、ASP.NET Core Identity を Razor クラス ライブラリとして提供します。
Identity
Razor クラス ライブラリにより、Identity 領域でエンドポイントが公開されます。 例えば次が挙げられます。
- /Identity/アカウント/ログイン
- /Identity/Account/Logout
- /Identity/アカウント/管理
移行を適用する
移行を適用してデータベースを初期化します。
パッケージ マネージャー コンソール (PMC) で次のコマンドを実行します。
Update-Database
登録とログインをテストする
アプリを実行し、ユーザーを登録します。 ご利用の画面のサイズによっては、ナビゲーション トグル ボタンを選択して [登録] および [ログイン] リンクを表示する必要がある場合があります。
Identity データベースを表示する
- View メニューから SQL Server オブジェクト エクスプローラー (SSOX) を選択します。
- (localdb)MSSQLLocalDB(SQL Server 13) に移動します。 dbo.AspNetUsers>View Data を右クリックします。
SQL Server オブジェクト エクスプローラー の
Contextual menu on AspNetUsers table in SQL Server オブジェクト エクスプローラーテーブル AspNetUsers のコンテキストメニュー
Identity サービスを構成する
サービスは Program.cs に追加されます。 一般的なパターンは、次の順序でメソッドを呼び出すことです。
Add{Service}builder.Services.Configure{Service}
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebApp1.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.AddRazorPages();
builder.Services.Configure<IdentityOptions>(options =>
{
// Password settings.
options.Password.RequireDigit = true;
options.Password.RequireLowercase = true;
options.Password.RequireNonAlphanumeric = true;
options.Password.RequireUppercase = true;
options.Password.RequiredLength = 6;
options.Password.RequiredUniqueChars = 1;
// Lockout settings.
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 5;
options.Lockout.AllowedForNewUsers = true;
// User settings.
options.User.AllowedUserNameCharacters =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
options.User.RequireUniqueEmail = false;
});
builder.Services.ConfigureApplicationCookie(options =>
{
// Cookie settings
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(5);
options.LoginPath = "/Identity/Account/Login";
options.AccessDeniedPath = "/Identity/Account/AccessDenied";
options.SlidingExpiration = true;
});
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
前のコードでは、既定のオプション値で Identity を構成します。 サービスは、依存性の挿入を介してアプリで使用できるようになります。
Identity は、UseAuthentication を呼び出すことによって有効になります。
UseAuthentication では、要求パイプラインに認証ミドルウェアを追加します。
テンプレートで生成されたアプリでは、承認は使用されません。
app.UseAuthorization は、アプリで承認が追加された場合に確実に正しい順序で追加されるようにするために含まれています。
UseRouting、UseAuthentication、UseAuthorization は、前のコードに示されている順序で呼び出す必要があります。
IdentityOptions の詳細については、「IdentityOptions」およびアプリケーションの起動に関するページを参照してください。
スキャフォールディングで、登録、ログイン、ログアウト、登録確認を行う
Register、Login、LogOut、および RegisterConfirmation ファイルを追加します。
Razor の手順に従って、承認付きのを生成し、このセクションに示されているコードを作成します。
レジスタを調べる
ユーザーが ページの Register ボタンをクリックすると、RegisterModel.OnPostAsync アクションが呼び出されます。 ユーザーは、CreateAsync(TUser) オブジェクトで _userManager によって作成されます。
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync())
.ToList();
if (ModelState.IsValid)
{
var user = new IdentityUser { UserName = Input.Email, Email = Input.Email };
var result = await _userManager.CreateAsync(user, Input.Password);
if (result.Succeeded)
{
_logger.LogInformation("User created a new account with password.");
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
var callbackUrl = Url.Page(
"/Account/ConfirmEmail",
pageHandler: null,
values: new { area = "Identity", userId = user.Id, code = code },
protocol: Request.Scheme);
await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
$"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");
if (_userManager.Options.SignIn.RequireConfirmedAccount)
{
return RedirectToPage("RegisterConfirmation",
new { email = Input.Email });
}
else
{
await _signInManager.SignInAsync(user, isPersistent: false);
return LocalRedirect(returnUrl);
}
}
foreach (var error in result.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
}
// If we got this far, something failed, redisplay form
return Page();
}
既定のアカウント検証を無効にする
既定のテンプレートでは、ユーザーは Account.RegisterConfirmation にリダイレクトされ、アカウントを確認するリンクを選択できます。 既定値 Account.RegisterConfirmation は、テスト目的で "のみ" 使用されます。運用アプリでは、自動アカウント検証を無効にしてください。
確認済みのアカウントを必須にして、登録時に即時ログインできないようにするには、DisplayConfirmAccountLink = false に /Areas/Identity/Pages/Account/RegisterConfirmation.cshtml.cs を設定します。
[AllowAnonymous]
public class RegisterConfirmationModel : PageModel
{
private readonly UserManager<IdentityUser> _userManager;
private readonly IEmailSender _sender;
public RegisterConfirmationModel(UserManager<IdentityUser> userManager, IEmailSender sender)
{
_userManager = userManager;
_sender = sender;
}
public string Email { get; set; }
public bool DisplayConfirmAccountLink { get; set; }
public string EmailConfirmationUrl { get; set; }
public async Task<IActionResult> OnGetAsync(string email, string returnUrl = null)
{
if (email == null)
{
return RedirectToPage("/Index");
}
var user = await _userManager.FindByEmailAsync(email);
if (user == null)
{
return NotFound($"Unable to load user with email '{email}'.");
}
Email = email;
// Once you add a real email sender, you should remove this code that lets you confirm the account
DisplayConfirmAccountLink = false;
if (DisplayConfirmAccountLink)
{
var userId = await _userManager.GetUserIdAsync(user);
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
EmailConfirmationUrl = Url.Page(
"/Account/ConfirmEmail",
pageHandler: null,
values: new { area = "Identity", userId = userId, code = code, returnUrl = returnUrl },
protocol: Request.Scheme);
}
return Page();
}
}
ログイン
ログイン フォームは次の場合に表示されます。
- [ログイン] リンクが選択されている。
- ユーザーがシステムによって認証されていない、または承認されていない制限付きページにアクセスしようとしています。
[ログイン] ページのフォームが送信されると、OnPostAsync アクションが呼び出されます。
PasswordSignInAsync は _signInManager オブジェクトで呼び出されます。
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
if (ModelState.IsValid)
{
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout,
// set lockoutOnFailure: true
var result = await _signInManager.PasswordSignInAsync(Input.Email,
Input.Password, Input.RememberMe, lockoutOnFailure: true);
if (result.Succeeded)
{
_logger.LogInformation("User logged in.");
return LocalRedirect(returnUrl);
}
if (result.RequiresTwoFactor)
{
return RedirectToPage("./LoginWith2fa", new
{
ReturnUrl = returnUrl,
RememberMe = Input.RememberMe
});
}
if (result.IsLockedOut)
{
_logger.LogWarning("User account locked out.");
return RedirectToPage("./Lockout");
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return Page();
}
}
// If we got this far, something failed, redisplay form
return Page();
}
承認決定を行う方法については、
ログアウトする
[ログアウト] リンクによって LogoutModel.OnPost アクションが呼び出されます。
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;
namespace WebApp1.Areas.Identity.Pages.Account
{
[AllowAnonymous]
public class LogoutModel : PageModel
{
private readonly SignInManager<IdentityUser> _signInManager;
private readonly ILogger<LogoutModel> _logger;
public LogoutModel(SignInManager<IdentityUser> signInManager, ILogger<LogoutModel> logger)
{
_signInManager = signInManager;
_logger = logger;
}
public void OnGet()
{
}
public async Task<IActionResult> OnPost(string returnUrl = null)
{
await _signInManager.SignOutAsync();
_logger.LogInformation("User logged out.");
if (returnUrl != null)
{
return LocalRedirect(returnUrl);
}
else
{
return RedirectToPage();
}
}
}
}
前のコードでは、ブラウザーが新しい要求を実行し、ユーザーの ID が更新されるように、コード return RedirectToPage(); がリダイレクトである必要があります。
SignOutAsync により、cookie に格納されているユーザーのクレームがクリアされます。
post は、Pages/Shared/_LoginPartial.cshtml で指定されます。
@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager
<ul class="navbar-nav">
@if (SignInManager.IsSignedIn(User))
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Manage/Index"
title="Manage">Hello @User.Identity.Name!</a>
</li>
<li class="nav-item">
<form class="form-inline" asp-area="Identity" asp-page="/Account/Logout"
asp-route-returnUrl="@Url.Page("/", new { area = "" })"
method="post" >
<button type="submit" class="nav-link btn btn-link text-dark">Logout</button>
</form>
</li>
}
else
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Register">Register</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
</li>
}
</ul>
Identity をテストする
既定の Web project テンプレートでは、ホーム ページへの匿名accessが許可されます。
Identity をテストするには、[Authorize] を追加します。
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
namespace WebApp1.Pages
{
[Authorize]
public class PrivacyModel : PageModel
{
private readonly ILogger<PrivacyModel> _logger;
public PrivacyModel(ILogger<PrivacyModel> logger)
{
_logger = logger;
}
public void OnGet()
{
}
}
}
サインインしている場合は、サインアウトします。アプリを実行し、Privacy リンクを選択します。 ログイン ページにリダイレクトされます。
Identity について確認する
Identity をさらに詳しく調べるには、次のようにします。
- 完全な ID UI ソースを作成する
- 各ページのソースを確認し、デバッガーをステップ実行して調べる。
Identity コンポーネント
すべての Identity 依存 NuGet パッケージは、ASP.NET Core共有フレームワークに含まれています。
Identity のプライマリ パッケージは Microsoft.AspNetCore.Identity です。 このパッケージには、ASP.NET Core Identity 用のインターフェイスのコア セットが含まれており、Microsoft.AspNetCore.Identity.EntityFrameworkCore に含まれています。
ASP.NET Core Identity への移行
既存の Identity ストアの移行に関する詳細とガイダンスについては、認証と Identity の移行に関するページを参照してください。
パスワードの強度の設定
パスワードの最小要件を設定するサンプルについては、「構成」を参照してください。
AddDefaultIdentity と AddIdentity
AddDefaultIdentity は、ASP.NET Core 2.1 で導入されました。
AddDefaultIdentity の呼び出しは次の呼び出しに似ています。
詳細については、「AddDefaultIdentity source」を参照してください。
静的 Identity アセットを発行しないようにする
静的な Identity アセット (Identity UI 用のスタイルシートと JavaScript ファイル) を Web ルートに発行しないようにするには、次の ResolveStaticWebAssetsInputsDependsOn プロパティと RemoveIdentityAssets ターゲットをアプリのproject ファイルに追加します。
<PropertyGroup>
<ResolveStaticWebAssetsInputsDependsOn>RemoveIdentityAssets</ResolveStaticWebAssetsInputsDependsOn>
</PropertyGroup>
<Target Name="RemoveIdentityAssets">
<ItemGroup>
<StaticWebAsset Remove="@(StaticWebAsset)" Condition="%(SourceId) == 'Microsoft.AspNetCore.Identity.UI'" />
</ItemGroup>
</Target>
次のステップ
- ASP.NET Core Identity ソース コード
ASP.NET Core でロールを使用する方法
- SQLite を使用して を構成する方法についてはIdentityを参照してください。
- Identity のコンフィギュレーション
- 承認によって保護されたユーザー データを使用して ASP.NET Core アプリを作成します
- ASP.NET Core プロジェクトIdentity にユーザー データを追加、ダウンロード、および削除します
ASP.NET Core - 認証と Identity を ASP.NET Core に移行する
- アカウントの確認とパスワードの回復
ASP.NET Core - ASP.NET Core をウェブファームでホストする
作成者: Rick Anderson
ASP.NET Core Identity:
- ユーザー インターフェイス (UI) ログイン機能をサポートする API です。
- ユーザー、パスワード、プロファイル データ、ロール、要求、トークン、電子メールの確認などを管理します。
ユーザーは、Identity に格納されているログイン情報を使用してアカウントを作成することができます。あるいは、外部ログイン プロバイダーを使用できます。 サポートされている外部ログイン プロバイダーには、Facebook、Google、Microsoft アカウント、Twitter があります。
すべてのアプリ ユーザーに認証を要求する方法については、「承認によって保護されたユーザー データを使用して ASP.NET Core アプリを作成するを参照してください。
Identity ソース コードは、GitHubで使用できます。 Identity をスキャフォールディングし、生成されたファイルを表示してテンプレートと Identity とのやりとりを確認します。
Identityは、通常、ユーザー名、パスワード、プロファイル データを格納するためにSQL Server データベースを使用して構成されます。 別の永続的なストアを使用することもできます (たとえば、table Storage Azure)。
このトピックでは、Identity を使用して、ユーザーの登録、ログイン、およびログアウトを行う方法について学習します。 注: テンプレートでは、ユーザーのユーザー名と電子メールを同じものとして扱います。 Identity を使用するアプリの作成に関する詳細な手順については、「次の手順」を参照してください。
Microsoft ID プラットフォームは次のとおりです。
- Azure Active Directory (Azure AD) 開発者プラットフォームの進化。
- ASP.NET Core アプリでの認証と承認のための代替 ID ソリューション。
- ASP.NET Core Identityとは関係ありません。
ASP.NET Core Identity は、ユーザー インターフェイス (UI) ログイン機能を ASP.NET Core web appsに追加します。 Web API と SPA をセキュリティで保護するには、次のいずれかを使用します。
- Microsoft Entra ID
- Duende IdentityServer。 Duende IdentityServer はサードパーティ製品です。
Duende IdentityServer は、ASP.NET Core用の OpenID Connect および OAuth 2.0 フレームワークです。 Duende IdentityServer により、次のセキュリティ機能が有効になります。
- サービスとしての認証 (AaaS)
- 複数のアプリケーションの種類でのシングル サインオン/オフ (SSO)
- API のアクセス制御
- フェデレーション ゲートウェイ
詳細については、「 Duende IdentityServer の概要」を参照してください。
他の認証プロバイダーの詳細については、「ASP.NET CoreCommunity OSS 認証オプション」を参照してください>
サンプル コードを表示またはダウンロード (ダウンロードする方法)。
認証を使用して Web アプリを作成する
個々のユーザー アカウントで ASP.NET Core Web アプリケーション projectを作成します。
- File>New>Project を選択します。
- ASP.NET Core Web アプリケーションを選択します。 プロジェクトにWebApp1という名前を付け、プロジェクトのダウンロードと同じ名前空間にします。 [OK] をクリックします。
- ASP.NET Core Web アプリケーションを選択し、認証を変更を選択します。
- [個々のユーザー アカウント] を選択し、[OK] をクリックします。
生成されたprojectは、ASP.NET Core Identity を Razor クラス ライブラリとして提供します。
Identity
Razor クラス ライブラリにより、Identity 領域でエンドポイントが公開されます。 例えば次が挙げられます。
- /Identity/アカウント/ログイン
- /Identity/Account/Logout
- /Identity/アカウント/管理
移行を適用する
移行を適用してデータベースを初期化します。
パッケージ マネージャー コンソール (PMC) で次のコマンドを実行します。
PM> Update-Database
登録とログインをテストする
アプリを実行し、ユーザーを登録します。 ご利用の画面のサイズによっては、ナビゲーション トグル ボタンを選択して [登録] および [ログイン] リンクを表示する必要がある場合があります。
Identity データベースを表示する
- View メニューから SQL Server オブジェクト エクスプローラー (SSOX) を選択します。
- (localdb)MSSQLLocalDB(SQL Server 13) に移動します。 dbo.AspNetUsers>View Data を右クリックします。
SQL Server オブジェクト エクスプローラー の
Contextual menu on AspNetUsers table in SQL Server オブジェクト エクスプローラーテーブル AspNetUsers のコンテキストメニュー
Identity サービスを構成する
サービスは ConfigureServices に追加されます。 一般的なパターンは、すべての Add{Service} メソッドを呼び出した後、すべての services.Configure{Service} メソッドを呼び出すことです。
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
// options.UseSqlite(
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddRazorPages();
services.Configure<IdentityOptions>(options =>
{
// Password settings.
options.Password.RequireDigit = true;
options.Password.RequireLowercase = true;
options.Password.RequireNonAlphanumeric = true;
options.Password.RequireUppercase = true;
options.Password.RequiredLength = 6;
options.Password.RequiredUniqueChars = 1;
// Lockout settings.
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 5;
options.Lockout.AllowedForNewUsers = true;
// User settings.
options.User.AllowedUserNameCharacters =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
options.User.RequireUniqueEmail = false;
});
services.ConfigureApplicationCookie(options =>
{
// Cookie settings
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(5);
options.LoginPath = "/Identity/Account/Login";
options.AccessDeniedPath = "/Identity/Account/AccessDenied";
options.SlidingExpiration = true;
});
}
上の強調表示されているコードでは、既定のオプション値で Identity を構成します。 サービスは、依存性の挿入を介してアプリで使用できるようになります。
Identity は、UseAuthentication を呼び出すことによって有効になります。
UseAuthentication では、要求パイプラインに認証ミドルウェアを追加します。
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();
});
}
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
// options.UseSqlite(
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDatabaseDeveloperPageExceptionFilter();
services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddRazorPages();
services.Configure<IdentityOptions>(options =>
{
// Password settings.
options.Password.RequireDigit = true;
options.Password.RequireLowercase = true;
options.Password.RequireNonAlphanumeric = true;
options.Password.RequireUppercase = true;
options.Password.RequiredLength = 6;
options.Password.RequiredUniqueChars = 1;
// Lockout settings.
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 5;
options.Lockout.AllowedForNewUsers = true;
// User settings.
options.User.AllowedUserNameCharacters =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
options.User.RequireUniqueEmail = false;
});
services.ConfigureApplicationCookie(options =>
{
// Cookie settings
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(5);
options.LoginPath = "/Identity/Account/Login";
options.AccessDeniedPath = "/Identity/Account/AccessDenied";
options.SlidingExpiration = true;
});
}
前のコードでは、既定のオプション値で Identity を構成します。 サービスは、依存性の挿入を介してアプリで使用できるようになります。
Identity は、UseAuthentication を呼び出すことによって有効になります。
UseAuthentication では、要求パイプラインに認証ミドルウェアを追加します。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
テンプレートで生成されたアプリでは、承認は使用されません。
app.UseAuthorization は、アプリで承認が追加された場合に確実に正しい順序で追加されるようにするために含まれています。
UseRouting、UseAuthentication、UseAuthorization、および UseEndpoints は、前のコードに示されている順序で呼び出す必要があります。
IdentityOptions と Startup の詳細については、「IdentityOptions」およびアプリケーションの起動に関するページを参照してください。
スキャフォールディングで、登録、ログイン、ログアウト、登録確認を行う
Register、Login、LogOut、および RegisterConfirmation ファイルを追加します。
Razor の手順に従って、承認付きのを生成し、このセクションに示されているコードを作成します。
レジスタを調べる
ユーザーが ページの Register ボタンをクリックすると、RegisterModel.OnPostAsync アクションが呼び出されます。 ユーザーは、CreateAsync(TUser) オブジェクトで _userManager によって作成されます。
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync())
.ToList();
if (ModelState.IsValid)
{
var user = new IdentityUser { UserName = Input.Email, Email = Input.Email };
var result = await _userManager.CreateAsync(user, Input.Password);
if (result.Succeeded)
{
_logger.LogInformation("User created a new account with password.");
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
var callbackUrl = Url.Page(
"/Account/ConfirmEmail",
pageHandler: null,
values: new { area = "Identity", userId = user.Id, code = code },
protocol: Request.Scheme);
await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
$"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");
if (_userManager.Options.SignIn.RequireConfirmedAccount)
{
return RedirectToPage("RegisterConfirmation",
new { email = Input.Email });
}
else
{
await _signInManager.SignInAsync(user, isPersistent: false);
return LocalRedirect(returnUrl);
}
}
foreach (var error in result.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
}
// If we got this far, something failed, redisplay form
return Page();
}
既定のアカウント検証を無効にする
既定のテンプレートでは、ユーザーは Account.RegisterConfirmation にリダイレクトされ、アカウントを確認するリンクを選択できます。 既定値 Account.RegisterConfirmation は、テスト目的で "のみ" 使用されます。運用アプリでは、自動アカウント検証を無効にしてください。
確認済みのアカウントを必須にして、登録時に即時ログインできないようにするには、DisplayConfirmAccountLink = false に /Areas/Identity/Pages/Account/RegisterConfirmation.cshtml.cs を設定します。
[AllowAnonymous]
public class RegisterConfirmationModel : PageModel
{
private readonly UserManager<IdentityUser> _userManager;
private readonly IEmailSender _sender;
public RegisterConfirmationModel(UserManager<IdentityUser> userManager, IEmailSender sender)
{
_userManager = userManager;
_sender = sender;
}
public string Email { get; set; }
public bool DisplayConfirmAccountLink { get; set; }
public string EmailConfirmationUrl { get; set; }
public async Task<IActionResult> OnGetAsync(string email, string returnUrl = null)
{
if (email == null)
{
return RedirectToPage("/Index");
}
var user = await _userManager.FindByEmailAsync(email);
if (user == null)
{
return NotFound($"Unable to load user with email '{email}'.");
}
Email = email;
// Once you add a real email sender, you should remove this code that lets you confirm the account
DisplayConfirmAccountLink = false;
if (DisplayConfirmAccountLink)
{
var userId = await _userManager.GetUserIdAsync(user);
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
EmailConfirmationUrl = Url.Page(
"/Account/ConfirmEmail",
pageHandler: null,
values: new { area = "Identity", userId = userId, code = code, returnUrl = returnUrl },
protocol: Request.Scheme);
}
return Page();
}
}
ログイン
ログイン フォームは次の場合に表示されます。
- [ログイン] リンクが選択されている。
- ユーザーがシステムによって認証されていない、または承認されていない制限付きページにアクセスしようとしています。
[ログイン] ページのフォームが送信されると、OnPostAsync アクションが呼び出されます。
PasswordSignInAsync は _signInManager オブジェクトで呼び出されます。
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
if (ModelState.IsValid)
{
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout,
// set lockoutOnFailure: true
var result = await _signInManager.PasswordSignInAsync(Input.Email,
Input.Password, Input.RememberMe, lockoutOnFailure: true);
if (result.Succeeded)
{
_logger.LogInformation("User logged in.");
return LocalRedirect(returnUrl);
}
if (result.RequiresTwoFactor)
{
return RedirectToPage("./LoginWith2fa", new
{
ReturnUrl = returnUrl,
RememberMe = Input.RememberMe
});
}
if (result.IsLockedOut)
{
_logger.LogWarning("User account locked out.");
return RedirectToPage("./Lockout");
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return Page();
}
}
// If we got this far, something failed, redisplay form
return Page();
}
承認決定を行う方法については、
ログアウトする
[ログアウト] リンクによって LogoutModel.OnPost アクションが呼び出されます。
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;
namespace WebApp1.Areas.Identity.Pages.Account
{
[AllowAnonymous]
public class LogoutModel : PageModel
{
private readonly SignInManager<IdentityUser> _signInManager;
private readonly ILogger<LogoutModel> _logger;
public LogoutModel(SignInManager<IdentityUser> signInManager, ILogger<LogoutModel> logger)
{
_signInManager = signInManager;
_logger = logger;
}
public void OnGet()
{
}
public async Task<IActionResult> OnPost(string returnUrl = null)
{
await _signInManager.SignOutAsync();
_logger.LogInformation("User logged out.");
if (returnUrl != null)
{
return LocalRedirect(returnUrl);
}
else
{
return RedirectToPage();
}
}
}
}
前のコードでは、ブラウザーが新しい要求を実行し、ユーザーの ID が更新されるように、コード return RedirectToPage(); がリダイレクトである必要があります。
SignOutAsync により、cookie に格納されているユーザーのクレームがクリアされます。
post は、Pages/Shared/_LoginPartial.cshtml で指定されます。
@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager
<ul class="navbar-nav">
@if (SignInManager.IsSignedIn(User))
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Manage/Index"
title="Manage">Hello @User.Identity.Name!</a>
</li>
<li class="nav-item">
<form class="form-inline" asp-area="Identity" asp-page="/Account/Logout"
asp-route-returnUrl="@Url.Page("/", new { area = "" })"
method="post" >
<button type="submit" class="nav-link btn btn-link text-dark">Logout</button>
</form>
</li>
}
else
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Register">Register</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
</li>
}
</ul>
Identity をテストする
既定の Web project テンプレートでは、ホーム ページへの匿名accessが許可されます。
Identity をテストするには、[Authorize] を追加します。
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
namespace WebApp1.Pages
{
[Authorize]
public class PrivacyModel : PageModel
{
private readonly ILogger<PrivacyModel> _logger;
public PrivacyModel(ILogger<PrivacyModel> logger)
{
_logger = logger;
}
public void OnGet()
{
}
}
}
サインインしている場合は、サインアウトします。アプリを実行し、Privacy リンクを選択します。 ログイン ページにリダイレクトされます。
Identity について確認する
Identity をさらに詳しく調べるには、次のようにします。
- 完全な ID UI ソースを作成する
- 各ページのソースを確認し、デバッガーをステップ実行して調べる。
Identity コンポーネント
すべての Identity 依存 NuGet パッケージは、ASP.NET Core共有フレームワークに含まれています。
Identity のプライマリ パッケージは Microsoft.AspNetCore.Identity です。 このパッケージには、ASP.NET Core Identity 用のインターフェイスのコア セットが含まれており、Microsoft.AspNetCore.Identity.EntityFrameworkCore に含まれています。
ASP.NET Core Identity への移行
既存の Identity ストアの移行に関する詳細とガイダンスについては、認証と Identity の移行に関するページを参照してください。
パスワードの強度の設定
パスワードの最小要件を設定するサンプルについては、「構成」を参照してください。
静的 Identity アセットを発行しないようにする
静的な Identity アセット (Identity UI 用のスタイルシートと JavaScript ファイル) を Web ルートに発行しないようにするには、次の ResolveStaticWebAssetsInputsDependsOn プロパティと RemoveIdentityAssets ターゲットをアプリのproject ファイルに追加します。
<PropertyGroup>
<ResolveStaticWebAssetsInputsDependsOn>RemoveIdentityAssets</ResolveStaticWebAssetsInputsDependsOn>
</PropertyGroup>
<Target Name="RemoveIdentityAssets">
<ItemGroup>
<StaticWebAsset Remove="@(StaticWebAsset)" Condition="%(SourceId) == 'Microsoft.AspNetCore.Identity.UI'" />
</ItemGroup>
</Target>
次のステップ
- ASP.NET Core Identity ソース コード
- AddDefaultIdentity のソース
- SQLite を使用して を構成する方法についてはIdentityを参照してください。
- Identity のコンフィギュレーション
- 承認によって保護されたユーザー データを使用して ASP.NET Core アプリを作成します
- ASP.NET Core プロジェクトIdentity にユーザー データを追加、ダウンロード、および削除します
ASP.NET Core - 認証と Identity を ASP.NET Core に移行する
- アカウントの確認とパスワードの回復
ASP.NET Core - ASP.NET Core をウェブファームでホストする
ASP.NET Core