如何在关系数据库(如Postgres)中存储类RsaSecurityKey https://msdn.microsoft.com/en-us/library/system.identitymodel.tokens.rsasecuritykey(v=vs.110).aspx的对象?
我必须创建RsaSecurityKey(第一次)并将密钥存储在db中并在Identity Server中使用它(使用IdentityServer4库)来签署Jwt令牌。
答案 0 :(得分:2)
我不确定您是否能够按原样将该类型的对象存储到数据库中,因为它们不可序列化 - 例如:如果您尝试使用.NET BinaryFormatter
来把它变成一个字节数组,它将失败并带有SerializationException
。
一些谷歌搜索显示还有其他人也遇到过这个问题,例如在AzureAD项目中:
https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/issues/591
如果您在该问题中关注the pull request,那么源代码似乎可以满足您的需求。 注意:如果您打算使用许可,请务必了解许可。
答案 1 :(得分:2)
在IdentityServer中,我们将整个RSA密钥序列化为JSON对象。
您可以使用相同的技术将密钥存储在数据库中。
答案 2 :(得分:0)
您可以存储创建密钥的参数,而不是存储密钥。 原始RSAParameters无法正确序列化,this question如何做到这一点。 下面的示例使用文件而不是db来存储参数,但是您明白了。
RSAParameters param;
try{
var json = File.ReadAllText(paramFile);
param = JsonConvert.DeserializeObject<RSAParameters>(json);
}catch(Exception _)
{
param = new RSACryptoServiceProvider(2048).ExportParameters(true);
var jsonString = JsonConvert.SerializeObject(param);
File.WriteAllText(paramFile, jsonString);
}
var securityKey = new RsaSecurityKey(param);