Konfigurace ASP.NET Core Identity

ASP.NET Core Identity používá výchozí hodnoty pro nastavení, jako jsou zásady hesel, uzamčení a cookie konfigurace. Tato nastavení je možné přepsat při spuštění aplikace.

Identity Možnosti

Třída IdentityOptions představuje možnosti, které lze použít ke konfiguraci Identity systému. IdentityOptions musí být nastavena po volání AddIdentity nebo AddDefaultIdentity.

Nároky Identity

IdentityOptions.ClaimsIdentity určuje ClaimsIdentityOptions vlastnosti zobrazené v následující tabulce.

Vlastnost Popis Výchozí
RoleClaimType Získá nebo nastaví typ deklarace identity použité pro deklaraci role. ClaimTypes.Role
SecurityStampClaimType Získá nebo nastaví typ deklarace identity použité pro deklaraci razítka zabezpečení. AspNet.Identity.SecurityStamp
UserIdClaimType Získá nebo nastaví typ deklarace identity použité pro deklaraci identity identifikátoru uživatele. ClaimTypes.NameIdentifier
UserNameClaimType Získá nebo nastaví typ deklarace identity použité pro deklaraci uživatelského jména. ClaimTypes.Name

Uzamčení

Uzamčení je nastavené v metodě 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();
}

Předchozí kód je založený na šabloněIdentityLogin.

Možnosti uzamčení jsou nastavené v 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();

Předchozí kód nastaví IdentityOptionsLockoutOptions výchozí hodnoty.

Úspěšné ověření resetuje počet neúspěšných pokusů o přístup a resetuje hodiny.

IdentityOptions.Lockout určuje LockoutOptions vlastnosti zobrazené v tabulce.

Vlastnost Popis Výchozí
AllowedForNewUsers Určuje, jestli je možné uzamknout nového uživatele. true
DefaultLockoutTimeSpan Doba, po kterou je uživatel uzamčen, když dojde k uzamčení 5 minut
MaxFailedAccessAttempts Počet neúspěšných pokusů o přístup, dokud se uživatel nezamkne, pokud je povolené uzamčení. 5

Heslo

Ve výchozím nastavení vyžaduje, Identity aby hesla obsahovala velká písmena, malá písmena, číslici a nealnumerický znak. Hesla musí mít délku nejméně šesti znaků.

Hesla se konfigurují pomocí:

  • PasswordOptions v Program.cs.
  • [StringLength]Password atributy vlastností, pokud Identity jsou vygenerovány do aplikace. InputModelPassword vlastnosti jsou nalezeny v následujících souborech:
    • 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 určuje PasswordOptions vlastnosti zobrazené v tabulce.

Vlastnost Popis Výchozí
RequireDigit Vyžaduje číslo od 0 do 9 v hesle. true
RequiredLength Minimální délka hesla. 6
RequireLowercase Vyžaduje v hesle malá písmena. true
RequireNonAlphanumeric Vyžaduje v hesle jiný než alfanumerický znak. true
RequiredUniqueChars Platí jenom pro ASP.NET Core 2.0 nebo novější.

Vyžaduje počet jedinečných znaků v hesle.
0
RequireUppercase Vyžaduje v hesle velká písmena. true

Přihlášení

Následující kód nastaví SignIn nastavení (výchozí hodnoty):

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

IdentityOptions.SignIn určuje SignInOptions vlastnosti zobrazené v tabulce.

Vlastnost Popis Výchozí
RequireConfirmedEmail Vyžaduje, aby se přihlásil potvrzený e-mail. false
RequireConfirmedPhoneNumber Vyžaduje, aby se přihlásilo potvrzené telefonní číslo. false

Tokeny

IdentityOptions.Tokens určuje TokenOptions vlastnosti zobrazené v tabulce.

Vlastnost Popis
AuthenticatorTokenProvider Získá nebo nastaví AuthenticatorTokenProvider použité k ověření dvoufaktorových přihlášení pomocí ověřovacího objektu.
ChangeEmailTokenProvider Získá nebo nastaví ChangeEmailTokenProvider použité k vygenerování tokenů použitých v e-mailových potvrzovacích e-mailech s potvrzením změn e-mailů.
ChangePhoneNumberTokenProvider Získá nebo nastaví ChangePhoneNumberTokenProvider použité k vygenerování tokenů použitých při změně telefonních čísel.
EmailConfirmationTokenProvider Získá nebo nastaví zprostředkovatele tokenu použitého k vygenerování tokenů použitých v e-mailech s potvrzením účtu.
PasswordResetTokenProvider Získá nebo nastaví IUserTwoFactorTokenProvider<TUser> použité k vygenerování tokenů používaných v e-mailech pro resetování hesla.
ProviderMap Slouží k vytvoření zprostředkovatele tokenu uživatele s klíčem použitým jako název poskytovatele.

Uživatelská

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

});

IdentityOptions.User určuje UserOptions vlastnosti zobrazené v tabulce.

