Генерировать веб-ключ JSON (jwk) в c#

#c# #jwt #jwk

#c# #jwt #jwk

Вопрос:

Мне нужно сгенерировать веб-ключ JSON (jwk) с помощью c #, как показано. Я просмотрел несколько статей, но там были реализации на других языках, таких как Java, и была сторонняя библиотека (Nimbus JOSE библиотека JWT и так далее). Не могли бы вы помочь мне сгенерировать веб-ключ JSON в C #?

 {
    "e": "AQAB",
    "n": "nZD7QWmIwj-3N_RZ1qJjX6CdibU87y2l02yMay4KunambalP9g0fU9yZLwLX9WYJINcXZDUf6QeZ-SSbblET-h8Q4OvfSQ7iuu0WqcvBGy8M0qoZ7I-NiChw8dyybMJHgpiP_AyxpCQnp3bQ6829kb3fopbb4cAkOilwVRBYPhRLboXma0cwcllJHPLvMp1oGa7Ad8osmmJhXhM9qdFFASg_OCQdPnYVzp8gOFeOGwlXfSFEgt5vgeU25E-ycUOREcnP7BnMUk7wpwYqlE537LWGOV5z_1Dqcqc9LmN-z4HmNV7b23QZW4_mzKIOY4IqjmnUGgLU9ycFj5YGDCts7Q",
    "alg": "RS256",
    "kid": "8f796169-0ac4-48a3-a202-fa4f3d814fcd",
    "kty": "RSA",
    "use": "sig"
}
 

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

1. Вы проверили это docs.microsoft.com/en-us/dotnet/api /… ? Это часть Azure SDK для . NET, как я понимаю из ссылки, которой я поделился.

Ответ №1:

Комментарий Кристоса выше указывает в правильном направлении, однако класс, который вам действительно нужен, — это JsonWebKeyConverter . в Microsoft.IdentityModel.Пакет nuget токенов.

Предполагая, что у вас где-то есть файл с открытым ключом, вам потребуется следующий код:

 var cert = new X509Certificate2(@".CertPublicKey.cer");
var key = new X509SecurityKey(cert);
var jwk = JsonWebKeyConverter.ConvertFromX509SecurityKey(key, true);
 

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

1. Есть быстрый способ сериализовать это и в JSON? Я думаю, это можно было бы сделать вручную, но было бы неплохо справиться с этим с помощью стандартной библиотеки.

2. Это лучшее, что я нашел до сих пор: github.com/StephenClearyExamples/RsaJwk/tree/master/RsaJwk

Ответ №2:

Нет необходимости запускать это через сертификат X509. Вы можете легко сериализовать JSON в Microsoft.IdentityModel.Tokens.JsonWebKey объект с помощью .Create(string json) конструктора.

Вы можете либо передать свой JSON (после удаления разрывов строк и экранирования кавычек),

 string str_jwk = "{"e":"AQAB","n":"nZD7QWmIwj-3N_RZ1qJjX6CdibU87y2l02yMay4KunambalP9g0fU9yZLwLX9WYJINcXZDUf6QeZ-SSbblET-h8Q4OvfSQ7iuu0WqcvBGy8M0qoZ7I-NiChw8dyybMJHgpiP_AyxpCQnp3bQ6829kb3fopbb4cAkOilwVRBYPhRLboXma0cwcllJHPLvMp1oGa7Ad8osmmJhXhM9qdFFASg_OCQdPnYVzp8gOFeOGwlXfSFEgt5vgeU25E-ycUOREcnP7BnMUk7wpwYqlE537LWGOV5z_1Dqcqc9LmN-z4HmNV7b23QZW4_mzKIOY4IqjmnUGgLU9ycFj5YGDCts7Q","alg":"RS256","kid":"8f796169-0ac4-48a3-a202-fa4f3d814fcd","kty":"RSA","use":"sig"}";
 

Или используйте Notepad для кодирования в Base64 (плагины -> MIME Tools -> Кодирование в Base64 с заполнением), затем декодируйте с помощью:

 string encoded_value = "ew0KICAgICJlIjogIkFRQUIiLA0KICAgICJuIjogIm5aRDdRV21Jd2otM05fUloxcUpqWDZDZGliVTg3eTJsMDJ5TWF5NEt1bmFtYmFsUDlnMGZVOXlaTHdMWDlXWUpJTmNYWkRVZjZRZVotU1NiYmxFVC1oOFE0T3ZmU1E3aXV1MFdxY3ZCR3k4TTBxb1o3SS1OaUNodzhkeXliTUpIZ3BpUF9BeXhwQ1FucDNiUTY4MjlrYjNmb3BiYjRjQWtPaWx3VlJCWVBoUkxib1htYTBjd2NsbEpIUEx2TXAxb0dhN0FkOG9zbW1KaFhoTTlxZEZGQVNnX09DUWRQbllWenA4Z09GZU9Hd2xYZlNGRWd0NXZnZVUyNUUteWNVT1JFY25QN0JuTVVrN3dwd1lxbEU1MzdMV0dPVjV6XzFEcWNxYzlMbU4tejRIbU5WN2IyM1FaVzRfbXpLSU9ZNElxam1uVUdnTFU5eWNGajVZR0RDdHM3USIsDQogICAgImFsZyI6ICJSUzI1NiIsDQogICAgImtpZCI6ICI4Zjc5NjE2OS0wYWM0LTQ4YTMtYTIwMi1mYTRmM2Q4MTRmY2QiLA0KICAgICJrdHkiOiAiUlNBIiwNCiAgICAidXNlIjogInNpZyINCn0=";
string str_jwk = Encoding.UTF8.GetString(Convert.FromBase64String(encoded_value))
 

Затем:

 var jwk = JsonWebKey.Create(str_jwk);
 

Это даст вам ваш JWK. Мой вопрос к вам в том, как вы затем используете его для подписи JWT? Это то, из-за чего я рву на себе волосы. (В .NET Framework 4.8. Я знаю, что в .NET 5/6 есть несколько гораздо лучших вспомогательных классов.)

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

1. var signingKey = new JsonWebKeySet(jsonString).GetSigningKeys().First(); затем получите учетные данные для подписи, чтобы создать свой JwtSecurityToken; new SigningCredentials(signingKey, _configuration.SigningAlgorithm.ToString()