获取 System.ObjectDisposeException:无法访问已处置的对象。对象名称:“RSA”。在 Identity Server 6 中使用手动密钥管理时

Far*_*dur 3 c# .net-6.0 duende-identity-server

当我尝试对 duende 身份 6 使用手动密钥管理时,我收到从 api“无法访问已处置对象。对象名称:'RSA'”返回的错误。当我尝试从代码创建 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>();

Run Code Online (Sandbox Code Playgroud)

我正在尝试在 duende 身份服务器中使用手动密钥管理创建 jwt 令牌。我尝试使用对称算法,但身份服务器 6 不支持此功能,现在唯一的选择是非对称(RSA 算法)。我想使用私钥和公钥而不是 RSA 参数来完成此操作。

Ern*_*rno 5

这行:

using RSA rsa =  RSA.Create();
Run Code Online (Sandbox Code Playgroud)

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

这将处理 rsa 对象。

在此之前,这一行:

新的签名凭据(新的 RsaSecurityKey(rsa)

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

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

从第一行删除using可以防止丢弃。

所以使用:

RSA rsa =  RSA.Create();
Run Code Online (Sandbox Code Playgroud)

反而。