ASP.NET Core Identity:
- ユーザー インターフェイス (UI) ログイン機能をサポートする API です。
- ユーザー、パスワード、プロファイル データ、ロール、要求、トークン、電子メールの確認などを管理します。
ユーザーは、 に格納されているログイン情報を使用してアカウントを作成することができます。あるいは、外部ログイン プロバイダーを使用できます。 サポートされている外部ログイン プロバイダーには、Facebook、Google、Microsoft アカウント、Twitter があります。
すべてのアプリ ユーザーに認証を要求する方法については、「承認によって保護されたユーザー データを使用して ASP.NET Core アプリを作成するを参照してください。
Identity ソース コードは、GitHubで使用できます。 をスキャフォールディングし、生成されたファイルを表示してテンプレートと とのやりとりを確認します。
Identityは、通常、ユーザー名、パスワード、プロファイル データを格納するためにSQL Server データベースを使用して構成されます。 別の永続的なストアを使用することもできます (たとえば、table Storage Azure)。
このトピックでは、 を使用して、ユーザーの登録、ログイン、およびログアウトを行う方法について学習します。 注: テンプレートでは、ユーザーのユーザー名と電子メールを同じものとして扱います。 を使用するアプリの作成に関する詳細な手順については、「次の手順」を参照してください。
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 をセキュリティで保護するには、次のいずれかを使用します。
- Microsoft Entra ID
- Duende Server
Duende Identity Server は、ASP.NET Core用の OpenID Connect および OAuth 2.0 フレームワークです。 Duende Server により、次のセキュリティ機能が有効になります。
- サービスとしての認証 (AaaS)
- 複数のアプリケーションの種類でのシングル サインオン/オフ (SSO)
- API のアクセス制御
- フェデレーション ゲートウェイ
Important
Duende Software により、Duende Server を実稼働で使用することのライセンス料の支払いが求められる場合があります。 詳細については、.NET 5 の ASP.NET Core から .NET 6 への移行を参照してください。
詳細については、Duende Server に関するドキュメント (Duende ソフトウェアの Web サイト) を参照してください。
サンプル コードを表示またはダウンロード (ダウンロードする方法)。
認証を使用して を作成する
個々のアカウントで ASP.NET Core Blazor Web App project を作成します。
Note
Pages エクスペリエンスについては、「認証を使用して Pages アプリを作成する」セクションを参照してください。
MVC エクスペリエンスについては、「認証を使用 した MVC アプリの作成 」セクションを参照してください。
- テンプレートを選択します。 [次へ] を選択します。
- 次の選択を行います。
- 認証の種類: 個々のアカウント
- 対話型レンダリング モード: サーバー
- 対話機能の場所: グローバル
- を選択してを作成します。
生成されたprojectには、IdentityRazor コンポーネントが含まれます。 コンポーネントは、サーバー projectの Components/Account フォルダーにあります。 例えば次が挙げられます。
Components/Account/Pages/Register.razorComponents/Account/Pages/Login.razorComponents/Account/Pages/Manage/ChangePassword.razor
コンポーネントは、特定のユース ケースのドキュメントで個別に説明されており、リリースごとに変更される可能性があります。 個々のアカウントで Blazor Web App を生成すると、IdentityRazor コンポーネントが生成されたprojectに含まれます。
Identity
Razor コンポーネントは、dotnet/aspnetcoreのサーバー projectの フォルダーでも検査できます。
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 アプリに適用されます。 ただし、 ドキュメント セットには、情報を置き換えたり追加したりする記事とガイダンスが含まれています。 最初に設定された一般的な ASP.NET Coreのドキュメントを確認してから、BlazorSecurity および Identity ドキュメントの記事にアクセスすることをお勧めします。
認証を使用して Pages アプリを作成する
個別アカウントを使用して、ASP.NET Core Web アプリケーション (Razor ページ) プロジェクトを作成します。
- ASP.NET Core Web App (Razor ページ) テンプレートを選択します。 [次へ] を選択します。
- [認証の種類] で、[個々のアカウント] を選択します。
- を選択してを作成します。
生成されたprojectは、ASP.NET Core Identityを Razor クラス ライブラリ (RCL) として提供します。 クラス ライブラリが特定の領域でエンドポイントを公開します。 例えば次が挙げられます。
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) として提供します。 クラス ライブラリは、 Pages に基づいており、領域を持つエンドポイントを公開します。 例えば次が挙げられます。
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
登録とログインをテストする
アプリを実行し、ユーザーを登録します。 ご利用の画面のサイズによっては、ナビゲーション トグル ボタンを選択して [登録] および [ログイン] リンクを表示する必要がある場合があります。
データベースを表示する
- View メニューから SQL Server オブジェクト エクスプローラー (SSOX) を選択します。
- (localdb)MSSQLLocalDB(SQL Server 13) に移動します。 dbo.AspNetUsersView Data を右クリックします。
SQL Server オブジェクト エクスプローラー の
サービスを構成する
サービスは に追加されます。 一般的なパターンは、次の順序でメソッドを呼び出すことです。
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();
前のコードでは、既定のオプション値で を構成します。 サービスは、依存性の挿入を介してアプリで使用できるようになります。
は、 を呼び出すことによって有効になります。 では、要求パイプラインに認証ミドルウェアを追加します。
テンプレートで生成されたアプリでは、承認は使用されません。 は、アプリで承認が追加された場合に確実に正しい順序で追加されるようにするために含まれています。 、、 は、前のコードに示されている順序で呼び出す必要があります。
の詳細については、「」およびアプリケーションの起動に関するページを参照してください。
ASP.NET Core Identity メトリック
ASP.NET Core Identity メトリックは、ユーザー管理と認証プロセスの監視機能を提供します。 これらのメトリックは、セキュリティ上の脅威を示す可能性がある通常とは異なるサインイン パターンを検出し、ID 操作のパフォーマンスを追跡し、ユーザーが 2 要素認証などの認証機能と対話する方法を理解するのに役立ちます。 この可観測性は、セキュリティ要件が厳しいアプリや、認証トラフィックが多いアプリにとって特に重要です。
使用可能なメトリックとその使用方法の詳細については、「ASP.NET Core metrics」を参照してください。
スキャフォールディングで、登録、ログイン、ログアウト、登録確認を行う
、、、および ファイルを追加します。 Scaffold identity の手順に従って、承認付きのRazorを生成し、このセクションに示されているコードを作成します。
レジスタを調べる
ユーザーがページの「登録」ボタンをクリックすると、アクションが呼び出されます。 によってユーザーは オブジェクト 上で作成されます。
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();
}
既定のアカウント検証を無効にする
既定のテンプレートでは、ユーザーは にリダイレクトされ、アカウントを確認するリンクを選択できます。 既定値 は、テスト目的で "のみ" 使用されます。運用アプリでは、自動アカウント検証を無効にしてください。
確認済みのアカウントを必須にして、登録時に即時ログインできないようにするには、 に を設定します。
[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();
}
}
ログイン
ログイン フォームは次の場合に表示されます。
- [ログイン] リンクが選択されている。
- ユーザーがシステムによって認証されていない、または承認されていない制限付きページにアクセスしようとしています。
[ログイン] ページのフォームが送信されると、 アクションが呼び出されます。 は オブジェクトで呼び出されます。
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();
}
承認決定を行う方法については、
ログアウトする
[ログアウト] リンクによって アクションが呼び出されます。
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 が更新されるように、コード がリダイレクトである必要があります。
により、 に格納されているユーザーのクレームがクリアされます。
投稿は「場所」で指定されます。
@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>
テスト
既定の Web project テンプレートでは、ホーム ページへの匿名accessが許可されます。 をテストするには、 を追加します。
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()
{
}
}
}
サインインしている場合は、サインアウトします。アプリを実行し、 リンクを選択します。 ログイン ページにリダイレクトされます。
探索する
をさらに詳しく調べるには、次のようにします。
- 完全な ID UI ソースを作成する
- 各ページのソースを確認し、デバッガーをステップ実行して調べる。
コンポーネント
すべての Identity 依存 NuGet パッケージは、ASP.NET Core共有フレームワークに含まれています。
のプライマリ パッケージは Microsoft.AspNetCore. です。 このパッケージには、ASP.NET Core Identity 用のインターフェイスのコア セットが含まれており、Microsoft.AspNetCore.Identity.EntityFrameworkCore に含まれています。
ASP.NET Core Identity への移行
既存の ストアの移行に関する詳細とガイダンスについては、認証と の移行に関するページを参照してください。
パスワードの強度の設定
パスワードの最小要件を設定するサンプルについては、「構成」を参照してください。
AddDefaultIdentity と AddIdentity
AddDefaultIdentity は、ASP.NET Core 2.1 で導入されました。 関数またはメソッドの呼び出しは、次の呼び出しと似ています。
詳細については、「AddDefaultIdentity source」を参照してください。
静的 アセットを発行しないようにする
静的な 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 (
dotnet/AspNetCore.Docs#5131) における Identity の構成方法」をご参照ください。 - 設定する
- 承認によって保護されたユーザー データを使用して ASP.NET Core アプリを作成します
- ASP.NET Core プロジェクトIdentity にユーザー データを追加、ダウンロード、および削除します
ASP.NET Core - 認証と Identity を ASP.NET Core に移行する
- ASP.NET Core におけるアカウント確認およびパスワード回復
ASP.NET Core - ASP.NET Core をウェブファームでホストする
作成者: Rick Anderson
ASP.NET Core Identity:
- ユーザー インターフェイス (UI) ログイン機能をサポートする API です。
- ユーザー、パスワード、プロファイル データ、ロール、要求、トークン、電子メールの確認などを管理します。
ユーザーは、 に格納されているログイン情報を使用してアカウントを作成することができます。あるいは、外部ログイン プロバイダーを使用できます。 サポートされている外部ログイン プロバイダーには、Facebook、Google、Microsoft アカウント、Twitter があります。
すべてのアプリ ユーザーに認証を要求する方法については、「承認によって保護されたユーザー データを使用して ASP.NET Core アプリを作成するを参照してください。
Identity ソース コードは、GitHubで使用できます。 をスキャフォールディングし、生成されたファイルを表示してテンプレートと とのやりとりを確認します。
Identityは、通常、ユーザー名、パスワード、プロファイル データを格納するためにSQL Server データベースを使用して構成されます。 別の永続的なストアを使用することもできます (たとえば、table Storage Azure)。
このトピックでは、 を使用して、ユーザーの登録、ログイン、およびログアウトを行う方法について学習します。 注: テンプレートでは、ユーザーのユーザー名と電子メールを同じものとして扱います。 を使用するアプリの作成に関する詳細な手順については、「次の手順」を参照してください。
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 をセキュリティで保護するには、次のいずれかを使用します。
- Microsoft Entra ID
- Duende Server
Duende Identity Server は、ASP.NET Core用の OpenID Connect および OAuth 2.0 フレームワークです。 Duende Server により、次のセキュリティ機能が有効になります。
- サービスとしての認証 (AaaS)
- 複数のアプリケーションの種類でのシングル サインオン/オフ (SSO)
- API のアクセス制御
- フェデレーション ゲートウェイ
Important
Duende Software により、Duende Server を実稼働で使用することのライセンス料の支払いが求められる場合があります。 詳細については、.NET 5 の ASP.NET Core から .NET 6 への移行を参照してください。
詳細については、Duende Server に関するドキュメント (Duende ソフトウェアの Web サイト) を参照してください。
サンプル コードを表示またはダウンロード (ダウンロードする方法)。
認証を使用して Web アプリを作成する
個々のユーザー アカウントで ASP.NET Core Web アプリケーション projectを作成します。
- ASP.NET Core Web App テンプレートを選択します。 プロジェクトにWebApp1という名前を付け、プロジェクトのダウンロードと同じ名前空間にします。 OK をクリックします。
- [認証の種類] の入力で、[個々のユーザー アカウント] を選択します。
生成されたprojectは、ASP.NET Core Identity を Razor クラス ライブラリとして提供します。 クラス ライブラリが特定の領域でエンドポイントを公開します。 例えば次が挙げられます。
- //アカウント/ログイン
- //アカウント/ログアウト
- //アカウント/管理
移行を適用する
移行を適用してデータベースを初期化します。
パッケージ マネージャー コンソール (PMC) で次のコマンドを実行します。
Update-Database
登録とログインをテストする
アプリを実行し、ユーザーを登録します。 ご利用の画面のサイズによっては、ナビゲーション トグル ボタンを選択して [登録] および [ログイン] リンクを表示する必要がある場合があります。
データベースを表示する
- View メニューから SQL Server オブジェクト エクスプローラー (SSOX) を選択します。
- (localdb)MSSQLLocalDB(SQL Server 13) に移動します。 dbo.AspNetUsersView Data を右クリックします。
SQL Server オブジェクト エクスプローラー の
サービスを構成する
サービスは に追加されます。 一般的なパターンは、次の順序でメソッドを呼び出すことです。
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();
前のコードでは、既定のオプション値で を構成します。 サービスは、依存性の挿入を介してアプリで使用できるようになります。
は、 を呼び出すことによって有効になります。 では、要求パイプラインに認証ミドルウェアを追加します。
テンプレートで生成されたアプリでは、承認は使用されません。 は、アプリで承認が追加された場合に確実に正しい順序で追加されるようにするために含まれています。 、、 は、前のコードに示されている順序で呼び出す必要があります。
の詳細については、「」およびアプリケーションの起動に関するページを参照してください。
スキャフォールディングで、登録、ログイン、ログアウト、登録確認を行う
、、、および ファイルを追加します。 Scaffold identity の手順に従って、承認付きのRazorを生成し、このセクションに示されているコードを作成します。
レジスタを調べる
ユーザーがページの「登録」ボタンをクリックすると、アクションが呼び出されます。 によってユーザーは オブジェクト 上で作成されます。
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();
}
既定のアカウント検証を無効にする
既定のテンプレートでは、ユーザーは にリダイレクトされ、アカウントを確認するリンクを選択できます。 既定値 は、テスト目的で "のみ" 使用されます。運用アプリでは、自動アカウント検証を無効にしてください。
確認済みのアカウントを必須にして、登録時に即時ログインできないようにするには、 に を設定します。
[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();
}
}
ログイン
ログイン フォームは次の場合に表示されます。
- [ログイン] リンクが選択されている。
- ユーザーがシステムによって認証されていない、または承認されていない制限付きページにアクセスしようとしています。
[ログイン] ページのフォームが送信されると、 アクションが呼び出されます。 は オブジェクトで呼び出されます。
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();
}
承認決定を行う方法については、
ログアウトする
[ログアウト] リンクによって アクションが呼び出されます。
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 が更新されるように、コード がリダイレクトである必要があります。
により、 に格納されているユーザーのクレームがクリアされます。
投稿は「場所」で指定されます。
@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>
テスト
既定の Web project テンプレートでは、ホーム ページへの匿名accessが許可されます。 をテストするには、 を追加します。
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()
{
}
}
}
サインインしている場合は、サインアウトします。アプリを実行し、 リンクを選択します。 ログイン ページにリダイレクトされます。
探索する
をさらに詳しく調べるには、次のようにします。
- 完全な ID UI ソースを作成する
- 各ページのソースを確認し、デバッガーをステップ実行して調べる。
コンポーネント
すべての Identity 依存 NuGet パッケージは、ASP.NET Core共有フレームワークに含まれています。
のプライマリ パッケージは Microsoft.AspNetCore. です。 このパッケージには、ASP.NET Core Identity 用のインターフェイスのコア セットが含まれており、Microsoft.AspNetCore.Identity.EntityFrameworkCore に含まれています。
ASP.NET Core Identity への移行
既存の ストアの移行に関する詳細とガイダンスについては、認証と の移行に関するページを参照してください。
パスワードの強度の設定
パスワードの最小要件を設定するサンプルについては、「構成」を参照してください。
AddDefaultIdentity と AddIdentity
AddDefaultIdentity は、ASP.NET Core 2.1 で導入されました。 関数またはメソッドの呼び出しは、次の呼び出しと似ています。
詳細については、「AddDefaultIdentity source」を参照してください。
静的 アセットを発行しないようにする
静的な 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を参照してください。
- 設定する
- 承認によって保護されたユーザー データを使用して ASP.NET Core アプリを作成します
- ASP.NET Core プロジェクトIdentity にユーザー データを追加、ダウンロード、および削除します
ASP.NET Core - 認証と Identity を ASP.NET Core に移行する
- ASP.NET Core におけるアカウント確認およびパスワード回復
ASP.NET Core - ASP.NET Core をウェブファームでホストする
作成者: Rick Anderson
ASP.NET Core Identity:
- ユーザー インターフェイス (UI) ログイン機能をサポートする API です。
- ユーザー、パスワード、プロファイル データ、ロール、要求、トークン、電子メールの確認などを管理します。
ユーザーは、 に格納されているログイン情報を使用してアカウントを作成することができます。あるいは、外部ログイン プロバイダーを使用できます。 サポートされている外部ログイン プロバイダーには、Facebook、Google、Microsoft アカウント、Twitter があります。
すべてのアプリ ユーザーに認証を要求する方法については、「承認によって保護されたユーザー データを使用して ASP.NET Core アプリを作成するを参照してください。
Identity ソース コードは、GitHubで使用できます。 をスキャフォールディングし、生成されたファイルを表示してテンプレートと とのやりとりを確認します。
Identityは、通常、ユーザー名、パスワード、プロファイル データを格納するためにSQL Server データベースを使用して構成されます。 別の永続的なストアを使用することもできます (たとえば、table Storage Azure)。
このトピックでは、 を使用して、ユーザーの登録、ログイン、およびログアウトを行う方法について学習します。 注: テンプレートでは、ユーザーのユーザー名と電子メールを同じものとして扱います。 を使用するアプリの作成に関する詳細な手順については、「次の手順」を参照してください。
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 クラス ライブラリとして提供します。 クラス ライブラリが特定の領域でエンドポイントを公開します。 例えば次が挙げられます。
- //アカウント/ログイン
- //アカウント/ログアウト
- //アカウント/管理
移行を適用する
移行を適用してデータベースを初期化します。
パッケージ マネージャー コンソール (PMC) で次のコマンドを実行します。
PM> Update-Database
登録とログインをテストする
アプリを実行し、ユーザーを登録します。 ご利用の画面のサイズによっては、ナビゲーション トグル ボタンを選択して [登録] および [ログイン] リンクを表示する必要がある場合があります。
データベースを表示する
- View メニューから SQL Server オブジェクト エクスプローラー (SSOX) を選択します。
- (localdb)MSSQLLocalDB(SQL Server 13) に移動します。 dbo.AspNetUsersView Data を右クリックします。
SQL Server オブジェクト エクスプローラー の
サービスを構成する
サービスは に追加されます。 一般的なパターンは、すべての メソッドを呼び出した後、すべての メソッドを呼び出すことです。
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;
});
}
上の強調表示されているコードでは、既定のオプション値で を構成します。 サービスは、依存性の挿入を介してアプリで使用できるようになります。
は、 を呼び出すことによって有効になります。 では、要求パイプラインに認証ミドルウェアを追加します。
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;
});
}
前のコードでは、既定のオプション値で を構成します。 サービスは、依存性の挿入を介してアプリで使用できるようになります。
は、 を呼び出すことによって有効になります。 では、要求パイプラインに認証ミドルウェアを追加します。
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();
});
}
テンプレートで生成されたアプリでは、承認は使用されません。 は、アプリで承認が追加された場合に確実に正しい順序で追加されるようにするために含まれています。 、、、および は、前のコードに示されている順序で呼び出す必要があります。
の詳細については、「」および「アプリケーションの起動」を参照してください。
スキャフォールディングで、登録、ログイン、ログアウト、登録確認を行う
、、、および ファイルを追加します。 Scaffold identity の手順に従って、承認付きのRazorを生成し、このセクションに示されているコードを作成します。
レジスタを調べる
ユーザーがページの「登録」ボタンをクリックすると、アクションが呼び出されます。 によってユーザーは オブジェクト 上で作成されます。
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();
}
既定のアカウント検証を無効にする
既定のテンプレートでは、ユーザーは にリダイレクトされ、アカウントを確認するリンクを選択できます。 既定値 は、テスト目的で "のみ" 使用されます。運用アプリでは、自動アカウント検証を無効にしてください。
確認済みのアカウントを必須にして、登録時に即時ログインできないようにするには、 に を設定します。
[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();
}
}
ログイン
ログイン フォームは次の場合に表示されます。
- [ログイン] リンクが選択されている。
- ユーザーがシステムによって認証されていない、または承認されていない制限付きページにアクセスしようとしています。
[ログイン] ページのフォームが送信されると、 アクションが呼び出されます。 は オブジェクトで呼び出されます。
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();
}
承認決定を行う方法については、
ログアウトする
[ログアウト] リンクによって アクションが呼び出されます。
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 が更新されるように、コード がリダイレクトである必要があります。
により、 に格納されているユーザーのクレームがクリアされます。
投稿は「場所」で指定されます。
@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>
テスト
既定の Web project テンプレートでは、ホーム ページへの匿名accessが許可されます。 をテストするには、 を追加します。
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()
{
}
}
}
サインインしている場合は、サインアウトします。アプリを実行し、 リンクを選択します。 ログイン ページにリダイレクトされます。
探索する
をさらに詳しく調べるには、次のようにします。
- 完全な ID UI ソースを作成する
- 各ページのソースを確認し、デバッガーをステップ実行して調べる。
コンポーネント
すべての Identity 依存 NuGet パッケージは、ASP.NET Core共有フレームワークに含まれています。
のプライマリ パッケージは Microsoft.AspNetCore. です。 このパッケージには、ASP.NET Core Identity 用のインターフェイスのコア セットが含まれており、Microsoft.AspNetCore.Identity.EntityFrameworkCore に含まれています。
ASP.NET Core 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 source
- SQLite を使用して を構成する方法についてはIdentityを参照してください。
- 設定する
- 承認によって保護されたユーザー データを使用して ASP.NET Core アプリを作成します
- ASP.NET Core プロジェクトIdentity にユーザー データを追加、ダウンロード、および削除します
ASP.NET Core - 認証と Identity を ASP.NET Core に移行する
- ASP.NET Core におけるアカウント確認およびパスワード回復
ASP.NET Core - ASP.NET Core をウェブファームでホストする
ASP.NET Core