Condividi tramite


Configurare ASP.NET Core Identity

ASP.NET Core Identity usa i valori predefiniti per le impostazioni, ad esempio i criteri password, il blocco e cookie la configurazione. Queste impostazioni possono essere sostituite all'avvio dell'applicazione.

Opzioni Identity

La IdentityOptions classe rappresenta le opzioni che è possibile utilizzare per configurare il Identity sistema. IdentityOptions deve essere impostato dopo aver chiamato AddIdentity o AddDefaultIdentity.

Crediti Identity

IdentityOptions.ClaimsIdentity specifica con ClaimsIdentityOptions le proprietà illustrate nella tabella seguente.

Proprietà Descrizione Default
RoleClaimType Ottiene o imposta il tipo di attestazione utilizzato per un'attestazione di ruolo. ClaimTypes.Role
SecurityStampClaimType Ottiene o imposta il tipo di attestazione utilizzato per l'attestazione del timbro di sicurezza. AspNet.Identity.SecurityStamp
UserIdClaimType Ottiene o imposta il tipo di attestazione utilizzato per l'attestazione dell'identificatore utente. ClaimTypes.NameIdentifier
UserNameClaimType Ottiene o imposta il tipo di attestazione utilizzato per l'attestazione del nome utente. ClaimTypes.Name

Blocco

Il blocco viene impostato nel metodo 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();
}

Il codice precedente si basa sul LoginIdentity modello.

Le opzioni di blocco sono impostate in 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();

Il codice precedente imposta con IdentityOptions LockoutOptions i valori predefiniti.

Un'autenticazione riuscita reimposta il conteggio dei tentativi di accesso non riusciti e reimposta l'orologio.

IdentityOptions.Lockout specifica l'oggetto LockoutOptions con le proprietà visualizzate nella tabella.

Proprietà Descrizione Default
AllowedForNewUsers Determina se un nuovo utente può essere bloccato. true
DefaultLockoutTimeSpan Quantità di tempo per cui un utente viene bloccato quando si verifica un blocco. 5 minuti
MaxFailedAccessAttempts Numero di tentativi di accesso non riusciti fino a quando un utente non viene bloccato, se il blocco è abilitato. 5

Password

Per impostazione predefinita, Identity richiede che le password contengano un carattere maiuscolo, un carattere minuscolo, una cifra e un carattere non alfanumerico. Le password devono avere una lunghezza di almeno sei caratteri.

Le password sono configurate con:

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 specifica l'oggetto PasswordOptions con le proprietà visualizzate nella tabella.

Proprietà Descrizione Default
RequireDigit Richiede un numero compreso tra 0 e 9 nella password. true
RequiredLength Lunghezza minima della password. 6
RequireLowercase Richiede un carattere minuscolo nella password. true
RequireNonAlphanumeric Richiede un carattere non alfanumerico nella password. true
RequiredUniqueChars Si applica solo a ASP.NET Core 2.0 o versione successiva.

Richiede il numero di caratteri distinti nella password.
1
RequireUppercase Richiede un carattere maiuscolo nella password. true

Accedi

Il codice seguente imposta SignIn le impostazioni (su valori predefiniti):

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

IdentityOptions.SignIn specifica l'oggetto SignInOptions con le proprietà visualizzate nella tabella.

Proprietà Descrizione Default
RequireConfirmedEmail Richiede un messaggio di posta elettronica confermato per l'accesso. false
RequireConfirmedPhoneNumber Richiede un numero di telefono confermato per l'accesso. false

OAuth

IdentityOptions.Tokens specifica l'oggetto TokenOptions con le proprietà visualizzate nella tabella.

Proprietà Descrizione
AuthenticatorTokenProvider Ottiene o imposta l'oggetto AuthenticatorTokenProvider utilizzato per convalidare gli accessi a due fattori con un autenticatore.
ChangeEmailTokenProvider Ottiene o imposta l'oggetto ChangeEmailTokenProvider utilizzato per generare i token usati nei messaggi di posta elettronica di conferma delle modifiche.
ChangePhoneNumberTokenProvider Ottiene o imposta l'oggetto ChangePhoneNumberTokenProvider utilizzato per generare token utilizzati durante la modifica dei numeri di telefono.
EmailConfirmationTokenProvider Ottiene o imposta il provider di token utilizzato per generare i token usati nei messaggi di posta elettronica di conferma dell'account.
PasswordResetTokenProvider Ottiene o imposta l'oggetto IUserTwoFactorTokenProvider<TUser> utilizzato per generare i token usati nei messaggi di posta elettronica di reimpostazione della password.
ProviderMap Usato per costruire un provider di token utente con la chiave usata come nome del provider.

Utente

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

});

IdentityOptions.User specifica l'oggetto UserOptions con le proprietà visualizzate nella tabella.

