ASP.Net Identity
Présentation
ASP.NET Identity est un composant du Framework ASP.Net qui fournit toutes les fonctions nécessaires à la gestion des utilisateurs dans une application. Il propose un ensemble de classes de modèles d’objets et de services pour gérer la création d’un compte, l’authentification, la gestion des mots de passe, des rôles, la double authentification, etc. Il propose également un interfaçage avec Entity Framework facilitant son utilisation avec des bases de données pour la persistance des données. S’il est tout à fait possible d’utiliser ASP.NET Identity avec un autre ORM (Object Relational Mapping), c’est toutefois fortement déconseillé car cela serait au prix de gros efforts de réimplémentation de nombreuses classes.
ASP.NET Identity a été introduit avec la version 2.0 du .Net Framework sous le nom Identity Framework. Au fil des versions, il s’est enrichi et a changé d’appellation pour devenir ASP.NET Identity.
Configuration
La méthode AddDefaultIdentity() vue dans le chapitre Création d’une application MVC prend en argument Action<IdentityOptions>, soit une expression lambda qui permet de définir des propriétés de la classe IdentityOptions.
Les différentes options disponibles, concernant la gestion de l’identité de l’utilisateur, sont regroupées dans les catégories suivantes :
-
ClaimsIdentity
-
Lockout
-
Password
-
SignIn
-
Tokens
-
User
Pour chaque catégorie, les différentes options seront présentées avec leur valeur par défaut.
1. ClaimsIdentity
Les options de la catégorie ClaimsIdentity permettent de paramétrer les types de claims. Par défaut, le système ASP.NET Identity repose sur des claims qui ressemblent à des namespaces XML. Ce standard est adopté par Microsoft, mais des standards comme le JWT ont opté pour d’autres claims dont les types sont beaucoup plus courts.
La notion de claim, que l’on retrouve partout dans les systèmes d’authentification, et que l’on peut traduire par revendication, désigne les propriétés que l’utilisateur revendique. Cette notion est un peu abstraite mais elle deviendra plus claire au fil des exemples. Retenez pour l’instant qu’un claim est une paire clé/valeur. Par exemple, e-mail : julien@exemple.com
Voici la liste des options et de leur valeur par défaut :
options.ClaimsIdentity.EmailClaimType =
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"
options.ClaimsIdentity.RoleClaimType =
"http://schemas.microsoft.com/ws/2008/06/identity/claims/role"
options.ClaimsIdentity.SecurityStampClaimType =
"AspNet.Identity.SecurityStamp"
options.ClaimsIdentity.UserIdClaimType =
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier"
La version JWT ressemblerait à ça :
options.ClaimsIdentity.EmailClaimType = "email"
options.ClaimsIdentity.RoleClaimType = "role"
options.ClaimsIdentity.SecurityStampClaimType = "security_stamp"
options.ClaimsIdentity.UserIdClaimType = "sub"
2. Lockout
Les options Lockout concernent le verrouillage...
Rôles
La méthode AddDefaultIdentity<T>() ajoute tout le nécessaire pour une gestion basique des utilisateurs mais ne propose pas la gestion des rôles. Les rôles vont vous permettre de définir les droits d’accès des utilisateurs. On retrouve souvent les grands archétypes tels que "Utilisateur", "Administrateur", "Support", etc., mais vous pouvez définir vos propres rôles en fonction de vos besoins. Vous pourrez affecter autant de rôles que vous le désirez à vos utilisateurs afin de gérer les droits d’accès aussi finement que souhaité.
Pour ajouter la gestion des rôles, il faut légèrement modifier le code précédent :
builder.Services.AddDefaultIdentity<IdentityUser>(options =>
options.SignIn.RequireConfirmedAccount = true)
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
La classe IdentityRole, tout comme la classe IdentityUser, peut être héritée pour étendre le système.
Exemple
Je désire que mon système d’authentification utilise ASP.Net Identity avec une base de données SQL Server qui sera gérée via Entity Framework.
Pour mes utilisateurs, je désire les règles suivantes :
-
Je veux...
Identity UI
Identity UI est un ensemble de pages Razor qui contient toutes les mécaniques et interfaces utilisateurs nécessaires pour un SSO : connexion, création de compte, mot de passe oublié, double authentification, etc. Ces pages sont mises à disposition depuis une bibliothèque de classes du framework grâce à la méthode AddDefaultUI() appelée au sein de la méthode AddDefaultIdentity().
public static IdentityBuilder AddDefaultUI(this IdentityBuilder builder)
{
builder.AddSignInManager();
builder.Services
.AddMvc()
.ConfigureApplicationPartManager(apm =>
{
if (!TryResolveUIFramework(Assembly.GetEntryAssembly(),
out var framework) &&
!TryResolveUIFramework(GetApplicationAssembly(builder), out framework))
{
framework = default;
}
var parts = new ConsolidatedAssemblyApplicationPartFactory()
.GetApplicationParts(typeof(IdentityBuilderUIExtensions).Assembly); ...