Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to serialize Rsa signing credentials in ASP.NET 5?

I am trying to make oauth authorization in my ASP.NET 5 web application. I have tried this aproach:

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

And it works well, but as you can see the rsa keys are always generated on startup. As i've experienced and seen in other topics, RSACryptoServiceProvider.ToXmlString and RSACryptoServiceProvider.FromXmlString are not present in DNX Core, and i could not find any other ways to (de)serialize my once generated credentials. Can you please show me a method?

Thanks

like image 922
kuzditomi Avatar asked Sep 02 '15 06:09

kuzditomi


1 Answers

I just upgraded my project to ASP.NET Core RC2 and ran into this issue as I read my RSA key (stored as XML) out of a config file for my JWT token generation.

I ended up creating my own method extensions to replace the ones I was using with ASP.NET 5 RC1. Here's the code:

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));
        }
    }
}
like image 108
Jargon Avatar answered Sep 28 '22 14:09

Jargon