Пожалуйста, помогите мне с вызовом IIdentityServerBuilder.AddSigningCredential
в методе Startup.Configure
.
Я загружаю материал ключа для IdentityServer4 в методе ConfigureServices
, как показано ниже:
class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<KeyVaultAccessImpl>();
var identityBuilder = services.AddIdentityServer();
KeyVaultAccessImpl kva;
kva = services.BuildServiceProvider().GetService<KeyVaultAccessImpl>();
foreach (X509Certificate2 c in kva.LoadSignCertificates())
identityBuilder.AddSigningCredential(c);
}
}
Метод AddSigningCredential
вызывается в методе Startup.ConfigureServices
. Реализация KeyVaultAccessImpl
загружает X509Certificate2
экземпляров из внешнего хранилища для использования в identityBuilder.AddSigningCredential
. KeyVaultAccessImpl
содержит внешние зависимости, настроенные с помощью services.Add...
. Он работает нормально, однако вызов services.BuildServiceProvider().GetService<KeyVaultAccessImpl>()
в методе ConfigureServices
выдает предупреждение компилятора:
Calling ' BuildServiceProvider 'из кода приложения приводит к созданию дополнительной копии одноэлементных сервисов. Рассмотрим альтернативы, такие как сервисы внедрения зависимостей в качестве параметров для 'Configure'
Я пытался сохранить identityBuilder
как свойство класса и вызвать AddSigningCredential
в методе Configure
, как показано ниже:
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<KeyVaultAccessImpl>();
identityBuilder = services.AddIdentityServer();
}
IIdentityServerBuilder identityBuilder;
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, KeyVaultAccessImpl kva)
{
foreach (X509Certificate2 c in kva.LoadSignCertificates())
identityBuilder.AddSigningCredential(c); // no error but key is not added
identityBuilder.AddDeveloperSigningCredential() //is ignored either
app.UseIdentityServer();
}
Однако проблема в том, что AddSigningCredential игнорируется, и на самом деле никакой ключ не добавляется.
При попытке получить токен возникает ошибка PolicyViolation Keyset is missing
.
Возможно, потому что IdentityServer создается (и инициализируется) после ConfigureServices
, но до вызова Configure
метода ,
Можно ли как-нибудь вызвать identityBuilder.AddSigningCredential
в методе Configure
?