c#. net Core identityserver4 Проблемы с сертификатом SustainSys Saml2 - PullRequest
1 голос
/ 06 мая 2020

У меня проблема при попытке добавить idp в службу аутентификации.

Мой клиент использует вход в систему forgerock и хочет, чтобы мы использовали SSO с SAML.

У меня это работает более старый проект, использующий простой компонент SAML 2.0 Jitbit для ASP.NET https://github.com/jitbit/AspNetSaml/

Но я переделываю свое приложение в ядре net с помощью identityserver4 и хотел воспользоваться преимуществами поддерживает реализацию с дополнительными наворотами.

Тип входа в систему SSO - простое перенаправление с обратным вызовом ACS.

Информация, которая у меня есть: SamlEndpoint - URL-адрес для перенаправления на EntityId - Мои сущности Id AcsUrl - URL-адрес для возврата к сертификату (строка) (взято из метаданных, которые не являются общедоступными)

Я пытался сделать следующее:

services.AddAuthentication()
            .AddSaml2(Saml2Defaults.Scheme,
                   options =>
                   {
                       options.SPOptions.EntityId = new EntityId("{MyEntityId}");
                       options.SPOptions.ReturnUrl = new Uri($"ACS URL");
                       options.SPOptions.AuthenticateRequestSigningBehavior = Sustainsys.Saml2.Configuration.SigningBehavior.Never;
                       //options.SPOptions.ServiceCertificates.Add(new ServiceCertificate { 
                       //    Use = CertificateUse.Signing, 
                       //    Certificate = new X509Certificate2(bytes), 
                       //    Status = CertificateStatus.Current 
                       //});
                       var idp =
                           new IdentityProvider(new EntityId("IDP ID"), options.SPOptions)
                           {                                   
                               Binding = Sustainsys.Saml2.WebSso.Saml2BindingType.HttpRedirect,
                               LoadMetadata = false,
                               AllowUnsolicitedAuthnResponse = true, 
                               SingleSignOnServiceUrl = new Uri("Redirect URL") 
                           };
                       options.IdentityProviders.Add(idp);
                   });

Исключение I Я получаю: System.Configuration.ConfigurationErrorsException: 'Отсутствует конфигурация сертификата подписи на Idp

Но я не вижу, как добавить свой сертификат? так как у него нет закрытого / publi c ключа:

Из метаданных

<ds:X509Data>                    
    <ds:X509Certificate>
        MIIDYTCCAk..........7tOxUus=                    
    </ds:X509Certificate>                
</ds:X509Data>

Ищу направление в правильном направлении, так как я не могу его решить.

Если я попытаюсь добавить сертификат (закомментированный выше), то я не получу исключения, предоставленного закрытым ключом.

Ура, ребята

1 Ответ

1 голос
/ 07 августа 2020

Эта проблема, по-видимому, связана с типом «курица и яйцо», когда присвоение значения для LoadMetadata не является «безопасной» операцией для выполнения при создании нового экземпляра IdentityProvider.

The * Метод свойства 1005 * для IdentityProvider также вызывает Validate() для вашего вновь созданного экземпляра IdentityProvider. В этом случае вы можете увидеть здесь вызываемый метод Validate(): https://github.com/Sustainsys/Saml2/blob/develop/Sustainsys.Saml2/IdentityProvider.cs#L123. Не беспокойтесь слишком сильно, так как поле частной поддержки, loadMetadata, уже равно false (значение по умолчанию).

Проблема в том, что вам еще не предоставлена ​​возможность добавить свой сертификат подписи IdP (idp.SigningKeys.Add(...)) перед вызовом Validate().

Вам необходимо:

  1. Создать свой idp, пока не ставить LoadMetadata
  2. Добавьте свои ключи подписи или настройте любые другие параметры конфигурации, которые вам нужны
  3. При желании вы можете явно указать LoadMetadata (необязательно в вашем случае, поскольку он уже false)

Это должен устранить эту ошибку и помочь вам.

Кстати, ваш сертификат подписи должен иметь закрытый ключ. Я бы предложил создать что-то вроде PFX (PKCS # 12, PKCS # 8, et c.), И вы можете импортировать этот файл непосредственно в X509Certificate2 с установленным паролем, обязательно установите параметры с помощью MachineKeySet | Exportable чтобы ваш закрытый ключ был доступен: например,

byte[] pfx = null; // TODO: Get your actual certificate, read from file, DB, memory, etc.
var signingCert = new X509Certificate2(
    pfx,
    "password",
    X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet);
...