Proprietà Descrizione Default
AllowedUserNameCharacters Caratteri consentiti nel nome utente. abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
-._@+
RequireUniqueEmail Richiede a ogni utente di avere un messaggio di posta elettronica univoco. false

Configurare l'app cookie in Program.cs. ConfigureApplicationCookie deve essere chiamato dopo aver chiamato AddIdentity o 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;
});

Per ulteriori informazioni, vedere CookieAuthenticationOptions.

Opzioni hasher password

PasswordHasherOptions ottiene e imposta le opzioni per l'hash delle password.

Opzione Descrizione
CompatibilityMode Modalità di compatibilità utilizzata per l'hashing di nuove password. Il valore predefinito è IdentityV3. Il primo byte di una password con hash, denominato marcatore di formato, specifica la versione dell'algoritmo hash usato per eseguire l'hashing della password. Quando si verifica una password rispetto a un hash, il VerifyHashedPassword metodo seleziona l'algoritmo corretto in base al primo byte. Un client è in grado di eseguire l'autenticazione indipendentemente dalla versione dell'algoritmo usata per eseguire l'hashing della password. L'impostazione della modalità di compatibilità influisce sull'hash delle nuove password.
IterationCount Numero di iterazioni usate per l'hashing delle password tramite PBKDF2. Questo valore viene usato solo quando CompatibilityMode è impostato su IdentityV3. Il valore deve essere un numero intero positivo e il valore predefinito è 100000.

Nell'esempio seguente l'oggetto IterationCount è impostato su 12000 in Program.cs:

// using Microsoft.AspNetCore.Identity;

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

A livello globale, tutti gli utenti devono essere autenticati

Per informazioni su come richiedere a livello globale l'autenticazione di tutti gli utenti, vedere Richiedere utenti autenticati.

ISecurityStampValidator e SignOut ovunque

Le app devono reagire agli eventi che coinvolgono azioni sensibili alla sicurezza rigenerando gli utenti ClaimsPrincipal. Ad esempio, deve essere rigenerato durante l'aggiunta ClaimsPrincipal di un ruolo, la modifica della password o altri eventi sensibili alla sicurezza. Identity usa l'interfaccia ISecurityStampValidator per rigenerare l'oggetto ClaimsPrincipal. L'implementazione predefinita di registra un SecurityStampValidator con l'applicazione cookie principale e il valore a due fattoricookie.Identity Il validator si aggancia all'evento OnValidatePrincipal di ogni cookie chiamata a per verificare che l'attestazione del timbro di sicurezza dell'utente sia invariata rispetto a Identity quanto archiviato in cookie. Il validator chiama in a intervalli regolari. L'intervallo di chiamata è un compromesso tra il raggiungimento troppo frequente dell'archivio dati e non abbastanza spesso. Il controllo con un intervallo lungo comporta attestazioni non aggiornati. Chiamata userManager.UpdateSecurityStampAsync(user)per forzare l'invalidità dei cookie esistenti alla successiva verifica. La maggior parte dell'account dell'interfaccia Identity utente e gestire le chiamate di pagine userManager.UpdateSecurityStampAsync(user) dopo la modifica della password o l'aggiunta di un account di accesso. Le app possono chiamare userManager.UpdateSecurityStampAsync(user) per implementare un'azione disconnessa ovunque.

La modifica dell'intervallo di convalida è illustrata nel codice evidenziato seguente:

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 usa i valori predefiniti per le impostazioni, ad esempio i criteri password, il blocco e cookie la configurazione. Queste impostazioni possono essere sostituite nella Startup classe .

Opzioni Identity

La IdentityOptions classe rappresenta le opzioni che è possibile utilizzare per configurare il Identity sistema. IdentityOptions deve essere impostato dopo aver chiamato AddIdentity o AddDefaultIdentity.

Crediti Identity

IdentityOptions.ClaimsIdentity specifica con ClaimsIdentityOptions le proprietà illustrate nella tabella seguente.

Proprietà Descrizione Default
RoleClaimType Ottiene o imposta il tipo di attestazione utilizzato per un'attestazione di ruolo. ClaimTypes.Role
SecurityStampClaimType Ottiene o imposta il tipo di attestazione utilizzato per l'attestazione del timbro di sicurezza. AspNet.Identity.SecurityStamp
UserIdClaimType Ottiene o imposta il tipo di attestazione utilizzato per l'attestazione dell'identificatore utente. ClaimTypes.NameIdentifier
UserNameClaimType Ottiene o imposta il tipo di attestazione utilizzato per l'attestazione del nome utente. ClaimTypes.Name

Blocco

Il blocco viene impostato nel metodo 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();
}

Il codice precedente si basa sul LoginIdentity modello.

Le opzioni di blocco sono impostate in StartUp.ConfigureServices:

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

Il codice precedente imposta con IdentityOptions LockoutOptions i valori predefiniti.

Un'autenticazione riuscita reimposta il conteggio dei tentativi di accesso non riusciti e reimposta l'orologio.

