Udostępnij za pośrednictwem


Zarządzanie tokenami internetowymi JSON podczas programowania przy użyciu interfejsu dotnet user-jwts

Autor: Rick Anderson

dotnet user-jwts Narzędzie wiersza polecenia może tworzyć lokalne tokeny internetowe JSON (JWTs) specyficzne dla aplikacji i zarządzać nimi.

Streszczenie

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

opis

Tworzy lokalne tokeny internetowe JSON specyficzne dla projektu i zarządza nimi.

Argumenty

PROJECT | SOLUTION

Projekt MSBuild, aby zastosować polecenie. Jeśli projekt nie zostanie określony, program MSBuild przeszukuje bieżący katalog roboczy dla pliku, który ma rozszerzenie pliku, które kończy się w pliku proj i używa tego pliku.

Polecenia

Polecenie opis
jasny Usuń wszystkie wystawione JWTs dla projektu.
create Wydaj nowy token internetowy JSON.
remove Usuń daną JWT.
key Wyświetl lub zresetuj klucz podpisywania używany do wystawiania JWTs.
lista Wyświetla listę zestawów JWTs wystawionych dla projektu.
drukować Wyświetl szczegóły danego zestawu JWT.

Utworzenie

Użycie: dotnet user-jwts create [options]

Opcja Opis
-p | --projekt Ścieżka projektu do działania. Domyślnie projekt jest w bieżącym katalogu.
--plan Nazwa schematu do użycia dla wygenerowanego tokenu. Wartość domyślna to "Bearer".
-n | --nazwa Nazwa użytkownika do utworzenia zestawu JWT. Domyślnie jest to bieżący użytkownik środowiska.
--audiencja Odbiorcy, dla których chcesz utworzyć zestaw JWT. Domyślnie adresy URL skonfigurowane w launchSettings.json projektu.
--Emitenta Wystawca JWT. Wartość domyślna to "dotnet-user-jwts".
--zakres Oświadczenie zakresu do dodania do zestawu JWT. Określ raz dla każdego zakresu.
--rola Oświadczenie roli, które ma zostać dodane do zestawu JWT. Określ raz dla każdej roli.
--roszczenie Oświadczenia do dodania do zestawu JWT. Określ raz dla każdego oświadczenia w formacie "name=value".
--not-before Data i godzina UTC, przed jaką JWT nie powinny być prawidłowe w formacie "rrrr-MM-dd [[HH:mm[[:ss]]]]". Domyślnie jest tworzona data i godzina utworzenia JWT.
--expires-on Data i godzina UTC, o których JWT powinny wygasnąć w formacie "rrrr-MM-dd [[[ [HH:mm]]:ss]]". Wartość domyślna to 6 miesięcy po dacie --not-before. Nie używaj tej opcji w połączeniu z opcją --valid-for.
--valid-for Okres, po upływie których JWT powinien wygasnąć. Określ użycie liczby, po której następuje typ czasu trwania, taki jak "d" dla dni, "h" dla godzin, "m" przez minuty i "s" w sekundach, na przykład 365d. Nie używaj tej opcji w połączeniu z opcją --expires-on.
-o | --wyjście Format używany do wyświetlania danych wyjściowych z polecenia . Może być jednym z wartości "default", "token" lub "json".
-h | --Pomoc Pokaż informacje pomocy

Przykłady

Uruchom następujące polecenia, aby utworzyć pusty projekt internetowy i dodać pakiet NuGet Microsoft.AspNetCore.Authentication.JwtBearer :

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

Zastąp zawartość Program.cs następującym kodem:

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();

W poprzednim kodzie żądanie /secret GET zwraca 401 Unauthorized błąd. Aplikacja produkcyjna może pobrać JWT z usługi tokenu zabezpieczającego (STS), być może w odpowiedzi na zalogowanie się za pośrednictwem zestawu poświadczeń. Na potrzeby pracy z interfejsem API podczas programowania dotnet user-jwts lokalnego narzędzie wiersza polecenia może służyć do tworzenia lokalnych zestawów JWTs specyficznych dla aplikacji i zarządzania nimi.

Narzędzie jest podobne do narzędzia user-secrets. Można user-jwts go użyć do zarządzania wartościami aplikacji, które są prawidłowe tylko dla dewelopera na komputerze lokalnym. W rzeczywistości narzędzie user-jwts korzysta z user-secrets infrastruktury do zarządzania kluczem podpisanym przez JWTs, upewniając się, że jest on bezpiecznie przechowywany w profilu użytkownika.

Narzędzie user-jwts ukrywa szczegóły implementacji, takie jak miejsce i sposób przechowywania wartości. Narzędzie może być używane bez znajomości szczegółów implementacji. Wartości są przechowywane w pliku JSON w folderze profilu użytkownika komputera lokalnego:

Ścieżka systemu plików:

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

Tworzenie zestawu JWT

Następujące polecenie tworzy lokalny zestaw JWT:

dotnet user-jwts create

Poprzednie polecenie tworzy plik JWT i aktualizuje plik projektu appsettings.Development.json przy użyciu formatu JSON podobny do następującego:

{
  "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"
      }
    }
  }
}

Skopiuj JWT i ID utworzony w poprzednim poleceniu. Użyj narzędzia, takiego jak Curl, aby przetestować /secretprogram :

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

Gdzie {token} jest wcześniej wygenerowany zestaw JWT.

Wyświetlanie informacji o zabezpieczeniach JWT

Następujące polecenie wyświetla informacje o zabezpieczeniach JWT, w tym wygasanie, zakresy, role, nagłówek tokenu i ładunek oraz kompaktowy token:

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

Tworzenie tokenu dla określonego użytkownika i zakresu

Aby uzyskać informacje o obsługiwanych opcjach tworzenia, zobacz Tworzenie w tym temacie.

Następujące polecenie tworzy JWT dla użytkownika o nazwie MyTestUser:

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

Powyższe polecenie zawiera dane wyjściowe podobne do następujących:

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

Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.{Remaining token deleted}

Powyższy token może służyć do testowania punktu końcowego /secret2 w następującym kodzie:

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();