Vlastnost Popis Výchozí
AllowedUserNameCharacters Povolené znaky v uživatelském jménu. Abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
-._@+
RequireUniqueEmail Vyžaduje, aby každý uživatel měl jedinečný e-mail. false

Nakonfigurujte aplikaci v Program.csaplikaci cookie . KonfiguraceApplicationCookie musí být volána po volání AddIdentity nebo 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;
});

Další informace najdete na webu CookieAuthenticationOptions.

Možnosti hasher hesla

PasswordHasherOptions získá a nastaví možnosti pro hashování hesel.

Možnost Popis
CompatibilityMode Režim kompatibility použitý při zatřiďování nových hesel. Výchozí hodnota IdentityV3je . První bajt hashovaného hesla označovaného jako značka formátu určuje verzi algoritmu hash použitého k hashování hesla. Při ověřování hesla proti hodnotě hash VerifyHashedPassword metoda vybere správný algoritmus na základě prvního bajtu. Klient se může ověřit bez ohledu na to, jakou verzi algoritmu se použila k hashování hesla. Nastavení režimu kompatibility ovlivňuje hashování nových hesel.
IterationCount Počet iterací používaných při hashování hesel pomocí PBKDF2. Tato hodnota se používá pouze v případě, že je nastavena CompatibilityMode na IdentityV3hodnotu . Hodnota musí být kladné celé číslo a výchozí hodnota 100000je .

V následujícím příkladu je nastavena IterationCount na 12000 hodnotu :Program.cs

// using Microsoft.AspNetCore.Identity;

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

Globální vyžadování ověření všech uživatelů

Informace o tom, jak globálně vyžadovat ověření všech uživatelů, najdete v tématu Vyžadování ověřených uživatelů.

ISecurityStampValidator a SignOut všude

Aplikace musí reagovat na události, které zahrnují akce citlivé na zabezpečení tím, že znovu vygenerují uživatele ClaimsPrincipal. ClaimsPrincipal Při připojování k roli, změně hesla nebo jiných událostí citlivých na zabezpečení by se například mělo znovu vygenerovat. IdentityISecurityStampValidator používá rozhraní k opětovnému vygenerování ClaimsPrincipal. Výchozí implementace Identity registru SecurityStampValidator v hlavní aplikaci cookie a dvoufaktorové cookie. Validátor se připojí k OnValidatePrincipal události každého cookie volání Identity , aby ověřil, že deklarace identity razítka zabezpečení uživatele se nezmění od toho, co je uloženo v objektu cookie. Validátor volá v pravidelných intervalech. Interval volání je kompromisem mezi příliš častým dosažením úložiště dat a ne dostatečně často. Kontrola s dlouhým intervalem vede k zastaralým deklaracím identity. Volání userManager.UpdateSecurityStampAsync(user), které vynutí, aby existující cookiehodnoty byly při příští kontrole neplatné. Identity Většina účtu uživatelského rozhraní a správa volání userManager.UpdateSecurityStampAsync(user) stránek po změně hesla nebo přidání přihlášení. Aplikace můžou volat userManager.UpdateSecurityStampAsync(user) k implementaci akce odhlášení všude.

Změna intervalu ověření se zobrazí v následujícím zvýrazněném kódu:

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 používá výchozí hodnoty pro nastavení, jako jsou zásady hesel, uzamčení a cookie konfigurace. Tato nastavení je možné přepsat ve Startup třídě.

Identity Možnosti

Třída IdentityOptions představuje možnosti, které lze použít ke konfiguraci Identity systému. IdentityOptions musí být nastavena po volání AddIdentity nebo AddDefaultIdentity.

Nároky Identity

IdentityOptions.ClaimsIdentity určuje ClaimsIdentityOptions vlastnosti zobrazené v následující tabulce.

Vlastnost Popis Výchozí
RoleClaimType Získá nebo nastaví typ deklarace identity použité pro deklaraci role. ClaimTypes.Role
SecurityStampClaimType Získá nebo nastaví typ deklarace identity použité pro deklaraci razítka zabezpečení. AspNet.Identity.SecurityStamp
UserIdClaimType Získá nebo nastaví typ deklarace identity použité pro deklaraci identity identifikátoru uživatele. ClaimTypes.NameIdentifier
UserNameClaimType Získá nebo nastaví typ deklarace identity použité pro deklaraci uživatelského jména. ClaimTypes.Name

Uzamčení

Uzamčení je nastavené v metodě 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();
}

Předchozí kód je založený na šabloně LoginIdentity .

Možnosti uzamčení jsou nastavené v StartUp.ConfigureServices:

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

Předchozí kód nastaví IdentityOptionsLockoutOptions výchozí hodnoty.

Úspěšné ověření resetuje počet neúspěšných pokusů o přístup a resetuje hodiny.

IdentityOptions.Lockout určuje LockoutOptions vlastnosti zobrazené v tabulce.

