Проблема с созданием JWT в .NET core

#asp.net-core #jwt

#asp.net-core #jwt

Вопрос:

Я использую asp.net ядро для создания JWT и проблемы с ним.

Мне нужно создать JWT, подобный псевдокоду, приведенному ниже:

 var headers = base64URLencode(HeaderData);
var payload = base64URLencode(payloadData);
var headerwithpayload = header   "."   payload;
 
var signature = base64URLencode(RSASHA256(headerwithpayload, privateKey));
 
var encodedJWT = headerwithpayload   "."   signature;
  

Для достижения этой цели были созданы общедоступный сертификат X509 (.cer) и частный сертификат (.pfx) с паролем. Алгоритм, используемый для создания JWT, — RS256.

Приведенный ниже код был написан для создания JWT, и когда я проверил JWT с помощью моего общедоступного сертификата в jwt.io , это отображается как действительная подпись. Однако, когда я отправляю его другой команде, которой необходимо обработать мой запрос, я получаю ошибку 401 — Unauthorized.

          // Certificate amp; Private Key            
         string certLocation = @"E:PrivateCert.pfx";
         string certPassword = "####";
         var colln = new X509Certificate2collection();
         colln.Import(certLocation, certPassword, X509KeyStorageFlags.PersistKeySet);
         var certificate = colln[0];
         var privateKey = certificate.GetRSAPrivateKey();
         var privateSecurityKey = new RsaSecurityKey(privateKey);

        // Header, Payload amp; Signature
        var descriptor = new SecurityTokenDescriptor
        {
            Issuer = "ClientId",
            Audience = "audience",
            Expires = DateTime.UtcNow.AddMinutes(10),
            Subject = new ClaimsIdentity(new List<Claim> { new Claim("sub", "subject") }),
            SigningCredentials = new SigningCredentials(privateSecurityKey, SecurityAlgorithms.RsaSha256)
        };

        var tokenHandler = new JsonWebTokenHandler();         
        string jwtValue = tokenHandler.CreateToken(descriptor);
  

Я понимаю, что я не кодирую JWT во второй раз, используя подпись, которая может быть причиной проблемы.

Как мне:

  1. Создать закодированный JWT?
  2. Извлеките закрытый ключ из частного сертификата в виде строки, чтобы я мог создать закодированный JWT точно так же, как в псевдокоде.

Комментарии:

1. Можете ли вы поделиться своим startup.cs? Вы установили ValidateIssuerSigningKey = true , и у вас IssuerSigningKey то же самое с privateSecurityKey ?

2. Привет @YiyiYou, я использую JWT только в контроллере. Я буду отправлять JWT другому внешнему API (у которого есть мой общедоступный сертификат) для получения информации. Итак, нужно ли внести какие-либо изменения при запуске? Код в моем вопросе содержит полный код, который я использовал, и я не использовал ValidateIssuerSigningKey

3. Я имею в виду ваш startup.cs в вашем внешнем API. В вашем внешнем API вам нужно установить IssuerSigningKey то же самое с privateSecurityKey .

4. Я не могу внести изменения во внешний API, поскольку он принадлежит другой команде. Кроме того, они используют Java для своей разработки. У них есть общедоступный сертификат X509, который я отправил им для чтения JWT, который я буду отправлять. Итак, все, что мне нужно сделать, это создать JWT, аналогичный псевдокоду, упомянутому в моем вопросе выше.