2015-09-02 8 views
6

Sto tentando di eseguire un'autorizzazione oauth nella mia applicazione Web ASP.NET 5. Ho provato questo aproach:Come serializzare le credenziali di firma Rsa in ASP.NET 5?

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

e funziona bene, ma come si può vedere le chiavi RSA sono sempre generati all'avvio. Come ho visto e visto in altri argomenti, RSACryptoServiceProvider.ToXmlString e RSACryptoServiceProvider.FromXmlString non sono presenti in DNX Core e non sono riuscito a trovare altri modi per (de) serializzare le credenziali generate una volta. Puoi per favore mostrarmi un metodo?

Grazie

risposta

3

Ho appena aggiornato il mio progetto su ASP.NET Core RC2 e ho riscontrato questo problema mentre leggevo la mia chiave RSA (archiviata come XML) da un file di configurazione per la mia generazione di token JWT.

Ho finito per creare le mie estensioni di metodo per sostituire quelle che stavo usando con ASP.NET 5 RC1. Ecco il codice:

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)); 
     } 
    } 
} 
+0

Anche se, in realtà, in .NET core si dovrebbe operare su 'RSA' invece di' RSACryptoServiceProvider', dal momento che RSACryptoServiceProvider è Windows-non-UWP-only. – bartonjs