Bagikan melalui


Mengonfigurasi ASP.NET Core Identity

ASP.NET Core Identity menggunakan nilai default untuk pengaturan seperti kebijakan kata sandi, penguncian, dan cookie konfigurasi. Pengaturan ini dapat ditimpa saat pengaktifan aplikasi.

Opsi Identity

Kelas IdentityOptions mewakili opsi yang dapat digunakan untuk mengonfigurasi Identity sistem. IdentityOptions harus diatur setelah memanggil AddIdentity atau AddDefaultIdentity.

Klaim Identity

IdentityOptions.ClaimsIdentityClaimsIdentityOptions menentukan dengan properti yang diperlihatkan dalam tabel berikut.

Properti Deskripsi Default
RoleClaimType Mendapatkan atau mengatur jenis klaim yang digunakan untuk klaim peran. ClaimTypes.Role
SecurityStampClaimType Mendapatkan atau mengatur jenis klaim yang digunakan untuk klaim stempel keamanan. AspNet.Identity.SecurityStamp
UserIdClaimType Mendapatkan atau mengatur jenis klaim yang digunakan untuk klaim pengidentifikasi pengguna. ClaimTypes.NameIdentifier
UserNameClaimType Mendapatkan atau mengatur jenis klaim yang digunakan untuk klaim nama pengguna. ClaimTypes.Name

Dikunci

Penguncian diatur dalam metode 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();
}

Kode sebelumnya didasarkan pada LoginIdentity templat.

Opsi penguncian diatur dalam 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();

Kode sebelumnya mengatur IdentityOptionsLockoutOptions dengan nilai default.

Autentikasi yang berhasil mengatur ulang jumlah upaya akses yang gagal dan mengatur ulang jam.

IdentityOptions.LockoutLockoutOptions menentukan dengan properti yang diperlihatkan dalam tabel.

Properti Deskripsi Default
AllowedForNewUsers Menentukan apakah pengguna baru dapat dikunci. true
DefaultLockoutTimeSpan Jumlah waktu pengguna dikunci saat penguncian terjadi. 5 menit
MaxFailedAccessAttempts Jumlah upaya akses yang gagal hingga pengguna dikunci, jika penguncian diaktifkan. 5

Kata sandi

Secara default, Identity mengharuskan kata sandi berisi karakter huruf besar, karakter huruf kecil, digit, dan karakter non-alfanumerik. Kata sandi harus panjangnya minimal enam karakter.

Kata sandi dikonfigurasi dengan:

  • PasswordOptions di Program.cs.
  • [StringLength]Password atribut properti jika Identity di-scaffold ke dalam aplikasi. InputModelPassword properti ditemukan dalam file berikut:
    • 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.PasswordPasswordOptions menentukan dengan properti yang diperlihatkan dalam tabel.

Properti Deskripsi Default
RequireDigit Memerlukan angka antara 0-9 dalam kata sandi. true
RequiredLength Panjang minimum kata sandi. 6
RequireLowercase Memerlukan karakter huruf kecil dalam kata sandi. true
RequireNonAlphanumeric Memerlukan karakter non-alfanumerik dalam kata sandi. true
RequiredUniqueChars Hanya berlaku untuk ASP.NET Core 2.0 atau yang lebih baru.

Memerlukan jumlah karakter yang berbeda dalam kata sandi.
1
RequireUppercase Memerlukan karakter huruf besar dalam kata sandi. true

Masuk

Kode berikut mengatur SignIn pengaturan (ke nilai default):

builder.Services.Configure<IdentityOptions>(options =>
{
    // Default SignIn settings.
    options.SignIn.RequireConfirmedEmail = false;
    options.SignIn.RequireConfirmedPhoneNumber = false;
});

IdentityOptions.SignInSignInOptions menentukan dengan properti yang diperlihatkan dalam tabel.

Properti Deskripsi Default
RequireConfirmedEmail Memerlukan email yang dikonfirmasi untuk masuk. false
RequireConfirmedPhoneNumber Memerlukan nomor telepon yang dikonfirmasi untuk masuk. false

Token

