.NET Core IssuerSigningKey do arquivo para autenticação do portador JWT

Estou com dificuldades na implementação (ou no entendimento) das chaves de assinatura para autenticação do JWT Bearer Token. E espero que alguém possa me ajudar ou me explicar o que estou entendendo mal.

Nas últimas semanas, rastreiei vários tutoriais e consegui executar um controlador de autenticação personalizado que emite meus tokens e consegui configurar a autenticação do portador JWT para validar os tokens no cabeçalho.

Funciona.

Meu problema é que todos os exemplos e tutoriais geram chaves de assinatura aleatória ou não-monetária (emissor) ou usam seqüências de caracteres "password" codificadas ou as retiram de algum arquivo de configuração (procure "password" nos exemplos de código).

O que quero dizer com instalação de validação (no StartUp.cs):


  //using hardcoded "password"
  SecurityKey key = new SymmetricSecurityKey(System.Text.Encoding.ASCII.GetBytes("password"));

  app.UseJwtBearerAuthentication(new JwtBearerOptions
  {
    AutomaticAuthenticate = true,
    AutomaticChallenge = true,
    TokenValidationParameters = new TokenValidationParameters
    {
      ValidateIssuer = true,
      ValidIssuer = "MyIssuer",
      ValidateAudience = true,
      ValidAudience = "MyAudience",
      ValidateLifetime = true,
      IssuerSigningKey = key
    }
  });

No AuthController, criando o token:


  //using hardcoded password
  var signingKey = new SymmetricSecurityKey(System.Text.Encoding.ASCII.GetBytes("password"));
  SigningCredentials credentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256);

  var jwt = new JwtSecurityToken     // Create the JWT and write it to a string
  (
    issuer: _jwtTokenSettings.Issuer,
    audience: _jwtTokenSettings.Audience,
    claims: claims,
    notBefore: now,
    expires: now.AddSeconds(_jwtTokenSettings.LifetimeInSeconds),
    signingCredentials: credentials
  );

Noessa questão eles usaram:

RSAParameters keyParams = RSAKeyUtils.GetRandomKey();

Minhas suposições (atuais) eram de que, na produção, você não deve usar cadeias codificadas ou codificadas em arquivos de configuração para as chaves de assinatura do token. Mas use alguns arquivos de certificado ??? Estou errado?

Então, tentei substituir as strings por um certificado que funcione no controlador de autenticação:


  //using a certificate file
  X509Certificate2 cert = new X509Certificate2("MySelfSignedCertificate.pfx", "password");
  X509SecurityKey key = new X509SecurityKey(cert);
  SigningCredentials credentials = new SigningCredentials(key, "RS256");

  var jwt = new JwtSecurityToken      // Create the JWT and write it to a string
  (
     issuer: _jwtTokenSettings.Issuer,
     audience: _jwtTokenSettings.Audience,
     claims: claims,
     notBefore: now,
     expires: now.AddSeconds(_jwtTokenSettings.Lifeti,meInSeconds),
     signingCredentials: credentials
  );

Mas parece que não há como obter a validação usando um certificado.


  X509Certificate2 cert = new X509Certificate2("MySelfSignedCertificate.pfx", "password");
  SecurityKey key == // ??? how to get the security key from file (not necessarily pfx)

  app.UseJwtBearerAuthentication(new JwtBearerOptions
  {
    AutomaticAuthenticate = true,
    AutomaticChallenge = true,
    TokenValidationParameters = new TokenValidationParameters
    {
      ValidateIssuer = true,
      ValidIssuer = "MyIssuer",
      ValidateAudience = true,
      ValidAudience = "MyAudience",
      ValidateLifetime = true,
      IssuerSigningKey = key
    }
  });

Estou errado ao usar certificados para as chaves de assinatura? De que outra forma eu alteraria as chaves de assinatura na produção quando o controlador de autenticação estiver em um servidor diferente da API da Web consumida / protegida (pode uma vez, não agora)?

Parece que também não entendi bem (etapas necessárias) para obter a resposta deessa questão trabalhando.

Agora eu consegui rodar, ainda estou perdendo o sentido, se deveria ser assim?

Digno de nota: Arquivo não encontrado (após a implantação no servidor)

Para todos aqueles que usam isso e funciona quando iniciado no Visual Studio, mas após a implantação em um servidor / azul, ele diz "Arquivo não encontrado":

leia e promova esta pergunta:Certificado X509 não carregando o arquivo de chave privada no servidor

Digno de nota 2: na verdade, não é necessário para autenticação baseada em token

A chave pública não precisa estar no lado da API. Ele será recuperado através do ponto de extremidade de descoberta do servidor de autenticação automaticamente.

questionAnswers(1)

yourAnswerToTheQuestion