ASP.NET Core Identity を構成する
ASP.NET Core Identity では、パスワード ポリシー、ロックアウト、cookie 構成などの設定に既定値を使用します。 これらの設定は、アプリケーションの起動時にオーバーライドできます。
Identity オプション
IdentityOptions クラスは、Identity システムを構成するために使用することができるオプションを表しています。 IdentityOptions は、AddIdentity または AddDefaultIdentity を呼び出した後に、設定する必要があります。
要求 Identity
IdentityOptions.ClaimsIdentity では、次の表に示すプロパティを使用して、ClaimsIdentityOptions を指定します。
プロパティ | 説明 | Default |
---|---|---|
RoleClaimType | ロール要求に使用される要求の種類を取得または設定します。 | ClaimTypes.Role |
SecurityStampClaimType | セキュリティ スタンプ要求に使用される要求の種類を取得または設定します。 | AspNet.Identity.SecurityStamp |
UserIdClaimType | ユーザー識別子要求に使用される要求の種類を取得または設定します。 | ClaimTypes.NameIdentifier |
UserNameClaimType | ユーザー名要求に使用される要求の種類を取得または設定します。 | ClaimTypes.Name |
ロックアウト
ロックアウトは、PasswordSignInAsync メソッドで設定されます。
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl ??= Url.Content("~/");
ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
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: false);
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();
}
上記のコードは、Login
Identity テンプレートに基づいて作成されています。
ロックアウト オプションは、Program.cs
で設定されます。
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using RPauth.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 =>
{
// Default Lockout settings.
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 5;
options.Lockout.AllowedForNewUsers = 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();
上記のコードでは、既定値を使用して IdentityOptions LockoutOptions を設定しています。
認証が成功すると、失敗したアクセス試行回数がリセットされ、クロックがリセットされます。
IdentityOptions.Lockout では、表に示すプロパティを使って LockoutOptions を指定します。
プロパティ | 説明 | Default |
---|---|---|
AllowedForNewUsers | 新しいユーザーをロックアウトできるかどうかを判断します。 | true |
DefaultLockoutTimeSpan | ロックアウトが発生した場合にユーザーがロックアウトされる時間。 | 5 分 |
MaxFailedAccessAttempts | ロックアウトが有効になっている場合に、ユーザーがロックアウトされるまでに失敗したアクセス試行回数。 | 5 |
Password
既定では、Identity には、大文字、小文字、数字、および英数字以外の文字を含むパスワードが必要です。 パスワードの長さは、6 文字以上である必要があります。
パスワードは、次で構成されます。
Program.cs
の PasswordOptions- Identity がアプリにスキャフォールディングされている場合、
Password
プロパティの[StringLength]
属性。InputModel
Password
プロパティは、次のファイルにあります。Areas/Identity/Pages/Account/Register.cshtml.cs
Areas/Identity/Pages/Account/ResetPassword.cshtml.cs
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using RPauth.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 =>
{
// Default 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;
});
var app = builder.Build();
// Remaining code removed for brevity.
IdentityOptions.Password では、表に示すプロパティを使って PasswordOptions を指定します。
プロパティ | 説明 | Default |
---|---|---|
RequireDigit | パスワードに 0 から 9 の数値を必要とします。 | true |
RequiredLength | パスワードの最低限の長さ。 | 6 |
RequireLowercase | パスワードに小文字を必要とします。 | true |
RequireNonAlphanumeric | パスワードに英数字以外の文字を必要とします。 | true |
RequiredUniqueChars | ASP.NET Core 2.0 以降にのみ適用されます。 パスワードに個別の文字の数を必要とします。 |
1 |
RequireUppercase | パスワードに大文字を必要とします。 | true |
サインイン
次のコードでは、SignIn
設定が既定値に設定されます。
builder.Services.Configure<IdentityOptions>(options =>
{
// Default SignIn settings.
options.SignIn.RequireConfirmedEmail = false;
options.SignIn.RequireConfirmedPhoneNumber = false;
});
IdentityOptions.SignIn では、表に示すプロパティを使って SignInOptions を指定します。
プロパティ | 説明 | Default |
---|---|---|
RequireConfirmedEmail | サインインに確認済みメールを必要とします。 | false |
RequireConfirmedPhoneNumber | サインインに確認済み電話番号を必要とします。 | false |
トークン
IdentityOptions.Tokens では、表に示すプロパティを使って TokenOptions を指定します。
プロパティ | 説明 |
---|---|
AuthenticatorTokenProvider | 認証子を使用した 2 要素サインインを検証するために使用される AuthenticatorTokenProvider を取得または設定します。 |
ChangeEmailTokenProvider | メール アドレスの変更確認メールに使用されるトークンを生成するために使用される ChangeEmailTokenProvider を取得または設定します。 |
ChangePhoneNumberTokenProvider | 電話番号を変更するときに使用されるトークンを生成するために使用される ChangePhoneNumberTokenProvider を取得または設定します。 |
EmailConfirmationTokenProvider | アカウント確認メールで使用されるトークンを生成するために使用されるトークン プロバイダーを取得または設定します。 |
PasswordResetTokenProvider | パスワードのリセット メールで使われるトークンを生成するために使う IUserTwoFactorTokenProvider<TUser> を取得または設定します。 |
ProviderMap | プロバイダーの名前として使用されるキーでユーザー トークン プロバイダーを構成するために使用されます。 |
User
builder.Services.Configure<IdentityOptions>(options =>
{
// Default User settings.
options.User.AllowedUserNameCharacters =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
options.User.RequireUniqueEmail = false;
});
IdentityOptions.User では、表に示すプロパティを使って UserOptions を指定します。
プロパティ | 説明 | Default |
---|---|---|
AllowedUserNameCharacters | ユーザー名に使用できる文字。 | abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 |
RequireUniqueEmail | 各ユーザーは、一意のメール アドレスを持つ必要があります。 | false |
Cookie の設定
Program.cs
で、アプリの cookie を構成します。 ConfigureApplicationCookie は、AddIdentity
または AddDefaultIdentity
を呼び出した後に呼び出す必要があります。
builder.Services.ConfigureApplicationCookie(options =>
{
options.AccessDeniedPath = "/Identity/Account/AccessDenied";
options.Cookie.Name = "YourAppCookieName";
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
options.LoginPath = "/Identity/Account/Login";
// ReturnUrlParameter requires
//using Microsoft.AspNetCore.Authentication.Cookies;
options.ReturnUrlParameter = CookieAuthenticationDefaults.ReturnUrlParameter;
options.SlidingExpiration = true;
});
詳細については、CookieAuthenticationOptionsを参照してください。
Password Hasher オプション
PasswordHasherOptions を使用して、パスワード ハッシュのオプションを取得および設定します。
オプション | 説明 |
---|---|
CompatibilityMode | 新しいパスワードをハッシュするときに使用される互換モード。 既定値は IdentityV3 です。 "書式設定マーカー" と呼ばれる、ハッシュされたパスワードの最初のバイトによって、パスワードをハッシュするために使用されるハッシュ アルゴリズムのバージョンが指定されます。 ハッシュに対してパスワードを検証する場合は、VerifyHashedPassword メソッドを使用すると、最初のバイトに基づく正しいアルゴリズムが選択されます。 クライアントでは、パスワードをハッシュするために使用されたアルゴリズムのバージョンに関係なく、認証が可能です。 互換モードの設定は、"新しいパスワード" のハッシュに影響します。 |
IterationCount | PBKDF2 を使用してパスワードをハッシュするときに使用されるイテレーションの回数。 この値は、CompatibilityMode が IdentityV3 に設定されている場合にのみ使用されます。 この値は、正の整数である必要があり、100000 の既定値です。 |
次の例では、IterationCount が Program.cs
で 12000
に設定されています。
// using Microsoft.AspNetCore.Identity;
builder.Services.Configure<PasswordHasherOptions>(option =>
{
option.IterationCount = 12000;
});
すべてのユーザーの認証をグローバルに要求する
すべてのユーザーの認証をグローバルに要求する方法の詳細については、「認証されたユーザーを要求する」を参照してください。
ISecurityStampValidator とすべてからのサインアウト
アプリは、ユーザー ClaimsPrincipal を再生成することによって、セキュリティが重要アクションを含むイベントに対応する必要があります。 たとえば、ロールへの参加、パスワードの変更、またはその他のセキュリティが重要なイベントを行うときは、ClaimsPrincipal
を再生成する必要があります。 Identity は、ISecurityStampValidator インターフェイスを使って ClaimsPrincipal
を再生成します。 Identity の既定の実装では、SecurityStampValidator がメインのアプリケーション cookie と 2 要素 cookie に登録されます。 検証コントロールは、各 cookie の OnValidatePrincipal イベントにフックして Identity を呼び出し、ユーザーのセキュリティ スタンプ クレームが cookie に格納されているものから変更されていないことを確認します。 検証コントロールは、一定の間隔で呼び出します。 呼び出しの間隔は、データストアへのアクセス頻度が多すぎる場合と少なすぎる場合のトレードオフになります。 チェックの間隔が長いと、クレームが古くなります。 既存の Cookie を次回チェックするときに強制的に無効にするには、userManager.UpdateSecurityStampAsync(user)
を呼び出します。 ほとんどの Identity UI アカウントと管理ページは、パスワードの変更またはログインの追加の後で userManager.UpdateSecurityStampAsync(user)
を呼び出します。 アプリでは userManager.UpdateSecurityStampAsync(user)
を呼び出して、すべてからのサインアウト アクションを実装できます。
次のコードの強調表示されている部分で、検証間隔を変更しています。
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebClaimsPrincipal.Data;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection")
?? throw new InvalidOperationException("'DefaultConnection' not found.");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddDefaultIdentity<IdentityUser>(options =>
options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
// Force Identity's security stamp to be validated every minute.
builder.Services.Configure<SecurityStampValidatorOptions>(o =>
o.ValidationInterval = TimeSpan.FromMinutes(1));
builder.Services.AddRazorPages();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
ASP.NET Core Identity では、パスワード ポリシー、ロックアウト、cookie 構成などの設定に既定値を使用します。 これらの設定は、Startup
クラスでオーバーライドできます。
Identity オプション
IdentityOptions クラスは、Identity システムを構成するために使用することができるオプションを表しています。 IdentityOptions
は、AddIdentity
または AddDefaultIdentity
を呼び出した後に、設定する必要があります。
要求 Identity
IdentityOptions.ClaimsIdentity では、次の表に示すプロパティを使用して、ClaimsIdentityOptions を指定します。
プロパティ | 説明 | Default |
---|---|---|
RoleClaimType | ロール要求に使用される要求の種類を取得または設定します。 | ClaimTypes.Role |
SecurityStampClaimType | セキュリティ スタンプ要求に使用される要求の種類を取得または設定します。 | AspNet.Identity.SecurityStamp |
UserIdClaimType | ユーザー識別子要求に使用される要求の種類を取得または設定します。 | ClaimTypes.NameIdentifier |
UserNameClaimType | ユーザー名要求に使用される要求の種類を取得または設定します。 | ClaimTypes.Name |
ロックアウト
ロックアウトは、PasswordSignInAsync メソッドで設定されます。
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
if (ModelState.IsValid)
{
var result = await _signInManager.PasswordSignInAsync(Input.Email,
Input.Password, Input.RememberMe,
lockoutOnFailure: false);
if (result.Succeeded)
{
_logger.LogInformation("User logged in.");
return LocalRedirect(returnUrl);
}
if (result.RequiresTwoFactor)
{
return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl,
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();
}
上記のコードは、Login
Identity テンプレートに基づいて作成されています。
ロックアウト オプションは、StartUp.ConfigureServices
で設定されます。
services.Configure<IdentityOptions>(options =>
{
// Default Lockout settings.
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 5;
options.Lockout.AllowedForNewUsers = true;
});
上記のコードでは、既定値を使用して IdentityOptions LockoutOptions を設定しています。
認証が成功すると、失敗したアクセス試行回数がリセットされ、クロックがリセットされます。
IdentityOptions.Lockout では、表に示すプロパティを使って LockoutOptions を指定します。
プロパティ | 説明 | Default |
---|---|---|
AllowedForNewUsers | 新しいユーザーをロックアウトできるかどうかを判断します。 | true |
DefaultLockoutTimeSpan | ロックアウトが発生した場合にユーザーがロックアウトされる時間。 | 5 分 |
MaxFailedAccessAttempts | ロックアウトが有効になっている場合に、ユーザーがロックアウトされるまでに失敗したアクセス試行回数。 | 5 |
Password
既定では、Identity には、大文字、小文字、数字、および英数字以外の文字を含むパスワードが必要です。 パスワードの長さは、6 文字以上である必要があります。
パスワードは、次で構成されます。
Startup.ConfigureServices
の PasswordOptions- Identity がアプリにスキャフォールディングされている場合、
Password
プロパティの[StringLength]
属性。InputModel
Password
プロパティは、次のファイルにあります。Areas/Identity/Pages/Account/Register.cshtml.cs
Areas/Identity/Pages/Account/ResetPassword.cshtml.cs
services.Configure<IdentityOptions>(options =>
{
// Default 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;
});
IdentityOptions.Password では、表に示すプロパティを使って PasswordOptions を指定します。
プロパティ | 説明 | Default |
---|---|---|
RequireDigit | パスワードに 0 から 9 の数値を必要とします。 | true |
RequiredLength | パスワードの最低限の長さ。 | 6 |
RequireLowercase | パスワードに小文字を必要とします。 | true |
RequireNonAlphanumeric | パスワードに英数字以外の文字を必要とします。 | true |
RequiredUniqueChars | ASP.NET Core 2.0 以降にのみ適用されます。 パスワードに個別の文字の数を必要とします。 |
1 |
RequireUppercase | パスワードに大文字を必要とします。 | true |
サインイン
次のコードでは、SignIn
設定が既定値に設定されます。
services.Configure<IdentityOptions>(options =>
{
// Default SignIn settings.
options.SignIn.RequireConfirmedEmail = false;
options.SignIn.RequireConfirmedPhoneNumber = false;
});
IdentityOptions.SignIn では、表に示すプロパティを使って SignInOptions を指定します。
プロパティ | 説明 | Default |
---|---|---|
RequireConfirmedEmail | サインインに確認済みメールを必要とします。 | false |
RequireConfirmedPhoneNumber | サインインに確認済み電話番号を必要とします。 | false |
トークン
IdentityOptions.Tokens では、表に示すプロパティを使って TokenOptions を指定します。
プロパティ | 説明 |
---|---|
AuthenticatorTokenProvider | 認証子を使用した 2 要素サインインを検証するために使用される AuthenticatorTokenProvider を取得または設定します。 |
ChangeEmailTokenProvider | メール アドレスの変更確認メールに使用されるトークンを生成するために使用される ChangeEmailTokenProvider を取得または設定します。 |
ChangePhoneNumberTokenProvider | 電話番号を変更するときに使用されるトークンを生成するために使用される ChangePhoneNumberTokenProvider を取得または設定します。 |
EmailConfirmationTokenProvider | アカウント確認メールで使用されるトークンを生成するために使用されるトークン プロバイダーを取得または設定します。 |
PasswordResetTokenProvider | パスワードのリセット メールで使われるトークンを生成するために使う IUserTwoFactorTokenProvider<TUser> を取得または設定します。 |
ProviderMap | プロバイダーの名前として使用されるキーでユーザー トークン プロバイダーを構成するために使用されます。 |
User
services.Configure<IdentityOptions>(options =>
{
// Default User settings.
options.User.AllowedUserNameCharacters =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
options.User.RequireUniqueEmail = false;
});
IdentityOptions.User では、表に示すプロパティを使って UserOptions を指定します。
プロパティ | 説明 | Default |
---|---|---|
AllowedUserNameCharacters | ユーザー名に使用できる文字。 | abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 |
RequireUniqueEmail | 各ユーザーは、一意のメール アドレスを持つ必要があります。 | false |
Cookie の設定
Startup.ConfigureServices
で、アプリの cookie を構成します。 ConfigureApplicationCookie は、AddIdentity
または AddDefaultIdentity
を呼び出した後に呼び出す必要があります。
services.ConfigureApplicationCookie(options =>
{
options.AccessDeniedPath = "/Identity/Account/AccessDenied";
options.Cookie.Name = "YourAppCookieName";
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
options.LoginPath = "/Identity/Account/Login";
// ReturnUrlParameter requires
//using Microsoft.AspNetCore.Authentication.Cookies;
options.ReturnUrlParameter = CookieAuthenticationDefaults.ReturnUrlParameter;
options.SlidingExpiration = true;
});
詳細については、CookieAuthenticationOptionsを参照してください。
Password Hasher オプション
PasswordHasherOptions を使用して、パスワード ハッシュのオプションを取得および設定します。
オプション | 説明 |
---|---|
CompatibilityMode | 新しいパスワードをハッシュするときに使用される互換モード。 既定値は IdentityV3 です。 "書式設定マーカー" と呼ばれる、ハッシュされたパスワードの最初のバイトによって、パスワードをハッシュするために使用されるハッシュ アルゴリズムのバージョンが指定されます。 ハッシュに対してパスワードを検証する場合は、VerifyHashedPassword メソッドを使用すると、最初のバイトに基づく正しいアルゴリズムが選択されます。 クライアントでは、パスワードをハッシュするために使用されたアルゴリズムのバージョンに関係なく、認証が可能です。 互換モードの設定は、"新しいパスワード" のハッシュに影響します。 |
IterationCount | PBKDF2 を使用してパスワードをハッシュするときに使用されるイテレーションの回数。 この値は、CompatibilityMode が IdentityV3 に設定されている場合にのみ使用されます。 この値は、正の整数である必要があり、10000 の既定値です。 |
次の例では、IterationCount が Startup.ConfigureServices
で 12000
に設定されています。
// using Microsoft.AspNetCore.Identity;
services.Configure<PasswordHasherOptions>(option =>
{
option.IterationCount = 12000;
});
すべてのユーザーの認証をグローバルに要求する
すべてのユーザーの認証をグローバルに要求する方法の詳細については、「認証されたユーザーを要求する」を参照してください。
ASP.NET Core