Partilhar via


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).

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 for especificado, o MSBuild procura no diretório de trabalho atual um ficheiro que tenha uma extensão que termine em proj e utiliza esse ficheiro.

Commands

Command Description
desmarcar Apague todos os JWTs emitidos para um projeto.
criar Emitir um novo JSON Web Token.
remover Apaga um determinado JWT.
chave Mostrar ou reiniciar a chave de assinatura usada para emitir os JWTs.
lista Lista os JWTs emitidos para o projeto.
imprimir Mostrar os detalhes de um determinado JWT.

Criar

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

Opção Description
-p | --projeto O percurso do projeto a seguir. Por predefinição, o projeto é o do diretório atual.
--esquema O nome do esquema a usar para o token gerado. Por defeito, é 'Portador'.
-n | --nome O nome do utilizador para criar o JWT. Por predefinição, corresponde ao utilizador do ambiente atual.
--público Os públicos para criar o JWT. Por padrão, os URLs configurados no launchSettings.json do projeto.
--emissor O emissor do JWT. O valor predefinido é 'dotnet-user-jwts'.
--âmbito Uma alegação de alcance para acrescentar ao JWT. Especifique uma vez para cada escopo.
--papel Uma reivindicação de função para acrescentar ao JWT. Especifique uma vez para cada função.
--reivindicação Declarações a juntar ao JWT. Especifique uma vez para cada declaração no formato "nome=valor".
--não antes A data e hora UTC do JWT não deve ser válida antes no formato 'yyyy-MM-dd [[HH:mm[[:ss]]]]'. Por padrão, corresponde à data e hora em que o JWT é criado.
--expira-em A data e hora UTC do JWT deve expirar no formato 'yyyy-MM-dd [[[ [HH:mm]]:ss]]'. Por padrão, é definido em 6 meses após a data --não antes. Não use esta opção em conjunto com a opção --valid-for.
--valid-for O período após o qual o JWT deve expirar. Especifica usando um número seguido de um tipo de duração, como 'd' para dias, 'h' para horas, 'm' para minutos e 's' para segundos, por exemplo 365d'. Não use esta opção em conjunto com a opção --expires-on.
-o | --saída O formato a usar para mostrar a saída do comando. Pode ser um de 'default', 'token' ou 'json'.
-h | --Ajuda Mostrar informação de ajuda

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 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 a /secret devolve um erro 401 Unauthorized. Uma aplicação de produção pode obter o JWT através de um serviço de token de segurança (STS), talvez em resposta ao iniciar sessão através de um conjunto de credenciais. Para efeitos de trabalhar com 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 para aplicações.

A user-jwts ferramenta é semelhante em conceito à ferramenta de segredos de utilizador , podendo ser usada para gerir valores para a aplicação que só são válidos para o programador na máquina local. Na realidade, a ferramenta user-jwts utiliza a user-secrets infraestrutura para gerir a chave com a qual os JWTs são assinados, garantindo que está 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:

Caminho do sistema de arquivos:

%APPDATA%\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 appsettings.Development.json projeto com JSON, semelhante ao seguinte:

{
  "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 /secret:

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

Onde {token} é o JWT previamente gerado.

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

Consulte Criar neste tópico para opções de criação suportadas.

O comando seguinte cria um JWT para um utilizador chamado MyTestUser:

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

O comando anterior tem uma saída semelhante à seguinte:

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