如何在ASP.NET 5中序列化Rsa签名凭据?

时间:2015-09-02 06:55:02

标签: c# oauth-2.0 asp.net-core

我正在尝试在ASP.NET 5 Web应用程序中进行oauth授权。我试过这个方法:

ASP.NET 5 OAuthBearerAuthentication: The following authentication scheme was not accepted: Bearer

它运行良好,但正如您所见,rsa密钥始终在启动时生成。正如我在其他主题中所见到的那样,RSACryptoServiceProvider.ToXmlStringRSACryptoServiceProvider.FromXmlString在DNX Core中不存在,我找不到任何其他方法(de)序列化我曾经生成的凭据。你能告诉我一个方法吗?

由于

2 个答案:

答案 0 :(得分:4)

我刚刚将我的项目升级到ASP.NET Core RC2并遇到了这个问题,因为我从我的JWT令牌生成的配置文件中读取了我的RSA密钥(存储为XML)。

我最终创建了自己的方法扩展来替换我使用的ASP.NET 5 RC1。这是代码:

using System;
using System.Security.Cryptography;
using System.Xml;

namespace RSACryptoServiceProviderExtensions
{
    public static class RSACryptoServiceProviderExtensions
    {
        public static void FromXmlString(this RSACryptoServiceProvider rsa, string xmlString)
        {
            RSAParameters parameters = new RSAParameters();

            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(xmlString);

            if (xmlDoc.DocumentElement.Name.Equals("RSAKeyValue"))
            {
                foreach (XmlNode node in xmlDoc.DocumentElement.ChildNodes)
                {
                    switch (node.Name)
                    {
                        case "Modulus":     parameters.Modulus =    Convert.FromBase64String(node.InnerText); break;
                        case "Exponent":    parameters.Exponent =   Convert.FromBase64String(node.InnerText); break;
                        case "P":           parameters.P =          Convert.FromBase64String(node.InnerText); break;
                        case "Q":           parameters.Q =          Convert.FromBase64String(node.InnerText); break;
                        case "DP":          parameters.DP =         Convert.FromBase64String(node.InnerText); break;
                        case "DQ":          parameters.DQ =         Convert.FromBase64String(node.InnerText); break;
                        case "InverseQ":    parameters.InverseQ =   Convert.FromBase64String(node.InnerText); break;
                        case "D":           parameters.D =          Convert.FromBase64String(node.InnerText); break;
                    }
                }
            } else
            {
                throw new Exception("Invalid XML RSA key.");
            }

            rsa.ImportParameters(parameters);
        }

        public static string ToXmlString(this RSACryptoServiceProvider rsa)
        {
            RSAParameters parameters = rsa.ExportParameters(true);

            return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent><P>{2}</P><Q>{3}</Q><DP>{4}</DP><DQ>{5}</DQ><InverseQ>{6}</InverseQ><D>{7}</D></RSAKeyValue>",
                Convert.ToBase64String(parameters.Modulus),
                Convert.ToBase64String(parameters.Exponent),
                Convert.ToBase64String(parameters.P),
                Convert.ToBase64String(parameters.Q),
                Convert.ToBase64String(parameters.DP),
                Convert.ToBase64String(parameters.DQ),
                Convert.ToBase64String(parameters.InverseQ),
                Convert.ToBase64String(parameters.D));
        }
    }
}

答案 1 :(得分:0)

CoreFX中的RSACryptoServiceProvider看起来像ImportParametersExportParameters方法使用RSAParameters结构反序列化/序列化。