Configurer ASP.NET Core Identity
ASP.NET Core Identity utilise des valeurs par défaut pour les paramètres tels que la stratégie de mot de passe, le verrouillage et la configuration de cookie. Ces paramètres peuvent être remplacés au démarrage de l’application.
Identity options
La classe IdentityOptions représente les options qui peuvent être utilisées pour configurer le système Identity. IdentityOptions doit être défini après l’appel de AddIdentity ou de AddDefaultIdentity.
Revendications Identity
IdentityOptions.ClaimsIdentity spécifie ClaimsIdentityOptions avec les propriétés indiquées dans le tableau suivant.
Propriété | Description | Default |
---|---|---|
RoleClaimType | Obtient ou définit le type de revendication utilisé pour une revendication de rôle. | ClaimTypes.Role |
SecurityStampClaimType | Obtient ou définit le type de revendication utilisé pour la revendication d’empreinte de sécurité. | AspNet.Identity.SecurityStamp |
UserIdClaimType | Obtient ou définit le type de revendication utilisé pour la revendication d’identité d’utilisateur. | ClaimTypes.NameIdentifier |
UserNameClaimType | Obtient ou définit le type de revendication utilisé pour la revendication de nom d’utilisateur. | ClaimTypes.Name |
Verrouillé
Le verrouillage est défini dans la méthode 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();
}
Le code précédent est basé sur le modèle IdentityLogin
.
Les options de verrouillage sont définies dans 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();
Le code précédent définit IdentityOptions LockoutOptions avec les valeurs par défaut.
Une authentification réussie réinitialise le nombre de tentatives d’accès ayant échoué et réinitialise l’horloge.
IdentityOptions.Lockout spécifie LockoutOptions avec les propriétés indiquées dans le tableau.
Propriété | Description | Default |
---|---|---|
AllowedForNewUsers | Détermine si un nouvel utilisateur peut être verrouillé. | true |
DefaultLockoutTimeSpan | Durée pendant laquelle un utilisateur est verrouillé quand un verrouillage se produit. | 5 minutes |
MaxFailedAccessAttempts | Nombre de tentatives d’accès ayant échoué jusqu’à ce qu’un utilisateur soit verrouillé, si le verrouillage est activé. | 5 |
Mot de passe
Par défaut, Identity exige que les mots de passe contiennent un caractère majuscule, un caractère minuscule, un chiffre et un caractère non alphanumérique. Les mots de passe doivent contenir au moins six caractères.
Les mots de passe sont configurés avec :
- PasswordOptions dans
Program.cs
. - Des attributs
[StringLength]
des propriétésPassword
si un modèle Identity est généré automatiquement dans l’application. Les propriétésInputModel
Password
se trouvent dans les fichiers suivants :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 spécifie PasswordOptions avec les propriétés indiquées dans le tableau.
Propriété | Description | Default |
---|---|---|
RequireDigit | Exige un chiffre de 0 à 9 dans le mot de passe. | true |
RequiredLength | Longueur minimale du mot de passe. | 6 |
RequireLowercase | Exige un caractère minuscule dans le mot de passe. | true |
RequireNonAlphanumeric | Exige un caractère non alphanumérique dans le mot de passe. | true |
RequiredUniqueChars | Ne s’applique qu’à ASP.NET Core 2.0 ou version ultérieure. Exige le nombre de caractères distincts dans le mot de passe. |
1 |
RequireUppercase | Exige un caractère majuscule dans le mot de passe. | true |
Connexion
Le code suivant définit les paramètres SignIn
(avec les valeurs par défaut) :
builder.Services.Configure<IdentityOptions>(options =>
{
// Default SignIn settings.
options.SignIn.RequireConfirmedEmail = false;
options.SignIn.RequireConfirmedPhoneNumber = false;
});
IdentityOptions.SignIn spécifie SignInOptions avec les propriétés indiquées dans le tableau.
Propriété | Description | Default |
---|---|---|
RequireConfirmedEmail | Exige une adresse e-mail confirmée pour la connexion. | false |
RequireConfirmedPhoneNumber | Exige un numéro de téléphone confirmé pour la connexion. | false |
Jetons
IdentityOptions.Tokens spécifie TokenOptions avec les propriétés indiquées dans le tableau.
Propriété | Description |
---|---|
AuthenticatorTokenProvider | Obtient ou définit la propriété AuthenticatorTokenProvider utilisée pour valider les connexions à deux facteurs avec un authentificateur. |
ChangeEmailTokenProvider | Obtient ou définit la propriété ChangeEmailTokenProvider utilisée pour générer les jetons utilisés dans les e-mails de confirmation de changement d’adresse e-mail. |
ChangePhoneNumberTokenProvider | Obtient ou définit la propriété ChangePhoneNumberTokenProvider utilisée pour générer les jetons utilisés lors de la modification du numéro de téléphone. |
EmailConfirmationTokenProvider | Obtient ou définit le fournisseur de jetons utilisé pour générer les jetons utilisés dans les e-mails de confirmation de compte. |
PasswordResetTokenProvider | Obtient ou définit la propriété IUserTwoFactorTokenProvider<TUser> utilisée pour générer les jetons utilisés dans les e-mails de réinitialisation de mot de passe. |
ProviderMap | Sert à construire un fournisseur de jetons utilisateur avec la clé utilisée comme nom du fournisseur. |
Utilisateur
builder.Services.Configure<IdentityOptions>(options =>
{
// Default User settings.
options.User.AllowedUserNameCharacters =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
options.User.RequireUniqueEmail = false;
});
IdentityOptions.User spécifie UserOptions avec les propriétés indiquées dans le tableau.
Propriété | Description | Default |
---|---|---|
AllowedUserNameCharacters | Caractères autorisés dans le nom d’utilisateur. | abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 -._@+ |
RequireUniqueEmail | Exige que chaque utilisateur dispose d’une adresse e-mail unique. | false |
ParamètresCookie
Configurez le cookie de l’application dans Program.cs
. ConfigureApplicationCookie doit être appelé après l’appel de AddIdentity
ou de 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;
});
Pour plus d’informations, consultez CookieAuthenticationOptions.
Options de hachage des mots de passe
PasswordHasherOptions obtient et définit les options de hachage des mots de passe.
Option | Description |
---|---|
CompatibilityMode | Mode de compatibilité utilisé lors du hachage de nouveaux mots de passe. La valeur par défaut est IdentityV3. Le premier octet d’un mot de passe haché, appelé marqueur de format, spécifie la version de l’algorithme de hachage utilisé pour hacher le mot de passe. Lors de la vérification d’un mot de passe par rapport à un hachage, la méthode VerifyHashedPassword sélectionne l’algorithme approprié en fonction du premier octet. Un client peut s’authentifier quelle que soit la version de l’algorithme utilisée pour hacher le mot de passe. La définition du mode de compatibilité affecte le hachage des nouveaux mots de passe. |
IterationCount | Nombre d’itérations utilisées lors du hachage des mots de passe à l’aide de PBKDF2. Cette valeur est utilisée uniquement quand CompatibilityMode est défini sur IdentityV3. La valeur doit être un entier positif et la valeur par défaut est 100000 . |
Dans l’exemple suivant, IterationCount est défini sur 12000
dans Program.cs
:
// using Microsoft.AspNetCore.Identity;
builder.Services.Configure<PasswordHasherOptions>(option =>
{
option.IterationCount = 12000;
});
Exiger globalement que tous les utilisateurs soient authentifiés
Pour plus d’informations sur la façon d’exiger l’authentification globale de tous les utilisateurs, consultez la section Exiger des utilisateurs authentifiés.
ISecurityStampValidator et SignOut partout
Les applications doivent réagir aux événements impliquant des actions sensibles sur le plan de la sécurité en régénérant la classe ClaimsPrincipal des utilisateurs. Par exemple, ClaimsPrincipal
doit être régénéré lors de la jonction d’un rôle, de la modification du mot de passe ou d’autres événements sensibles sur le plan de la sécurité. Identity utilise l’interface ISecurityStampValidator pour régénérer ClaimsPrincipal
. L’implémentation par défaut de Identity inscrit SecurityStampValidator avec l’application principale cookie et le cookie à deux facteurs. Le validateur se connecte à l’événement OnValidatePrincipal de chaque cookie à appeler dans Identity pour vérifier que la revendication de l’empreinte de sécurité de l’utilisateur est inchangée par rapport à ce qui est stocké dans le cookie. Le validateur appelle à intervalles réguliers. L’intervalle d’appel est un compromis entre le fait d’atteindre le magasin de données trop fréquemment et pas assez souvent. La vérification avec un intervalle long entraîne des revendications obsolètes. Appelez userManager.UpdateSecurityStampAsync(user)
pour forcer les cookies existants à être non valides la prochaine fois qu’ils sont vérifiés. La plupart des pages de gestion et de compte d’interface utilisateur Identity appellent userManager.UpdateSecurityStampAsync(user)
après la modification du mot de passe ou l’ajout d’une connexion. Les applications peuvent appeler userManager.UpdateSecurityStampAsync(user)
pour implémenter une action de déconnexion partout.
La modification de l’intervalle de validation est indiquée dans le code en surbrillance suivant :
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 utilise des valeurs par défaut pour les paramètres tels que la stratégie de mot de passe, le verrouillage et la configuration de cookie. Ces paramètres peuvent être remplacés dans la classe Startup
.
Identity options
La classe IdentityOptions représente les options qui peuvent être utilisées pour configurer le système Identity. IdentityOptions
doit être défini après l’appel de AddIdentity
ou de AddDefaultIdentity
.
Revendications Identity
IdentityOptions.ClaimsIdentity spécifie ClaimsIdentityOptions avec les propriétés indiquées dans le tableau suivant.
Propriété | Description | Default |
---|---|---|
RoleClaimType | Obtient ou définit le type de revendication utilisé pour une revendication de rôle. | ClaimTypes.Role |
SecurityStampClaimType | Obtient ou définit le type de revendication utilisé pour la revendication d’empreinte de sécurité. | AspNet.Identity.SecurityStamp |
UserIdClaimType | Obtient ou définit le type de revendication utilisé pour la revendication d’identité d’utilisateur. | ClaimTypes.NameIdentifier |
UserNameClaimType | Obtient ou définit le type de revendication utilisé pour la revendication de nom d’utilisateur. | ClaimTypes.Name |
Verrouillé
Le verrouillage est défini dans la méthode 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();
}
Le code précédent est basé sur le modèle IdentityLogin
.
Les options de verrouillage sont définies dans StartUp.ConfigureServices
:
services.Configure<IdentityOptions>(options =>
{
// Default Lockout settings.
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 5;
options.Lockout.AllowedForNewUsers = true;
});
Le code précédent définit IdentityOptions LockoutOptions avec les valeurs par défaut.
Une authentification réussie réinitialise le nombre de tentatives d’accès ayant échoué et réinitialise l’horloge.
IdentityOptions.Lockout spécifie LockoutOptions avec les propriétés indiquées dans le tableau.
Propriété | Description | Default |
---|---|---|
AllowedForNewUsers | Détermine si un nouvel utilisateur peut être verrouillé. | true |
DefaultLockoutTimeSpan | Durée pendant laquelle un utilisateur est verrouillé quand un verrouillage se produit. | 5 minutes |
MaxFailedAccessAttempts | Nombre de tentatives d’accès ayant échoué jusqu’à ce qu’un utilisateur soit verrouillé, si le verrouillage est activé. | 5 |
Mot de passe
Par défaut, Identity exige que les mots de passe contiennent un caractère majuscule, un caractère minuscule, un chiffre et un caractère non alphanumérique. Les mots de passe doivent contenir au moins six caractères.
Les mots de passe sont configurés avec :
- PasswordOptions dans
Startup.ConfigureServices
. - Des attributs
[StringLength]
des propriétésPassword
si un modèle Identity est généré automatiquement dans l’application. Les propriétésInputModel
Password
se trouvent dans les fichiers suivants :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 spécifie PasswordOptions avec les propriétés indiquées dans le tableau.
Propriété | Description | Default |
---|---|---|
RequireDigit | Exige un chiffre de 0 à 9 dans le mot de passe. | true |
RequiredLength | Longueur minimale du mot de passe. | 6 |
RequireLowercase | Exige un caractère minuscule dans le mot de passe. | true |
RequireNonAlphanumeric | Exige un caractère non alphanumérique dans le mot de passe. | true |
RequiredUniqueChars | Ne s’applique qu’à ASP.NET Core 2.0 ou version ultérieure. Exige le nombre de caractères distincts dans le mot de passe. |
1 |
RequireUppercase | Exige un caractère majuscule dans le mot de passe. | true |
Connexion
Le code suivant définit les paramètres SignIn
(avec les valeurs par défaut) :
services.Configure<IdentityOptions>(options =>
{
// Default SignIn settings.
options.SignIn.RequireConfirmedEmail = false;
options.SignIn.RequireConfirmedPhoneNumber = false;
});
IdentityOptions.SignIn spécifie SignInOptions avec les propriétés indiquées dans le tableau.
Propriété | Description | Default |
---|---|---|
RequireConfirmedEmail | Exige une adresse e-mail confirmée pour la connexion. | false |
RequireConfirmedPhoneNumber | Exige un numéro de téléphone confirmé pour la connexion. | false |
Jetons
IdentityOptions.Tokens spécifie TokenOptions avec les propriétés indiquées dans le tableau.
Propriété | Description |
---|---|
AuthenticatorTokenProvider | Obtient ou définit la propriété AuthenticatorTokenProvider utilisée pour valider les connexions à deux facteurs avec un authentificateur. |
ChangeEmailTokenProvider | Obtient ou définit la propriété ChangeEmailTokenProvider utilisée pour générer les jetons utilisés dans les e-mails de confirmation de changement d’adresse e-mail. |
ChangePhoneNumberTokenProvider | Obtient ou définit la propriété ChangePhoneNumberTokenProvider utilisée pour générer les jetons utilisés lors de la modification du numéro de téléphone. |
EmailConfirmationTokenProvider | Obtient ou définit le fournisseur de jetons utilisé pour générer les jetons utilisés dans les e-mails de confirmation de compte. |
PasswordResetTokenProvider | Obtient ou définit la propriété IUserTwoFactorTokenProvider<TUser> utilisée pour générer les jetons utilisés dans les e-mails de réinitialisation de mot de passe. |
ProviderMap | Sert à construire un fournisseur de jetons utilisateur avec la clé utilisée comme nom du fournisseur. |
Utilisateur
services.Configure<IdentityOptions>(options =>
{
// Default User settings.
options.User.AllowedUserNameCharacters =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
options.User.RequireUniqueEmail = false;
});
IdentityOptions.User spécifie UserOptions avec les propriétés indiquées dans le tableau.
Propriété | Description | Default |
---|---|---|
AllowedUserNameCharacters | Caractères autorisés dans le nom d’utilisateur. | abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 -._@+ |
RequireUniqueEmail | Exige que chaque utilisateur dispose d’une adresse e-mail unique. | false |
ParamètresCookie
Configurez le cookie de l’application dans Startup.ConfigureServices
. ConfigureApplicationCookie doit être appelé après l’appel de AddIdentity
ou de 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;
});
Pour plus d’informations, consultez CookieAuthenticationOptions.
Options de hachage des mots de passe
PasswordHasherOptions obtient et définit les options de hachage des mots de passe.
Option | Description |
---|---|
CompatibilityMode | Mode de compatibilité utilisé lors du hachage de nouveaux mots de passe. La valeur par défaut est IdentityV3. Le premier octet d’un mot de passe haché, appelé marqueur de format, spécifie la version de l’algorithme de hachage utilisé pour hacher le mot de passe. Lors de la vérification d’un mot de passe par rapport à un hachage, la méthode VerifyHashedPassword sélectionne l’algorithme approprié en fonction du premier octet. Un client peut s’authentifier quelle que soit la version de l’algorithme utilisée pour hacher le mot de passe. La définition du mode de compatibilité affecte le hachage des nouveaux mots de passe. |
IterationCount | Nombre d’itérations utilisées lors du hachage des mots de passe à l’aide de PBKDF2. Cette valeur est utilisée uniquement quand CompatibilityMode est défini sur IdentityV3. La valeur doit être un entier positif et la valeur par défaut est 10000 . |
Dans l’exemple suivant, IterationCount est défini sur 12000
dans Startup.ConfigureServices
:
// using Microsoft.AspNetCore.Identity;
services.Configure<PasswordHasherOptions>(option =>
{
option.IterationCount = 12000;
});
Exiger globalement que tous les utilisateurs soient authentifiés
Pour plus d’informations sur la façon d’exiger l’authentification globale de tous les utilisateurs, consultez la section Exiger des utilisateurs authentifiés.