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 Login
Identity 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:
- PasswordOptions in
Program.cs
. [StringLength]
attributi dellePassword
proprietà se Identity viene eseguito lo scaffolding nell'app.InputModel
Password
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.
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 |
Impostazioni diCookie
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 Login
Identity 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:
- PasswordOptions in
Startup.ConfigureServices
. [StringLength]
attributi dellePassword
proprietà se Identity viene eseguito lo scaffolding nell'app.InputModel
Password
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;
});
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 |
Impostazioni diCookie
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.