Не думаю, что код, который вы добавили для установки сертификата подписи, вызвал проблему.Код в трассировке стека выполняется, потому что identityBuilder.AddApiAuthorization<ApplicationUser, DbContext>();
вызывает AddSigningCredentials()
, что в конечном итоге настраивает код для поиска ключа appsettings.json Microsoft.AspNetCore.ApiAuthorization.IdentityServer.ConfigureSigningCredentials
:
public SigningCredentials LoadKey()
{
var key = new KeyDefinition();
_configuration.Bind(key);
switch (key.Type)
{
case KeySources.Development:
var developmentKeyPath = Path.Combine(Directory.GetCurrentDirectory(), key.FilePath ?? DefaultTempKeyRelativePath);
var createIfMissing = key.Persisted ?? true;
_logger.LogInformation($"Loading development key at '{developmentKeyPath}'.");
var developmentKey = new RsaSecurityKey(SigningKeysLoader.LoadDevelopment(developmentKeyPath, createIfMissing))
{
KeyId = "Development"
};
return new SigningCredentials(developmentKey, "RS256");
case KeySources.File:
var pfxPath = Path.Combine(Directory.GetCurrentDirectory(), key.FilePath);
var pfxPassword = key.Password;
var storageFlags = GetStorageFlags(key);
_logger.LogInformation($"Loading certificate file at '{pfxPath}' with storage flags '{key.StorageFlags}'.");
return new SigningCredentials(new X509SecurityKey(SigningKeysLoader.LoadFromFile(pfxPath, key.Password, storageFlags)), "RS256");
case KeySources.Store:
if (!Enum.TryParse<StoreLocation>(key.StoreLocation, out var storeLocation))
{
throw new InvalidOperationException($"Invalid certificate store location '{key.StoreLocation}'.");
}
_logger.LogInformation($"Loading certificate with subject '{key.Name}' in '{key.StoreLocation}\\{key.StoreName}'.");
return new SigningCredentials(new X509SecurityKey(SigningKeysLoader.LoadFromStoreCert(key.Name, key.StoreName, storeLocation, GetCurrentTime())), "RS256");
case null:
throw new InvalidOperationException($"Key type not specified.");
default:
throw new InvalidOperationException($"Invalid key type '{key.Type ?? "(null)"}'.");
}
}
Вы столкнулись с делом null
потому что ваш appsettings.json или appsettings.Development.json не настраивает Key
.
Я могу воспроизвести вашу проблему двумя способами:
Закомментирование конфигурации ключа в appsetting. Разработка .json
{
"Logging": {
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
},
"IdentityServer": {
//"Key": {
// "Type": "Development"
//}
}
}
Предполагается, что вы выполняете \ отлаживаете в среде разработки
Второй способ воспроизведения - настройка для запуска в Production, для которой по умолчанию нет определения Key
в appsettings.json
Я думаю, что решение вашей проблемы - определить файл сертификата в appsettings.json или appsettings.Development.json :
{
"Logging": {
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
},
"IdentityServer": {
"Key": {
"Type": "File",
"FilePath": "Certificates\\certificatefile.pfx",
"Password": "veryDifficultPassword"
}
}
}
и удалите эту трескуе
var fileName = Path.Combine("Certificates", "certificatefile.pfx");
var cert = new X509Certificate2(fileName, "veryDifficultPassword");
identityBuilder.AddSigningCredential(cert);