IdentityOptions.TokensTokenOptions menentukan dengan properti yang diperlihatkan dalam tabel.

Properti Deskripsi
AuthenticatorTokenProvider Mendapatkan atau mengatur yang AuthenticatorTokenProvider digunakan untuk memvalidasi masuk dua faktor dengan pengautentikasi.
ChangeEmailTokenProvider Mendapatkan atau mengatur yang ChangeEmailTokenProvider digunakan untuk menghasilkan token yang digunakan dalam email konfirmasi perubahan email.
ChangePhoneNumberTokenProvider Mendapatkan atau mengatur yang ChangePhoneNumberTokenProvider digunakan untuk menghasilkan token yang digunakan saat mengubah nomor telepon.
EmailConfirmationTokenProvider Mendapatkan atau mengatur penyedia token yang digunakan untuk menghasilkan token yang digunakan dalam email konfirmasi akun.
PasswordResetTokenProvider Mendapatkan atau mengatur yang IUserTwoFactorTokenProvider<TUser> digunakan untuk menghasilkan token yang digunakan dalam email reset kata sandi.
ProviderMap Digunakan untuk membuat Penyedia Token Pengguna dengan kunci yang digunakan sebagai nama penyedia.

Pengguna

builder.Services.Configure<IdentityOptions>(options =>
{
    // Default User settings.
    options.User.AllowedUserNameCharacters =
            "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
    options.User.RequireUniqueEmail = false;

});

IdentityOptions.UserUserOptions menentukan dengan properti yang diperlihatkan dalam tabel.

Properti Deskripsi Default
AllowedUserNameCharacters Karakter yang diizinkan dalam nama pengguna. abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
-._@+
RequireUniqueEmail Mengharuskan setiap pengguna untuk memiliki email unik. false

Konfigurasikan aplikasi cookie di Program.cs. KonfigurasikanApplicationCookie harus dipanggil setelah memanggil AddIdentity atau 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;
});

Untuk informasi selengkapnya, lihat CookieAuthenticationOptions .

Opsi Hasher Kata Sandi

PasswordHasherOptions mendapatkan dan mengatur opsi untuk hashing kata sandi.

Opsi Deskripsi
CompatibilityMode Mode kompatibilitas yang digunakan saat hash kata sandi baru. Default ke IdentityV3. Byte pertama dari kata sandi yang di-hash, yang disebut penanda format, menentukan versi algoritma hashing yang digunakan untuk hash kata sandi. Saat memverifikasi kata sandi terhadap hash, VerifyHashedPassword metode memilih algoritma yang benar berdasarkan byte pertama. Klien dapat mengautentikasi terlepas dari versi algoritma mana yang digunakan untuk hash kata sandi. Mengatur mode kompatibilitas memengaruhi hash kata sandi baru.
IterationCount Jumlah iterasi yang digunakan saat hash kata sandi menggunakan PBKDF2. Nilai ini hanya digunakan ketika CompatibilityMode diatur ke IdentityV3. Nilai harus berupa bilangan bulat positif dan default ke 100000.

Dalam contoh berikut, IterationCount diatur ke 12000 dalam Program.cs:

// using Microsoft.AspNetCore.Identity;

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

Secara global mengharuskan semua pengguna diautentikasi

Untuk informasi tentang cara mengharuskan semua pengguna diautentikasi secara global, lihat Memerlukan pengguna yang diautentikasi.

ISecurityStampValidator dan SignOut di mana saja

