Gerencie Web Tokens JSON em desenvolvimento com dotnet user-jwts

Por Rick Anderson

A dotnet user-jwts ferramenta de linha de comandos pode criar e gerir Tokens Web JSON locais específicos da aplicação (JWTs).

Este artigo fornece detalhes da sintaxe do comando e exemplos.

Sinopse

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

Description

Cria e gere Tokens Web JSON locais específicos para projetos.

Arguments

PROJECT | SOLUTION

O projeto MSBuild sobre o qual aplicar um comando. Se um projeto não estiver especificado, o MSBuild procura no diretório de trabalho atual um ficheiro que tenha uma extensão de ficheiro que termine em proj. Depois, utiliza esse ficheiro para obter a informação do projeto para o comando.

Commands

Command Description
clear Apague todos os JWTs emitidos para um projeto.
create Emitir um novo JSON Web Token.
remove Apaga um determinado JWT.
key Mostrar ou reiniciar a chave de assinatura usada para emitir os JWTs.
list Liste os JWTs emitidos para o projeto.
print Mostrar os detalhes de um determinado JWT.

Opções para o comando criar

Utilização: dotnet user-jwts create [options]

Opção Description
-p \| --project O percurso do projeto a seguir. Por predefinição, o projeto é o do diretório atual.
--scheme O nome do esquema a usar para o token gerado. O valor padrão é Bearer.
-n \| --name O nome do utilizador para criar o JWT. Por predefinição, corresponde ao utilizador do ambiente atual.
--audience Os públicos para criar o JWT. Utiliza, por defeito, os URL configurados no ficheiro launchSettings.json do projeto.
--issuer O emissor do JWT. O valor padrão é dotnet-user-jwts.
--scope Uma alegação de alcance para acrescentar ao JWT. Especifique uma vez para cada escopo.
--role Uma reivindicação de função para acrescentar ao JWT. Especifique uma vez para cada função.
--claim Declarações a juntar ao JWT. Especifique apenas uma vez por cada alegação no formato name=value.
--not-before A data e hora UTC em que o JWT se torna válido, no formato yyyy-MM-dd [[HH:mm[[:ss]]]]. Por defeito, corresponde à data e hora em que o JWT é criado.
--expires-on A data e hora UTC em que o JWT expira, no formato yyyy-MM-dd [[[ [HH:mm]]:ss]]. Por predefinição, é seis meses após a data --not-before. Não use esta opção com a opção --valid-for.
--valid-for O período de tempo durante o qual o JWT permanece válido. Quando chega a hora, o JWT expira. Especifique um número seguido do tipo de duração (dias, d horas, h minutos, m segundos), como s.365d Não use esta opção com a opção --expires-on.
-o \| --output O formato a usar para mostrar a saída do comando: default, token, ou json.
-h \| --help Mostrar informação de ajuda para o comando.

Examples

Execute os seguintes comandos para criar um projeto web vazio e adicionar o pacote NuGet Microsoft.AspNetCore.Authentication.JwtBearer :

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

Substitua o conteúdo do ficheiro Program.cs pelo seguinte código:

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

No código anterior, um pedido GET ao /secret endpoint devolve um 401 Unauthorized erro. Uma aplicação de produção pode obter o JWT de um serviço de token de segurança, talvez em resposta ao iniciar sessão com credenciais. Quando utiliza a API durante o desenvolvimento local, a dotnet user-jwts ferramenta de linha de comandos pode ser usada para criar e gerir JWTs locais específicos de uma aplicação.

A ferramenta user-jwts é semelhante, em termos conceptuais, à ferramenta user-secrets. Pode ser usado para gerir valores para a aplicação que são válidos apenas para o programador na máquina local. Na verdade, a ferramenta user-jwts utiliza a infraestrutura user-secrets para gerir a chave com a qual os JWTs são assinados. Esta abordagem garante que a chave é armazenada de forma segura no perfil do utilizador.

A user-jwts ferramenta esconde detalhes de implementação, como onde e como os valores são armazenados. A ferramenta pode ser usada sem conhecer os detalhes da implementação.

Os valores são armazenados em um arquivo JSON na pasta de perfil de usuário da máquina local:

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

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

Criar um JWT

O seguinte comando cria um JWT local:

dotnet user-jwts create

O comando anterior cria um JWT e atualiza o ficheiro do projeto appsettings.Development.json com JSON, semelhante ao seguinte exemplo:

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

Copie o JWT e o ID criado no comando anterior. Use uma ferramenta como o Curl para testar o /secret endpoint, onde {token} é o JWT previamente gerado:

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

Mostrar informação de segurança JWT

O comando seguinte apresenta a informação de segurança do JWT, incluindo expiração, escopos, funções, cabeçalho e carga útil do token, e o token compacto:

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

Crie um token para um utilizador específico e alcance

O comando seguinte cria um JWT para um utilizador chamado MyTestUser. Para as opções suportadas create, consulte a secção Opções do comando create.

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

O comando anterior tem uma saída semelhante ao seguinte exemplo:

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

Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.{Remaining token deleted}

O token anterior pode ser usado para testar o /secret2 endpoint no seguinte código:

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