Для меня это произошло потому, что я изменил тип аргумента в функции, от Object a, до String a. Я мог бы решить это с чистой и построить снова
Возможно, он не может конвертироваться из-за проблем с разрешениями или загрузки сертификата в виде потока.
В моем случае с использованием IdentityServer3 работает следующий код:
/// <summary>
/// Load the certificate that sign the Id or Jw token
/// </summary>
/// <returns></returns>
private static X509Certificate2 LoadCertificate()
{
string baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
return new X509Certificate2(
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ConfigMngr.GetAppSettingsValue<string>("IdSrv:SigningCertificatePath")), ConfigMngr.GetAppSettingsValue<string>("IdSrv:SigningCertificatePassword"));
}
Затем в файле запуска owin я передаю его, как показано ниже:
SigningCertificate = LoadCertificate(),
Я знаю, что в Idsrv4 это Реализация отличается от кода, который я опубликовал, но это должна быть та же абстракция, например, вы загружаете X509Certificate, но он устарел, поэтому убедитесь, что вы используете правильную перегрузку для загрузки сертификата в виде потока и возвращаете правильный тип.
Кроме того, этот код можно тестировать с помощью IdSrv4:
var fileName = Path.Combine(env.WebRootPath, "FileName" );
if (!File.Exists(fileName))
{
throw new FileNotFoundException("No Signing Certificate!");
}
var cert = new X509Certificate2(fileName, "Pass" );
services.AddIdentityServer().AddSigningCredential(cert)
Поэтому вместо использования
X509Certificate.CreateFromCertFile(fileName);
Вы можете создать новый сертификат X509Certificate2, например:
var cert = new X509Certificate2(fileName, "Pass" );
И передать его промежуточному ПО owin:
services.AddIdentityServer().AddSigningCredential(cert)
В итоге я решил это так. Я использую общий сервер, где я размещаю это, и я не смог найти имя файла для сертификата или путь для его получения. В итоге я просто открыл магазин и нашел его таким. Не очень эффективно, но будет работать, пока я не перенесу его на выделенный сервер и не получу больше контроля.
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
X509Certificate2 cert = null;
foreach (X509Certificate2 certificate in store.Certificates)
{
if (!string.IsNullOrWhiteSpace(certificate?.SubjectName?.Name) && certificate.SubjectName.Name.StartsWith("CN=*.mysite.com"))
{
cert = certificate;
break;
}
}