IdentityServer4 AddSigningCredentials с сертификатом

Для меня это произошло потому, что я изменил тип аргумента в функции, от Object a, до String a. Я мог бы решить это с чистой и построить снова

1
задан Bojan 17 March 2019 в 22:01
поделиться

2 ответа

Возможно, он не может конвертироваться из-за проблем с разрешениями или загрузки сертификата в виде потока.

В моем случае с использованием 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)
0
ответ дан Marzouk 17 March 2019 в 22:01
поделиться

В итоге я решил это так. Я использую общий сервер, где я размещаю это, и я не смог найти имя файла для сертификата или путь для его получения. В итоге я просто открыл магазин и нашел его таким. Не очень эффективно, но будет работать, пока я не перенесу его на выделенный сервер и не получу больше контроля.

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;
    }
}
0
ответ дан Bojan 17 March 2019 в 22:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: