Pourquoi Authentification dans .NET ?
L'authentification est un élément clé de toute application, quelle que soit sa taille ou son domaine d'utilisation. Dans un contexte réel, une authentification correctement mise en place permet non seulement de protéger les données des utilisateurs mais aussi de personnaliser l'expérience utilisateur et d'offrir des fonctionnalités supplémentaires. Un cas d'usage concret est un système de gestion des ressources. En s'authentifiant, un utilisateur peut accéder à ses propres ressources et effectuer des actions spécifiques à lui.
Prerequis
- Connaissance de base du langage C#
- Familiarité avec Visual Studio (ou tout autre IDE .NET)
- Connexion à une instance d'une base de données SQL Server ou similaire
Concepts fondamentaux
1. Authentification et Autorisation
L'authentification est le processus par lequel un utilisateur s’identifie pour prouver sa présence. L'autorisation, en revanche, détermine ce que l'utilisateur peut faire une fois qu'il a été authentifié.
## Exemple d'une classe User représentant les informations d'un utilisateur
public class User {
public int Id { get; set; }
public string Username { get; set; }
public string PasswordHash { get; set; }
}
2. Providers d'Authentification
.NET offre plusieurs providers d’authentification pour faciliter le processus d’identification des utilisateurs.
## Exemple d'une méthode de connexion utilisant un provider SQL
public bool Authenticate(string username, string password) {
// Code pour récupérer l'utilisateur à partir de la base de données
var user = GetUserFromDatabase(username);
if (user != null && BCrypt.Net.BCrypt.Verify(password, user.PasswordHash)) {
return true;
}
return false;
}
3. Middleware d'Authentification
Le middleware est un composant qui traite les requêtes HTTP avant qu’elles ne atteignent le contrôleur.
## Exemple de middleware pour protéger une route avec authentification
app.Use(async (context, next) => {
if (!IsAuthenticated(context)) {
context.Response.StatusCode = StatusCodes.Status401Unauthorized;
await context.Response.WriteAsync("Access Denied");
} else {
await next();
}
});
Mise en pratique : projet fil rouge
1. Création du Projet
Créez un nouveau projet ASP.NET Core API à l'aide de Visual Studio.
dotnet new webapi -n TaskManagerAPI
cd TaskManagerAPI
2. Configuration de la Base de Données
Ajoutez une base de données SQL Server et configurez le modèle de données pour les utilisateurs et les tâches.
## Exemple d'un modèle User
public class User {
public int Id { get; set; }
public string Username { get; set; }
public string PasswordHash { get; set; }
}
3. Authentification avec JWT (JSON Web Token)
Utilisez JWT pour authentifier les utilisateurs et sécuriser leurs requêtes.
## Exemple de génération d'un token JWT
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes("your_secret_key");
var tokenDescriptor = new SecurityTokenDescriptor {
Subject = new ClaimsIdentity(new Claim[] {
new Claim(ClaimTypes.Name, user.Username)
}),
Expires = DateTime.UtcNow.AddHours(1),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
return Ok(new { Token = tokenHandler.WriteToken(token) });
4. Protection des Routes
Ajoutez le middleware d'authentification pour protéger les routes sensibles.
## Exemple de middleware pour vérifier le token JWT
app.Use(async (context, next) => {
var authHeader = context.Request.Headers["Authorization"].ToString();
if (authHeader != null && authHeader.StartsWith("Bearer ")) {
var token = authHeader.Substring(7);
try {
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes("your_secret_key");
tokenHandler.ValidateToken(token, new TokenValidationParameters {
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateLifetime = true
}, out SecurityToken validatedToken);
} catch {
context.Response.StatusCode = StatusCodes.Status401Unauthorized;
await context.Response.WriteAsync("Invalid token");
return;
}
}
await next();
});
Erreurs frequentes et debugging
1. Token invalide
## ❌ Mauvais
var tokenHandler = new JwtSecurityTokenHandler();
tokenHandler.ValidateToken(token, new TokenValidationParameters {
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateLifetime = false // Erreur : Validation du lifetime désactivée
}, out SecurityToken validatedToken);
## ✅ Correct
var tokenHandler = new JwtSecurityTokenHandler();
tokenHandler.ValidateToken(token, new TokenValidationParameters {
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateLifetime = true // Validation du lifetime activée
}, out SecurityToken validatedToken);
2. Connexion incorrecte
## ❌ Mauvais
if (BCrypt.Net.BCrypt.Verify(password, user.PasswordHash)) {
return true;
} else {
return false; // Erreur : Retourne toujours "false"
}
## ✅ Correct
if (BCrypt.Net.BCrypt.Verify(password, user.PasswordHash)) {
return true;
} else {
throw new InvalidOperationException("Invalid credentials");
}
3. Base de données non connectée
## ❌ Mauvais
var user = GetUserFromDatabase(username);
if (user != null) { // Erreur : Ne vérifie pas la connexion à la base de données
return true;
}
## ✅ Correct
using (var context = new TaskManagerDbContext()) {
var user = context.Users.FirstOrDefault(u => u.Username == username);
if (user != null && BCrypt.Net.BCrypt.Verify(password, user.PasswordHash)) {
return true;
}
}
Pour aller plus loin
1. OAuth 2.0
Apprenez à utiliser OAuth 2.0 pour une authentification et autorisation basée sur des fournisseurs tiers comme Google, Facebook, ou GitHub.
2. JWT avec RSA
Découvrez comment utiliser les clés publiques et privées RSA pour une signature JWT plus sécurisée.
3. ASP.NET Identity
Explorez l'ASP.NET Identity, un outil complet pour gérer la sécurité des utilisateurs dans vos applications .NET.
Défi pratique
Créez un petit service CLI (Command Line Interface) en utilisant .NET qui permet à un utilisateur de s’inscrire et de se connecter. Utilisez les concepts d'authentification que vous avez appris pour protéger l'accès aux commandes sensibles.
## Exemple de code pour une commande CLI avec authentification
public class Program {
static void Main(string[] args) {
if (!IsAuthenticated()) {
Console.WriteLine("Please log in first.");
return;
}
// Code pour les commandes sensibles après l'authentification
}
}
En suivant ce tutoriel, vous devriez être capable de mettre en place une authentification robuste dans vos applications .NET.