16. Authentification et autorisation
Sections
Réglages de lecture
Voix naturelle enregistrée pour ce cours, la même dans tous les navigateurs.
Aucune voix pour cette langue dans ce navigateur.
Plus de voix
Code et termes techniques en anglais
Désactivé : la voix de la page lit tout, sans pause entre deux voix.
Aucune voix pour cette langue dans ce navigateur.
Plus de voix
D’autres voix : Microsoft Edge propose des voix naturelles en ligne, et Windows (Paramètres › Heure et langue › Voix), macOS et Android en installent d’autres.
L’authentification établit une identité. L’autorisation par stratégie décide si cette identité peut exécuter l’opération. Cette séparation explique les deux codes d’échec :
401 Unauthorized: aucune identité utilisable n’a été établie ;403 Forbidden: l’identité est valide, mais ne satisfait pas la stratégie de l’endpoint.
Prérequis
Section intitulée « Prérequis »Suivez d’abord les minimal APIs et les controllers. Vous devez déjà comprendre les codes HTTP, l’ordre des middlewares et l’injection de dépendances.
Valider un token, pas seulement le décoder
Section intitulée « Valider un token, pas seulement le décoder »La preuve locale configure le handler JWT bearer avec issuer, audience, clé de signature et durée de validité. Décoder les trois segments Base64Url n’est pas authentifier : il faut encore valider la signature et tous les claims pertinents.
Les clés sont générées en mémoire pour un seul processus. Aucun token n’entre dans stdout, les fixtures, Git ou le site. Un temps de cours fixe pilote la validation de durée, donc un token expiré le reste sur chaque runner.
== JWT bearer authentication rejects unusable credentialsmissing token: 401malformed token: 401expired token: 401wrong signature: 401Une stratégie exprime l’autorisation applicative
Section intitulée « Une stratégie exprime l’autorisation applicative »L’endpoint exige la stratégie CanReadScales, qui exige le claim scope=scales.read. Un token bien signé sans ce claim est authentifié mais interdit ; celui qui porte le claim atteint le handler :
== A policy distinguishes authenticated from authorizedwithout required claim: 403with required claim: 200 C majorL’expérience prouve le comportement local d’ASP.NET Core, pas un déploiement OAuth2. En production, il faut encore un serveur d’autorisation de confiance, rotation et découverte des clés, HTTPS, mapping de claims délibéré et une audience par resource server. Une API de production ne doit pas fabriquer ses propres access tokens.
Exécuter la preuve
Section intitulée « Exécuter la preuve »dotnet run --project code/csharp-advanced/Advanced -c Release -- l16La sortie vérifiée est expected/l16.txt.
Exercices
Section intitulée « Exercices »- Ajouter une stratégie qui accepte
scales.readou le rôleadmin, puis tester les deux branches. - Ajouter un issuer incorrect et une audience incorrecte à la matrice 401 sans afficher de token.
- Remplacer la clé symétrique du cours par la validation d’une clé publique asymétrique locale.
Solutions
- Écrire un
AuthorizationHandlerou utiliserRequireAssertion; ne pas modifier l’authentification et vérifier qu’une identité valide mais insuffisante reçoit toujours 403. - Paramétrer issuer et audience dans la fabrique, n’écrire que le statut dans la sortie et conserver la validation temporelle fixe.
- Créer une paire RSA éphémère, signer avec la clé privée et configurer la validation avec la seule clé publique. Libérer les deux clés sans publier clé ni token.