Vlastnost Popis Výchozí
AllowedForNewUsers Určuje, jestli je možné uzamknout nového uživatele. true
DefaultLockoutTimeSpan Doba, po kterou je uživatel uzamčen, když dojde k uzamčení 5 minut
MaxFailedAccessAttempts Počet neúspěšných pokusů o přístup, dokud se uživatel nezamkne, pokud je povolené uzamčení. 5

Heslo

Ve výchozím nastavení vyžaduje, Identity aby hesla obsahovala velká písmena, malá písmena, číslici a nealnumerický znak. Hesla musí mít délku nejméně šesti znaků.

Hesla se konfigurují pomocí:

  • PasswordOptions v Startup.ConfigureServices.
  • [StringLength]Password atributy vlastností, pokud Identity jsou vygenerovány do aplikace. InputModelPassword vlastnosti jsou nalezeny v následujících souborech:
    • 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 určuje PasswordOptions vlastnosti zobrazené v tabulce.

Vlastnost Popis Výchozí
RequireDigit Vyžaduje číslo od 0 do 9 v hesle. true
RequiredLength Minimální délka hesla. 6
RequireLowercase Vyžaduje v hesle malá písmena. true
RequireNonAlphanumeric Vyžaduje v hesle jiný než alfanumerický znak. true
RequiredUniqueChars Platí jenom pro ASP.NET Core 2.0 nebo novější.

Vyžaduje počet jedinečných znaků v hesle.
0
RequireUppercase Vyžaduje v hesle velká písmena. true

Přihlášení

Následující kód nastaví SignIn nastavení (výchozí hodnoty):

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

IdentityOptions.SignIn určuje SignInOptions vlastnosti zobrazené v tabulce.

Vlastnost Popis Výchozí
RequireConfirmedEmail Vyžaduje, aby se přihlásil potvrzený e-mail. false
RequireConfirmedPhoneNumber Vyžaduje, aby se přihlásilo potvrzené telefonní číslo. false

Tokeny

IdentityOptions.Tokens určuje TokenOptions vlastnosti zobrazené v tabulce.

Vlastnost Popis
AuthenticatorTokenProvider Získá nebo nastaví AuthenticatorTokenProvider použité k ověření dvoufaktorových přihlášení pomocí ověřovacího objektu.
ChangeEmailTokenProvider Získá nebo nastaví ChangeEmailTokenProvider použité k vygenerování tokenů použitých v e-mailových potvrzovacích e-mailech s potvrzením změn e-mailů.
ChangePhoneNumberTokenProvider Získá nebo nastaví ChangePhoneNumberTokenProvider použité k vygenerování tokenů použitých při změně telefonních čísel.
EmailConfirmationTokenProvider Získá nebo nastaví zprostředkovatele tokenu použitého k vygenerování tokenů použitých v e-mailech s potvrzením účtu.
PasswordResetTokenProvider Získá nebo nastaví IUserTwoFactorTokenProvider<TUser> použité k vygenerování tokenů používaných v e-mailech pro resetování hesla.
ProviderMap Slouží k vytvoření zprostředkovatele tokenu uživatele s klíčem použitým jako název poskytovatele.

Uživatelská

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

});

IdentityOptions.User určuje UserOptions vlastnosti zobrazené v tabulce.

Vlastnost Popis Výchozí
AllowedUserNameCharacters Povolené znaky v uživatelském jménu. Abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
-._@+
RequireUniqueEmail Vyžaduje, aby každý uživatel měl jedinečný e-mail. false

Nakonfigurujte aplikaci v Startup.ConfigureServicesaplikaci cookie . KonfiguraceApplicationCookie musí být volána po volání AddIdentity nebo 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;
});

Další informace najdete na webu CookieAuthenticationOptions.

Možnosti hasher hesla

PasswordHasherOptions získá a nastaví možnosti pro hashování hesel.

Možnost Popis
CompatibilityMode Režim kompatibility použitý při zatřiďování nových hesel. Výchozí hodnota IdentityV3je . První bajt hashovaného hesla označovaného jako značka formátu určuje verzi algoritmu hash použitého k hashování hesla. Při ověřování hesla proti hodnotě hash VerifyHashedPassword metoda vybere správný algoritmus na základě prvního bajtu. Klient se může ověřit bez ohledu na to, jakou verzi algoritmu se použila k hashování hesla. Nastavení režimu kompatibility ovlivňuje hashování nových hesel.
IterationCount Počet iterací používaných při hashování hesel pomocí PBKDF2. Tato hodnota se používá pouze v případě, že je nastavena CompatibilityMode na IdentityV3hodnotu . Hodnota musí být kladné celé číslo a výchozí hodnota 10000je .

V následujícím příkladu je nastavena IterationCount na 12000 hodnotu :Startup.ConfigureServices

// using Microsoft.AspNetCore.Identity;

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

Globální vyžadování ověření všech uživatelů

Informace o tom, jak globálně vyžadovat ověření všech uživatelů, najdete v tématu Vyžadování ověřených uživatelů.