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 IdentityOptionsLockoutOptions 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 :

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

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 IdentityOptionsLockoutOptions 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 :

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

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.