Condividi tramite


Configurare ASP.NET Core Identity

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

Opzioni

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

Reclami

specifica con le proprietà illustrate nella tabella seguente.

Proprietà Descrizione Predefinito
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 Recupera o imposta il tipo di dichiarazione utilizzato per la dichiarazione dell'identificatore utente. ClaimTypes.NameIdentifier
UserNameClaimType Ottiene o imposta il tipo di claim utilizzato per il 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 modello LoginIdentity.

Le opzioni di blocco sono impostate in :

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 i valori predefiniti per .

Un'autenticazione con esito positivo reimposta il numero di tentativi di access non riusciti e reimposta l'orologio.

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

Proprietà Descrizione Predefinito
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 access non riusciti fino a quando un utente non viene bloccato, se il blocco è abilitato. 5

Password

Per impostazione predefinita, 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:

  • in .
  • attributi delle proprietà se è scaffoldato nell'app. Le proprietà sono disponibili nei file seguenti:
    • 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.

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

Proprietà Descrizione Predefinito
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 le impostazioni (su valori predefiniti):

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

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

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

Token

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

Proprietà Descrizione
AuthenticatorTokenProvider Ottiene o imposta l'oggetto utilizzato per convalidare gli accessi a due fattori con un autenticatore.
ChangeEmailTokenProvider Ottiene o imposta l'elemento utilizzato per generare i token usati nelle email di conferma delle modifiche.
ChangePhoneNumberTokenProvider Ottiene o imposta l'oggetto utilizzato per generare token 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 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 utilizzata come nome del provider.

Utente

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

});

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

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

Configurare le impostazioni dell'app in . ConfigureApplicationCookie deve essere chiamato dopo aver chiamato , o .

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 .

Opzioni di Password Hasher

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 è . 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 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 è impostato su . Il valore deve essere un numero intero positivo e il valore predefinito è .

Nell'esempio seguente, è impostato su in :

// 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 l'autenticazione per tutti gli utenti dell'app, vedere Creare un'app ASP.NET Core con i dati utente protetti dall'autorizzazione.

ISecurityStampValidator e SignOut ovunque

Le app devono reagire agli eventi che coinvolgono azioni sensibili alla sicurezza rigenerando gli utenti . Ad esempio, il deve essere rigenerato quando si aderisce a un ruolo, si modifica la password o in occasione di altri eventi sensibili alla sicurezza. usa l'interfaccia per rigenerare l'oggetto . L'implementazione predefinita di registra un SecurityStampValidator con l'applicazione principale e la validazione a due fattori . Il validator si aggancia all'evento di ogni per chiamare e verificare che l'attestazione del timbro di sicurezza dell'utente sia invariata rispetto a ciò che è archiviato in . Il validatore effettua chiamate a intervalli regolari. L'intervallo di chiamata è un compromesso tra la consultazione troppo frequente dell'archivio dati e una frequenza insufficiente. Il controllo con un intervallo lungo comporta attestazioni non aggiornati. Chiamata per forzare l'invalidamento dei cookie esistenti la prossima volta che vengono controllati. La maggior parte delle pagine di account dell'interfaccia utente effettuano chiamate a dopo la modifica della password o l'aggiunta di un login. Le app possono chiamare per implementare un'azione di disconnessione 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 valori predefiniti per le impostazioni, ad esempio i criteri delle password, il blocco e la cookie configurazione. Queste impostazioni possono essere sostituite nella classe .

Opzioni

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

Reclami

specifica con le proprietà illustrate nella tabella seguente.

Proprietà Descrizione Predefinito
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 Recupera o imposta il tipo di dichiarazione utilizzato per la dichiarazione dell'identificatore utente. ClaimTypes.NameIdentifier
UserNameClaimType Ottiene o imposta il tipo di claim utilizzato per il 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 modello.

Le opzioni di blocco sono impostate in :

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 i valori predefiniti per .

Un'autenticazione con esito positivo reimposta il numero di tentativi di access non riusciti e reimposta l'orologio.

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

Proprietà Descrizione Predefinito
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 access non riusciti fino a quando un utente non viene bloccato, se il blocco è abilitato. 5

Password

Per impostazione predefinita, 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:

  • in .
  • attributi delle proprietà se è scaffoldato nell'app. Le proprietà sono disponibili nei file seguenti:
    • 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;
});

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

Proprietà Descrizione Predefinito
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 le impostazioni (su valori predefiniti):

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

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

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

Token

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

Proprietà Descrizione
AuthenticatorTokenProvider Ottiene o imposta l'oggetto utilizzato per convalidare gli accessi a due fattori con un autenticatore.
ChangeEmailTokenProvider Ottiene o imposta l'elemento utilizzato per generare i token usati nelle email di conferma delle modifiche.
ChangePhoneNumberTokenProvider Ottiene o imposta l'oggetto utilizzato per generare token 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 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 utilizzata come nome del provider.

Utente

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

});

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

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

Configurare le impostazioni dell'app in . ConfigureApplicationCookie deve essere chiamato dopo aver chiamato , o .

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 .

Opzioni di Password Hasher

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 è . 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 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 è impostato su . Il valore deve essere un numero intero positivo e il valore predefinito è .

Nell'esempio seguente, è impostato su in :

// 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 l'autenticazione per tutti gli utenti dell'app, vedere Creare un'app ASP.NET Core con i dati utente protetti dall'autorizzazione.