Gestire i token Web JSON in fase di sviluppo con dotnet user-jwts
Lo dotnet user-jwts
strumento da riga di comando può creare e gestire token WEB JSON locali specifici dell'app.
Riepilogo
dotnet user-jwts [<PROJECT>] [command]
dotnet user-jwts [command] -h|--help
Descrizione
Crea e gestisce token Web JSON locali specifici del progetto.
Argomenti
PROJECT | SOLUTION
Progetto MSBuild in cui applicare un comando. Se non si specifica un progetto, MSBuild cerca nella directory di lavoro corrente un file con estensione di file che termina in proj e usa tale file.
Comandi
Comando | Descrizione |
---|---|
clear | Eliminare tutti i token JWT rilasciati per un progetto. |
create | Rilasciare un nuovo token Web JSON. |
remove | Eliminare un token JWT specificato. |
key | Visualizzare o reimpostare la chiave di firma usata per emettere token JWT. |
list | Elenca i token JWT rilasciati per il progetto. |
Visualizzare i dettagli di un token JWT specificato. |
Creazione
Sintassi: dotnet user-jwts create [options]
Opzione | Descrizione |
---|---|
-p | --progetto | Percorso del progetto su cui operare. Il valore predefinito è il progetto nella directory corrente. |
--schema | Nome dello schema da usare per il token generato. L'impostazione predefinita è 'Bearer'. |
-n | --nome | Nome dell'utente per cui creare il token JWT. L'impostazione predefinita è l'utente dell'ambiente corrente. |
--pubblico | Destinatari per cui creare il token JWT. Per impostazione predefinita, gli URL configurati nel launchSettings.json del progetto. |
--Emittente | Autorità di certificazione del token JWT. Il valore predefinito è "dotnet-user-jwts". |
--scope | Attestazione di ambito da aggiungere al token JWT. Specificare una volta per ogni ambito. |
--ruolo | Attestazione di ruolo da aggiungere al token JWT. Specificare una volta per ogni ruolo. |
--richiesta | Attestazioni da aggiungere al token JWT. Specificare una volta per ogni attestazione nel formato "name=value". |
--not-before | La data e l'ora UTC del token JWT non devono essere valide prima nel formato 'aa-MM-gg [[HH:mm[[:ss]]]]'. Il valore predefinito è data e ora di creazione del token JWT. |
--expires-on | La data UTC e l'ora in cui il token JWT deve scadere nel formato "aaaa-MM-gg [[[ [HH:mm]]:ss]]". Il valore predefinito è 6 mesi dopo la data --not-before. Non usare questa opzione insieme all'opzione --valid-for. |
--valid-for | Il periodo in cui il token JWT deve scadere. Specificare l'uso di un numero seguito da un tipo di durata come 'd' per giorni, 'h' per ore, 'm' per minuti e 's' per secondi, ad esempio 365d'. Non usare questa opzione insieme all'opzione --expires-on. |
-o | --prodotto | Formato da usare per la visualizzazione dell'output dal comando . Può essere uno dei valori "default", "token" o "json". |
-h | --Guida | Mostra le informazioni della Guida |
Esempi
Eseguire i comandi seguenti per creare un progetto Web vuoto e aggiungere il pacchetto NuGet Microsoft.AspNetCore.Authentication.JwtBearer :
dotnet new web -o MyJWT
cd MyJWT
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
Sostituire il contenuto di Program.cs
con il codice seguente:
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();
Nel codice precedente, una richiesta GET per /secret
restituire un 401 Unauthorized
errore. Un'app di produzione potrebbe ottenere il token JWT da un servizio token di sicurezza (STS), forse in risposta all'accesso tramite un set di credenziali. Ai fini dell'uso dell'API durante lo sviluppo locale, lo dotnet user-jwts
strumento da riga di comando può essere usato per creare e gestire JWT locali specifici dell'app.
Lo user-jwts
strumento è simile al concetto dello strumento user-secrets , che può essere usato per gestire i valori per l'app che sono validi solo per lo sviluppatore nel computer locale. In effetti, lo strumento user-jwts usa l'infrastruttura user-secrets
per gestire la chiave con cui i token JWT sono firmati, assicurandosi che sia archiviato in modo sicuro nel profilo utente.
Lo user-jwts
strumento nasconde i dettagli di implementazione, ad esempio dove e come vengono archiviati i valori. Lo strumento può essere usato senza conoscere i dettagli di implementazione. I valori vengono archiviati in un file JSON nella cartella del profilo utente del computer locale:
Percorso del file system:
%APPDATA%\Microsoft\UserSecrets\<secrets_GUID>\user-jwts.json
Creare un token JWT
Il comando seguente crea un token JWT locale:
dotnet user-jwts create
Il comando precedente crea un token JWT e aggiorna il file del appsettings.Development.json
progetto con JSON simile al seguente:
{
"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"
}
}
}
}
Copiare il token JWT e l'oggetto ID
creato nel comando precedente. Usare uno strumento come Curl per testare /secret
:
curl -i -H "Authorization: Bearer {token}" https://localhost:{port}/secret
Dove {token}
è il token JWT generato in precedenza.
Visualizzare le informazioni di sicurezza JWT
Il comando seguente visualizza le informazioni di sicurezza JWT, tra cui scadenza, ambiti, ruoli, intestazione del token e payload e il token compatto:
dotnet user-jwts print {ID} --show-all
Creare un token per un utente e un ambito specifici
Per le opzioni di creazione supportate, vedere Creare in questo argomento.
Il comando seguente crea un token JWT per un utente denominato MyTestUser
:
dotnet user-jwts create --name MyTestUser --scope "myapi:secrets"
L'output del comando precedente è simile al seguente:
New JWT saved with ID '43e0b748'.
Name: MyTestUser
Scopes: myapi:secrets
Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.{Remaining token deleted}
Il token precedente può essere usato per testare l'endpoint /secret2
nel codice seguente:
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();