获取 System.ObjectDisposedException:无法访问已释放的对象。对象名称:"RSA"。在身份服务器 6 中使用手动密钥管理时



我从api返回这个错误;无法访问已处置的对象。对象名称:'RSA'"而我试图使用手动密钥管理duende身份6。当我尝试从代码中创建RSA参数时,它确实有效,但它不适用于私钥公钥。

请告诉我下面代码中的问题是什么。还有,如果有人能告诉我除了这个以外的其他方法。

Program.cs中的代码

// this will return signing credentials
SigningCredentials GetSigningCredentials()
{
var p = @"MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAKj/nCpvB71XiFgH
3ykjGU/8SutC680yQjqQdEGh/SDxPAncW5SfavcFSt0K/1UuyyXNc5o9RIcns2rE
4W49T0T4VIP4WhVkAQEvBc4NeLX+o9W3pj6A3dNb+M+2VzZGcFPRtkypNtgxsNJ8
s0b4pmGP9zeMzCkd3UJgCLlZOdz/AgMBAAECgYAzHUywkPB4VjdI2OioWpNXW+mV
CqKjZ6YcbICdMU+MXSpZmSqh4y3JFPK1tJPRwdtzzZY/enR1pI5hprbATw7gQUK1
1SxRIhyC70DSuX6C4dSLQBnXCUzcWokY1IB+iyftHamrtVdTK2IBS7Q9iMAUX49o
XcmDsn8vbAze6mg4YQJBAOCPDcELQtZeZAhEp7Zy4Ks2MGt3YASoDySPrJxCRn5x
WvBynmS+pDbptY7bnV9tk9pIBfxXgooUwbjqGT5WoTcCQQDAqRYhYFtk+8l8Yjmo
Fhr859U6wnjhq9BCzwtRVzPfkpYjOUeHaEJozEUtAKN2y68Aq9zNDdq6SL+9QIcP
MqZ5AkAYsAF+GKPXd3c6Cno5t7V1fTajifM3b9aCWX1LjIm9eu7ZgnBheQgKtXTt
aL2LcTuRAtwNmv1R+ug1UR9HWDTPAkAJHDXCsEbCGLHnYtGtJBZ0nRXVKHsE2NYJ
QrcbSo9WZB0bX0sFmSWCxR4EScJxDKKi2n2faKdOJcCDV3jLfC6pAkBSn5HYh1Wm
ycOUmv6MANXgrmUnmhD23hAMQeJmU4Rs6mzVXCwlJUO3EvgkONjtOUh6NFM9G2gJ
Y1AmxhQIrusw";

var privateKey = p.ToByteArray();
using RSA rsa =  RSA.Create();
RSAParameters rsaKeyInfo = rsa.ExportParameters(false);
rsa.ImportPkcs8PrivateKey(privateKey, out _);
var signingCredentials = new SigningCredentials(new RsaSecurityKey(rsa), SecurityAlgorithms.RsaSha256)
{
CryptoProviderFactory = new CryptoProviderFactory { CacheSignatureProviders = false }
};
return signingCredentials;
}
builder.Services.AddIdentityServer(options =>
{
options.LicenseKey =
"xyz";
options.Events.RaiseErrorEvents = true;
options.Events.RaiseInformationEvents = true;
options.Events.RaiseFailureEvents = true;
options.Events.RaiseSuccessEvents = true;
options.EmitStaticAudienceClaim = true;
options.KeyManagement.Enabled = false;
}).AddConfigurationStore(options => options.ConfigureDbContext = b => b.UseSqlServer(connectionString,
opt => opt.MigrationsAssembly(migrationsAssembly)))
.AddOperationalStore(options => options.ConfigureDbContext = b => b.UseSqlServer(connectionString,
opt => opt.MigrationsAssembly(migrationsAssembly)))
.AddSigningCredential(GetSigningCredentials())
.AddAspNetIdentity<ApplicationUser>();

我试图在duende身份服务器中使用手动密钥管理创建jwt令牌。我试图这样做对称算法,但身份服务器6不支持这唯一的选择是不对称现在(RSA算法)。我想使用私钥和公钥,而不是RSA参数。

这一行:

using RSA rsa =  RSA.Create();

在从GetSigningCredentials函数返回时导致调用rsa.Dispose()。

处理rsa对象。

在此之前,这行:

new SigningCredentials(new rsassecuritykey (rsa))

将RSA对象传递给函数返回的SigningCredentials对象。

这意味着SigningCredentials对象包含一个对已处置对象的引用,一旦该对象使用rsa对象,它就会抛出异常。

从第一行移除using会阻止处置。

所以使用:

RSA rsa =  RSA.Create();

最新更新