Gérer les jetons web JSON dans le développement avec dotnet user-jwts

Par Rick Anderson

L’outil en ligne de commande dotnet user-jwts peut créer et gérer des jetons web JSON (JWT) locaux spécifiques à l’application.

Cet article fournit des détails de syntaxe pour la commande et les exemples.

Synopsis

dotnet user-jwts [<PROJECT>] [command]
dotnet user-jwts [command] -h|--help

Description

Crée et gère des jetons web JSON locaux spécifiques au projet.

Arguments

PROJECT | SOLUTION

Projet MSBuild sur lequel appliquer une commande. Si aucun projet n’est spécifié, MSBuild recherche dans le répertoire de travail actuel un fichier dont l’extension de fichier se termine par proj. Il utilise ensuite ce fichier pour obtenir les informations du projet pour la commande.

Commandes

Commande Description
clear Supprimez tous les JWT émis pour un projet.
create Émettez un nouveau jeton web JSON.
remove Supprimez un JWT donné.
key Affichez ou réinitialisez la clé de signature utilisée pour émettre des JWT.
list Répertoriez les JWT émis pour le projet.
print Affichez les détails d’un JWT donné.

Options de la commande create

Utilisation : dotnet user-jwts create [options]

Option Description
-p \| --project Chemin du projet sur lequel effectuer l’opération. Par défaut, le projet est dans le répertoire actif.
--scheme Nom du schéma à utiliser pour le jeton généré. La valeur par défaut est Bearer.
-n \| --name Nom de l’utilisateur pour lequel créer le JWT. Utilise par défaut l’utilisateur de l’environnement actuel.
--audience Les audiences pour lesquelles créer le JWT. Utilise par défaut les URL configurées dans le fichier launchSettings.json du projet.
--issuer Émetteur du JWT. La valeur par défaut est dotnet-user-jwts.
--scope Revendication d’étendue à ajouter au JWT. Spécifiez une fois pour chaque étendue.
--role Revendication de rôle à ajouter au JWT. Spécifiez une fois pour chaque rôle.
--claim Revendications à inclure dans le JWT. Spécifiez une seule fois pour chaque revendication au format name=value.
--not-before Date et heure UTC auxquelles le JWT devient valide, au format yyyy-MM-dd [[HH:mm[[:ss]]]]. Prend par défaut la date et l’heure de création du JWT.
--expires-on Date et heure UTC à laquelle le JWT expire, au format yyyy-MM-dd [[[ [HH:mm]]:ss]]. La valeur par défaut est de six mois après la --not-before date. N’utilisez pas cette option avec l’option --valid-for.
--valid-for Durée pendant laquelle le JWT reste valide. Lorsque l’heure est atteinte, le JWT expire. Spécifiez un nombre suivi d’une unité de temps (d jours, h heures, m minutes, s secondes), par exemple 365d. N’utilisez pas cette option avec l’option --expires-on.
-o \| --output Format à utiliser pour afficher la sortie de la commande : default, tokenou json.
-h \| --help Affichez les informations d’aide pour la commande.

Exemples

Exécutez les commandes suivantes pour créer un projet web vide et ajouter le package NuGet Microsoft.AspNetCore.Authentication.JwtBearer :

dotnet new web -o MyJWT
cd MyJWT
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

Remplacez le contenu du fichier Program.cs par le code suivant :

using System.Security.Claims;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddAuthorization();
builder.Services.AddAuthentication("Bearer").AddJwtBearer();

var app = builder.Build();

app.UseAuthorization();

app.MapGet("/", () => "Hello, World!");
app.MapGet("/secret", (ClaimsPrincipal user) => $"Hello {user.Identity?.Name}. My secret")
    .RequireAuthorization();

app.Run();

Dans le code précédent, une requête GET au /secret point de terminaison retourne une 401 Unauthorized erreur. Une application de production peut obtenir le JWT à partir d’un service de jeton de sécurité, peut-être en réponse à la connexion avec des informations d’identification. Lorsque vous utilisez l’API pendant le développement local, l’outil dotnet user-jwts en ligne de commande peut être utilisé pour créer et gérer des JWT locaux spécifiques à l’application.

L’outil user-jwts est similaire au concept de l’outil de secrets utilisateur . Il peut être utilisé pour gérer les valeurs de l’application valides uniquement pour le développeur sur l’ordinateur local. En fait, l’outil user-jwts utilise l’infrastructure user-secrets pour gérer la clé avec laquelle les JWT sont signés. Cette approche garantit que la clé est stockée en toute sécurité dans le profil utilisateur.

L’outil user-jwts masque les détails de l’implémentation, tels que l’emplacement et la façon dont les valeurs sont stockées. L’outil peut être utilisé sans connaître les détails de l’implémentation.

Les valeurs sont stockées dans un fichier JSON dans le dossier de profil utilisateur de la machine locale :

  • Windows : %APPDATA%\Microsoft\UserSecrets<secrets_GUID>\user-jwts.json

  • Linux/macOS : ~/.microsoft/usersecrets/<secrets_GUID/user-jwts.json>

Créer un JWT

La commande suivante crée un JWT local :

dotnet user-jwts create

La commande précédente crée un JWT et met à jour le fichier projet appsettings.Development.json avec JSON similaire à l’exemple suivant :

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "Authentication": {
    "Schemes": {
      "Bearer": {
        "ValidAudiences": [
          "http://localhost:8401",
          "https://localhost:44308",
          "http://localhost:5182",
          "https://localhost:7076"
        ],
        "ValidIssuer": "dotnet-user-jwts"
      }
    }
  }
}

Copiez le JWT et le ID créé dans la commande précédente. Utilisez un outil tel que Curl pour tester le /secret point de terminaison, où {token} est le JWT généré précédemment :

curl -i -H "Authorization: Bearer {token}" https://localhost:{port}/secret

Afficher les informations de sécurité JWT

La commande suivante affiche les informations de sécurité du JWT, notamment la date d’expiration, les périmètres, les rôles, l’en-tête et le contenu du jeton, ainsi que le jeton compact :

dotnet user-jwts print {ID} --show-all

Créer un jeton pour un utilisateur et une étendue spécifiques

La commande suivante crée un JWT pour un utilisateur nommé MyTestUser. Pour connaître les options prises en charge create , consultez la section Options de création de commande .

dotnet user-jwts create --name MyTestUser --scope "myapi:secrets"

La commande précédente a une sortie similaire à l’exemple suivant :

New JWT saved with ID '43e0b748'.
Name: MyTestUser
Scopes: myapi:secrets

Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.{Remaining token deleted}

Le jeton précédent peut être utilisé pour tester le point de terminaison /secret2 dans le code suivant :

using System.Security.Claims;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddAuthorization();
builder.Services.AddAuthentication("Bearer").AddJwtBearer();

var app = builder.Build();

app.MapGet("/", () => "Hello, World!");
app.MapGet("/secret", (ClaimsPrincipal user) => $"Hello {user.Identity?.Name}. My secret")
    .RequireAuthorization();
app.MapGet("/secret2", () => "This is a different secret!")
    .RequireAuthorization(p => p.RequireClaim("scope", "myapi:secrets"));

app.Run();