2016-11-01 6 views
1

Я хочу сгенерировать токен JWT в .Net 4.5 с использованием асимметричного ключа, который я предоставляю сам, но я сталкиваюсь с несколькими проблемами с System.IdentityModel.Tokens.Jwt, версия 4.0 0,3.RsaSecurityKey не принимает RSAParameters в качестве аргументов

Желательно, чтобы я создал свои собственные ключи 2048, как поставщик позволяет мне это делать. Конструктор RSA.Create() создает 1024 ключа.

using (RSACryptoServiceProvider provider = new RSACryptoServiceProvider(2048)) 
     { 
      var publicPrivate = provider.ToXmlString(true); 
      var publicKeyOnly = provider.ToXmlString(false); 

      var stuff = provider.ExportParameters(true); 

      signingCredentials = new SigningCredentials(new RsaSecurityKey(RSA.Create()), SecurityAlgorithms.RsaSha256Signature, SecurityAlgorithms.Sha256Digest); //no idea how to pull the key out of here. 

     } 

Во многих примерах можно опустить RSAParameters в конструктор RsaSecurityKey, но теперь он принимает только конструктор RSA.Create() (с дополнительным параметром строки) Следующий код надрез происходит от https://stackoverflow.com/a/38233644 Обратите внимание, что в этом примере RSAParameters прекрасно вписываются в конструктор RsaSecurityKey, который я не могу сделать с моей версией, я ограничен использованием RSA.Create, это швы.

// NOTE: Replace this with your actual RSA public/private keypair! 
var provider = new RSACryptoServiceProvider(2048); 
var parameters = provider.ExportParameters(true); 

// Build the credentials used to sign the JWT 
var signingKey = new RsaSecurityKey(parameters); //not an option for me, unfortunately 
+0

Одним из элементов этого является то, что для 4.0.3 один не использует параметры в RsaSecurityKey, вы используете поставщика. поставщик услуг = новый RSACryptoService (2048); var signKey = новый RsaSecurityKey (поставщик); Я нашел его в следующей ссылке. https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/issues/477 – user7101139

ответ

1

Вот что я сделал. Сначала я запустил отладчик и первый раз, когда я захватил XML у своего нового провайдера, используя метод ToXmlString (Boolean) нового RSACryptoServiceProvider (2048). Затем я сделал XML-файл для хранения. (В этом примере я просто использую свой жесткий диск для хранения, очевидно, не для производственного кода.)

Теперь, когда у меня есть RSAPrameters, у меня есть ключ «, который я предоставляю сам», он может исходить из любого безопасного хранилища - doesn Это важно для этого ответа.

XmlDocument publicXmlParam = new XmlDocument(); 
publicXmlParam.Load("C:\\rsapublicprivate.xml"); 

// Here I "utilize my own 2048 keys" 
RSACryptoServiceProvider provider = new RSACryptoServiceProvider(2048); 

//This was the trick, we pass the RSA parameters as XML into the provider.   
provider.FromXmlString(publicXmlParam.OuterXml); 

// Then we use the provider in the constructor of the RsaSecurityKey 
var key = new RsaSecurityKey(provider); 

signingCredentials = 
    new SigningCredentials(
     key, 
     SecurityAlgorithms.RsaSha256Signature, 
     SecurityAlgorithms.Sha256Digest); 

Теперь у меня есть учетные данные для подписания, которые мне нужно подписать с помощью токена JWT.