RsaSecurityKey不接受RSAParameters作为参数

时间:2016-11-01 19:28:24

标签: c# .net jwt encryption-asymmetric

我想使用我自己提供的非对称密钥在.Net 4.5中生成JWT令牌,但我遇到了System.IdentityModel.Tokens.Jwt版本4.0.3的一些问题。

最好是我会创建自己的2048密钥,就像提供商允许我这样做。 RSA.Create()构造函数创建1024个键。

def set_post
  @post = Post.find params[:id]
end

在许多示例中,可以将RSAParameters放入RsaSecurityKey构造函数中,但现在它只接受RSA.Create()构造函数(带有可选的字符串参数)以下代码片段来自https://stackoverflow.com/a/38233644请注意,在此示例中RSAParameters很好地进入了RsaSecurityKey构造函数,我无法使用我的版本,我只能使用RSA.Create,它接缝。

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.

        }

1 个答案:

答案 0 :(得分:1)

这就是我所做的。首先,我运行调试器,第一次使用新RSACryptoServiceProvider(2048)的ToXmlString(布尔)方法从新提供程序捕获XML。然后我制作了一个XML文件进行存储。 (在这个例子中,我只使用我的硬盘进行存储,显然不是生产代码。)

现在我有了RSAPrameters,我有“我自己提供的”密钥,它可以来自任何安全存储 - 对于这个答案无关紧要。

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令牌所需的签名凭据。