Aplikasi perlu bereaksi terhadap peristiwa yang melibatkan tindakan sensitif keamanan dengan meregenerasi pengguna ClaimsPrincipal. Misalnya, ClaimsPrincipal harus diregenerasi saat bergabung dengan peran, mengubah kata sandi, atau peristiwa sensitif keamanan lainnya. IdentityISecurityStampValidator menggunakan antarmuka untuk meregenerasi ClaimsPrincipal. Implementasi default mendaftarkan SecurityStampValidator dengan aplikasi cookie utama dan dua faktor cookie.Identity Validator terhubung ke dalam OnValidatePrincipal peristiwa masing-masing cookie untuk memanggil Identity untuk memverifikasi bahwa klaim stempel keamanan pengguna tidak berubah dari apa yang disimpan di cookie. Validator memanggil secara berkala. Interval panggilan adalah tradeoff antara memukul datastore terlalu sering dan tidak cukup sering. Memeriksa dengan interval panjang menghasilkan klaim kedaluarsa. Panggil userManager.UpdateSecurityStampAsync(user)untuk memaksa s yang cookieada tidak valid saat berikutnya mereka diperiksa. Sebagian Identity besar akun UI dan mengelola panggilan userManager.UpdateSecurityStampAsync(user) halaman setelah mengubah kata sandi atau menambahkan login. Aplikasi dapat memanggil userManager.UpdateSecurityStampAsync(user) untuk menerapkan tindakan keluar di mana saja.

Mengubah interval validasi diperlihatkan dalam kode yang disorot berikut:

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 menggunakan nilai default untuk pengaturan seperti kebijakan kata sandi, penguncian, dan cookie konfigurasi. Pengaturan ini dapat ditimpa di Startup kelas .

Opsi Identity

Kelas IdentityOptions mewakili opsi yang dapat digunakan untuk mengonfigurasi Identity sistem. IdentityOptions harus diatur setelah memanggil AddIdentity atau AddDefaultIdentity.

Klaim Identity

IdentityOptions.ClaimsIdentityClaimsIdentityOptions menentukan dengan properti yang diperlihatkan dalam tabel berikut.

Properti Deskripsi Default
RoleClaimType Mendapatkan atau mengatur jenis klaim yang digunakan untuk klaim peran. ClaimTypes.Role
SecurityStampClaimType Mendapatkan atau mengatur jenis klaim yang digunakan untuk klaim stempel keamanan. AspNet.Identity.SecurityStamp
UserIdClaimType Mendapatkan atau mengatur jenis klaim yang digunakan untuk klaim pengidentifikasi pengguna. ClaimTypes.NameIdentifier
UserNameClaimType Mendapatkan atau mengatur jenis klaim yang digunakan untuk klaim nama pengguna. ClaimTypes.Name

Dikunci

Penguncian diatur dalam metode 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();
}

Kode sebelumnya didasarkan pada LoginIdentity templat.

Opsi penguncian diatur dalam StartUp.ConfigureServices:

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

Kode sebelumnya mengatur IdentityOptionsLockoutOptions dengan nilai default.

Autentikasi yang berhasil mengatur ulang jumlah upaya akses yang gagal dan mengatur ulang jam.

IdentityOptions.LockoutLockoutOptions menentukan dengan properti yang diperlihatkan dalam tabel.

Properti Deskripsi Default
AllowedForNewUsers Menentukan apakah pengguna baru dapat dikunci. true
DefaultLockoutTimeSpan Jumlah waktu pengguna dikunci saat penguncian terjadi. 5 menit
MaxFailedAccessAttempts Jumlah upaya akses yang gagal hingga pengguna dikunci, jika penguncian diaktifkan. 5

Kata sandi

Secara default, Identity mengharuskan kata sandi berisi karakter huruf besar, karakter huruf kecil, digit, dan karakter non-alfanumerik. Kata sandi harus panjangnya minimal enam karakter.

Kata sandi dikonfigurasi dengan:

  • PasswordOptions di Startup.ConfigureServices.
  • [StringLength]Password atribut properti jika Identity di-scaffold ke dalam aplikasi. InputModelPassword properti ditemukan dalam file berikut:
    • 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.PasswordPasswordOptions menentukan dengan properti yang diperlihatkan dalam tabel.

Properti Deskripsi Default
RequireDigit Memerlukan angka antara 0-9 dalam kata sandi. true
RequiredLength Panjang minimum kata sandi. 6
RequireLowercase Memerlukan karakter huruf kecil dalam kata sandi. true
RequireNonAlphanumeric Memerlukan karakter non-alfanumerik dalam kata sandi. true
RequiredUniqueChars Hanya berlaku untuk ASP.NET Core 2.0 atau yang lebih baru.

Memerlukan jumlah karakter yang berbeda dalam kata sandi.
1
RequireUppercase Memerlukan karakter huruf besar dalam kata sandi. true

