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();
}

上記のコードは、LoginIdentity テンプレートに基づいて作成されています。

ロックアウト オプションは、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();

上記のコードでは、既定値を使って IdentityOptionsLockoutOptions を設定しています。

認証が成功すると、失敗したアクセス試行回数がリセットされ、クロックがリセットされます。

IdentityOptions.Lockout では、表に示すプロパティを使って LockoutOptions を指定します。

プロパティ 説明 Default
AllowedForNewUsers 新しいユーザーをロックアウトできるかどうかを判断します。 true
DefaultLockoutTimeSpan ロックアウトが発生した場合にユーザーがロックアウトされる時間。 5 分
MaxFailedAccessAttempts ロックアウトが有効になっている場合に、ユーザーがロックアウトされるまでに失敗したアクセス試行回数。 5

Password

既定では、Identity には、大文字、小文字、数字、および英数字以外の文字を含むパスワードが必要です。 パスワードの長さは、6 文字以上である必要があります。

パスワードは、次で構成されます。

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

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 を使用してパスワードをハッシュするときに使用されるイテレーションの回数。 この値は、CompatibilityModeIdentityV3 に設定されている場合にのみ使用されます。 この値は、正の整数である必要があり、100000 の既定値です。

次の例では、IterationCountProgram.cs12000 に設定されています。

// 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 に格納されているものから変更されていないことを確認します。 検証コントロールは、一定の間隔で呼び出します。 呼び出しの間隔は、データストアへのアクセス頻度が多すぎる場合と少なすぎる場合のトレードオフになります。 チェックの間隔が長いと、クレームが古くなります。 次のチェックのときに既存の userManager.UpdateSecurityStampAsync(user) を強制的に無効にするには、cookie を呼び出します。 ほとんどの 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();
}

上記のコードは、LoginIdentity テンプレートに基づいて作成されています。

ロックアウト オプションは、StartUp.ConfigureServices で設定されます。

services.Configure<IdentityOptions>(options =>
{
    // Default Lockout settings.
    options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
    options.Lockout.MaxFailedAccessAttempts = 5;
    options.Lockout.AllowedForNewUsers = true;
});

上記のコードでは、既定値を使って IdentityOptionsLockoutOptions を設定しています。

認証が成功すると、失敗したアクセス試行回数がリセットされ、クロックがリセットされます。

IdentityOptions.Lockout では、表に示すプロパティを使って LockoutOptions を指定します。

プロパティ 説明 Default
AllowedForNewUsers 新しいユーザーをロックアウトできるかどうかを判断します。 true
DefaultLockoutTimeSpan ロックアウトが発生した場合にユーザーがロックアウトされる時間。 5 分
MaxFailedAccessAttempts ロックアウトが有効になっている場合に、ユーザーがロックアウトされるまでに失敗したアクセス試行回数。 5

Password

既定では、Identity には、大文字、小文字、数字、および英数字以外の文字を含むパスワードが必要です。 パスワードの長さは、6 文字以上である必要があります。

パスワードは、次で構成されます。

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

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 を使用してパスワードをハッシュするときに使用されるイテレーションの回数。 この値は、CompatibilityModeIdentityV3 に設定されている場合にのみ使用されます。 この値は、正の整数である必要があり、10000 の既定値です。

次の例では、IterationCountStartup.ConfigureServices12000 に設定されています。

// using Microsoft.AspNetCore.Identity;

services.Configure<PasswordHasherOptions>(option =>
{
    option.IterationCount = 12000;
});

すべてのユーザーの認証をグローバルに要求する

すべてのユーザーの認証をグローバルに要求する方法の詳細については、「認証されたユーザーを要求する」を参照してください。