ASP.Net: Identity
Authentifier des utilisateurs
Objectifs
- Configurer un projet pour qu'il utilise le module
Identityd'ASP.Net - Mettre en place une zone pour des utilisateurs authentifiés
- Savoir différencier autorisation d'authentification
Installation
La mise en place "manuelle" de l'authentification via ASP.Net Identity s'avère techniquement difficile et nécessite de comprendre et maîtriser une quantité assez importante de détails.
C'est pour cela qu'il existe sur Visual Studio une fonction pour générer du code et créer des projets pré-configurés.
Ainsi, la ressource ci-dessous explique comment créer et utiliser un projet ASP.Net avec un système d'authentification pré-configuré.
Document sur comment créer un projet avec authentification
Tests
Si tu as bien suivi les étapes de la documentation Microsoft sans fonctionnalité autre que la possibilité d'inscrire et connecter des utilisateurs.
Amuse-toi à tester: enregistre un utilisateur, explore ensuite la base de données et si le cerveau t'en dis, lis le code pour comprendre comment fonctionne le module Identity.
Tu peux te servir de la documentation Microsoft pour te guider durant tes tests.
Explications
En informatique, on aime faire des choses que l'on comprend, que l'on maîtrise. Petit bémol, on ne comprend que très peu les technologies que l'on utilise qui nous mâchent le travail de sécurité, performance, fonctionnalité, extensibilité ...
Sachant que nous ne pouvons pas vraiment nous lancer dans une étude approfondie des engrenages ASP.Net, nous allons étudier comment Identity est configuré automatiquement.
Authentification as a Service
Identity est un service au même titre qu'Entity Framework ou que le système MVC. Il est donc crucial d'ajouter l'authentification dans le pipeline intergiciel dans le bon ordre.
Ainsi, dans le code généré avec Visual Studio 2022, on a le code suivant dans la classe Program.cs:
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection") ?? throw new InvalidOperationException("Connection string '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>();
[...] // Other services to inject
app.UseAuthorization();
[...]
}
Authentification ou autorisation ?
Tu as pu remarqué dans le code ci-dessus que deux services sont ajoutés au pipeline intergiciel:
- Identity - Tout ce qui concerne l'authentification (e-mail, mot de passe, connexion Facebook ...)
- Authorization - Tout ce qui concerne les autorisations (l'utilisateur est-il administrateur, utilisateur, invité, client, modérateur ?)
Ainsi, il est possible de créer un système de gestion d'utilisateurs sans mettre en place de système d'autorisation. Mais pas de système d'autorisation si il n'y a pas d'authentification préalable.
Zone authentifiée
Une fois l'authentification configurée sur un projet, il est très simple de restreindre l'accès à certaines zones du site.
Un simple attribut [Authorize] placé au-dessus d'une route d'une déclaration d'un contrôleur ou d'une action de celui-ci restreint l'accès aux membres enregistrés en base de données.
Exemple:
[Authorize]
[Route("api/[controller]")]
public class ValuesController : Controller
{
// GET: api/<controller>
[HttpGet]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
}
Ainsi, le point d'entrée api/Values répondra le code 200 uniquement si des informations d'authentification sont fournies et correspondent aux données enregistrées.
Challenge
Met en place un projet MVC avec le module Identity pré-configuré puis crée un contrôleur qui restreint l'accès aux utilisateurs enregistrés sur le site.
Critères de validation
- Le service
Identityest injecté et couplé avec Entity Framework - Le service
Identityest ajouté au bon endroit dans le pipeline intergiciel - Il est possible d'enregistrer un utilisateur
- Il est possible de connecter un utilisateur enregistré
- Au moins une route restreint l'accès aux membres uniquement