Masuk

Kode berikut mengatur SignIn pengaturan (ke nilai default):

services.Configure<IdentityOptions>(options =>
{
    // Default SignIn settings.
    options.SignIn.RequireConfirmedEmail = false;
    options.SignIn.RequireConfirmedPhoneNumber = false;
});

IdentityOptions.SignInSignInOptions menentukan dengan properti yang diperlihatkan dalam tabel.

Properti Deskripsi Default
RequireConfirmedEmail Memerlukan email yang dikonfirmasi untuk masuk. false
RequireConfirmedPhoneNumber Memerlukan nomor telepon yang dikonfirmasi untuk masuk. false

Token

IdentityOptions.TokensTokenOptions menentukan dengan properti yang diperlihatkan dalam tabel.

Properti Deskripsi
AuthenticatorTokenProvider Mendapatkan atau mengatur yang AuthenticatorTokenProvider digunakan untuk memvalidasi masuk dua faktor dengan pengautentikasi.
ChangeEmailTokenProvider Mendapatkan atau mengatur yang ChangeEmailTokenProvider digunakan untuk menghasilkan token yang digunakan dalam email konfirmasi perubahan email.
ChangePhoneNumberTokenProvider Mendapatkan atau mengatur yang ChangePhoneNumberTokenProvider digunakan untuk menghasilkan token yang digunakan saat mengubah nomor telepon.
EmailConfirmationTokenProvider Mendapatkan atau mengatur penyedia token yang digunakan untuk menghasilkan token yang digunakan dalam email konfirmasi akun.
PasswordResetTokenProvider Mendapatkan atau mengatur yang IUserTwoFactorTokenProvider<TUser> digunakan untuk menghasilkan token yang digunakan dalam email reset kata sandi.
ProviderMap Digunakan untuk membuat Penyedia Token Pengguna dengan kunci yang digunakan sebagai nama penyedia.

Pengguna

services.Configure<IdentityOptions>(options =>
{
    // Default User settings.
    options.User.AllowedUserNameCharacters =
            "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
    options.User.RequireUniqueEmail = false;

});

IdentityOptions.UserUserOptions menentukan dengan properti yang diperlihatkan dalam tabel.

Properti Deskripsi Default
AllowedUserNameCharacters Karakter yang diizinkan dalam nama pengguna. abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
-._@+
RequireUniqueEmail Mengharuskan setiap pengguna untuk memiliki email unik. false

Konfigurasikan aplikasi cookie di Startup.ConfigureServices. KonfigurasikanApplicationCookie harus dipanggil setelah memanggil AddIdentity atau 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;
});

Untuk informasi selengkapnya, lihat CookieAuthenticationOptions .

Opsi Hasher Kata Sandi

PasswordHasherOptions mendapatkan dan mengatur opsi untuk hashing kata sandi.

Opsi Deskripsi
CompatibilityMode Mode kompatibilitas yang digunakan saat hash kata sandi baru. Default ke IdentityV3. Byte pertama dari kata sandi yang di-hash, yang disebut penanda format, menentukan versi algoritma hashing yang digunakan untuk hash kata sandi. Saat memverifikasi kata sandi terhadap hash, VerifyHashedPassword metode memilih algoritma yang benar berdasarkan byte pertama. Klien dapat mengautentikasi terlepas dari versi algoritma mana yang digunakan untuk hash kata sandi. Mengatur mode kompatibilitas memengaruhi hash kata sandi baru.
IterationCount Jumlah iterasi yang digunakan saat hash kata sandi menggunakan PBKDF2. Nilai ini hanya digunakan ketika CompatibilityMode diatur ke IdentityV3. Nilai harus berupa bilangan bulat positif dan default ke 10000.

Dalam contoh berikut, IterationCount diatur ke 12000 dalam Startup.ConfigureServices:

// using Microsoft.AspNetCore.Identity;

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

Secara global mengharuskan semua pengguna diautentikasi

Untuk informasi tentang cara mengharuskan semua pengguna diautentikasi secara global, lihat Memerlukan pengguna yang diautentikasi.