Как сериализовать учетные данные подписи Rsa в ASP.NET 5?

Я пытаюсь сделать авторизацию oauth в своем веб-приложении ASP.NET 5. Я пробовал этот подход:

ASP.NET 5 OAuthBearerAuthentication: следующая схема аутентификации не была принята: Носитель

И он работает хорошо, но поскольку вы можете видеть, что ключи rsa всегда генерируются при запуске. Как я уже видел и видел в других темах, RSACryptoServiceProvider.ToXmlString и RSACryptoServiceProvider.FromXmlString не присутствуют в DNX Core, и я не смог найти другие способы (де) сериализации моих однажды созданных учетных данных. Можете ли вы показать мне метод?

Спасибо

2 ответа

Я только что обновил свой проект до ASP.NET Core RC2 и столкнулся с этой проблемой, когда я прочитал свой ключ RSA (сохраненный как XML) из конфигурационного файла для генерации маркера JWT.

В итоге я создал свои собственные расширения методов для замены тех, которые я использовал с 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));
 }
 }
}


Похоже, RSACryptoServiceProvider в CoreFX есть методы ImportParameters и ExportParameters, которые десериализуют/сериализуют с помощью RSAParameters struct.

licensed under cc by-sa 3.0 with attribution.