Archives Wild Code School
ASP.Net

ASP.Net: Identity

Quête 2 sur 7

Authentifier des utilisateurs

Objectifs

  • Configurer un projet pour qu'il utilise le module Identity d'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é.

↗
Activer l'authentification

Document sur comment créer un projet avec authentification

learn.microsoft.com

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:

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

csharp
[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 Identity est injecté et couplé avec Entity Framework
  • Le service Identity est 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