IdentityOptions.Lockout specifica l'oggetto LockoutOptions con le proprietà visualizzate nella tabella.

Proprietà Descrizione Default
AllowedForNewUsers Determina se un nuovo utente può essere bloccato. true
DefaultLockoutTimeSpan Quantità di tempo per cui un utente viene bloccato quando si verifica un blocco. 5 minuti
MaxFailedAccessAttempts Numero di tentativi di accesso non riusciti fino a quando un utente non viene bloccato, se il blocco è abilitato. 5

Password

Per impostazione predefinita, Identity richiede che le password contengano un carattere maiuscolo, un carattere minuscolo, una cifra e un carattere non alfanumerico. Le password devono avere una lunghezza di almeno sei caratteri.

Le password sono configurate con:

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 specifica l'oggetto PasswordOptions con le proprietà visualizzate nella tabella.

Proprietà Descrizione Default
RequireDigit Richiede un numero compreso tra 0 e 9 nella password. true
RequiredLength Lunghezza minima della password. 6
RequireLowercase Richiede un carattere minuscolo nella password. true
RequireNonAlphanumeric Richiede un carattere non alfanumerico nella password. true
RequiredUniqueChars Si applica solo a ASP.NET Core 2.0 o versione successiva.

Richiede il numero di caratteri distinti nella password.
1
RequireUppercase Richiede un carattere maiuscolo nella password. true

Accedi

Il codice seguente imposta SignIn le impostazioni (su valori predefiniti):

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

IdentityOptions.SignIn specifica l'oggetto SignInOptions con le proprietà visualizzate nella tabella.

Proprietà Descrizione Default
RequireConfirmedEmail Richiede un messaggio di posta elettronica confermato per l'accesso. false
RequireConfirmedPhoneNumber Richiede un numero di telefono confermato per l'accesso. false

OAuth

IdentityOptions.Tokens specifica l'oggetto TokenOptions con le proprietà visualizzate nella tabella.

Proprietà Descrizione
AuthenticatorTokenProvider Ottiene o imposta l'oggetto AuthenticatorTokenProvider utilizzato per convalidare gli accessi a due fattori con un autenticatore.
ChangeEmailTokenProvider Ottiene o imposta l'oggetto ChangeEmailTokenProvider utilizzato per generare i token usati nei messaggi di posta elettronica di conferma delle modifiche.
ChangePhoneNumberTokenProvider Ottiene o imposta l'oggetto ChangePhoneNumberTokenProvider utilizzato per generare token utilizzati durante la modifica dei numeri di telefono.
EmailConfirmationTokenProvider Ottiene o imposta il provider di token utilizzato per generare i token usati nei messaggi di posta elettronica di conferma dell'account.
PasswordResetTokenProvider Ottiene o imposta l'oggetto IUserTwoFactorTokenProvider<TUser> utilizzato per generare i token usati nei messaggi di posta elettronica di reimpostazione della password.
ProviderMap Usato per costruire un provider di token utente con la chiave usata come nome del provider.

Utente

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

});

IdentityOptions.User specifica l'oggetto UserOptions con le proprietà visualizzate nella tabella.

Proprietà Descrizione Default
AllowedUserNameCharacters Caratteri consentiti nel nome utente. abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
-._@+
RequireUniqueEmail Richiede a ogni utente di avere un messaggio di posta elettronica univoco. false

Configurare l'app cookie in Startup.ConfigureServices. ConfigureApplicationCookie deve essere chiamato dopo aver chiamato AddIdentity o 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;
});

Per ulteriori informazioni, vedere CookieAuthenticationOptions.

Opzioni hasher password

PasswordHasherOptions ottiene e imposta le opzioni per l'hash delle password.

Opzione Descrizione
CompatibilityMode Modalità di compatibilità utilizzata per l'hashing di nuove password. Il valore predefinito è IdentityV3. Il primo byte di una password con hash, denominato marcatore di formato, specifica la versione dell'algoritmo hash usato per eseguire l'hashing della password. Quando si verifica una password rispetto a un hash, il VerifyHashedPassword metodo seleziona l'algoritmo corretto in base al primo byte. Un client è in grado di eseguire l'autenticazione indipendentemente dalla versione dell'algoritmo usata per eseguire l'hashing della password. L'impostazione della modalità di compatibilità influisce sull'hash delle nuove password.
IterationCount Numero di iterazioni usate per l'hashing delle password tramite PBKDF2. Questo valore viene usato solo quando CompatibilityMode è impostato su IdentityV3. Il valore deve essere un numero intero positivo e il valore predefinito è 10000.

Nell'esempio seguente l'oggetto IterationCount è impostato su 12000 in Startup.ConfigureServices:

// using Microsoft.AspNetCore.Identity;

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

A livello globale, tutti gli utenti devono essere autenticati

Per informazioni su come richiedere a livello globale l'autenticazione di tutti gli utenti, vedere Richiedere utenti autenticati.