Конфигурация xml метаданных паспорта-saml

Я пытаюсь использовать паспорт-самл для аутентификации в своем проекте. До сих пор мне удавалось использоватьpassport.generateServiceProviderMetadata(decryptionCert) для создания следующего файла metadata.xml:

<EntityDescriptor xmlns="urn:oasis:names:tc:SAML:2.0:metadata" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" entityID="passport-saml" ID="passport_saml">
  <SPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
    <KeyDescriptor use="encryption">
      <ds:KeyInfo>
        <ds:X509Data>
          <ds:X509Certificate>MIICizCCAfQCCQCY8tKaMc0BMjANBgkqh...</ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
      <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc"/>
      <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"/>
      <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc"/>
    </KeyDescriptor>
    <SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="www.mywebsite.com/logout/callback"/>
    <NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</NameIDFormat>
    <AssertionConsumerService index="1" isDefault="true" Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="www.mywebsite.com/login/callback"/>
  </SPSSODescriptor>
</EntityDescriptor>

Конфиг SamlStrategy:

  {
    callbackUrl: 'www.mywebsite.com/login/callback',
    entryPoint: 'https://openidp.feide.no/simplesaml/saml2/idp/SSOService.php',
    decryptionPvk: 'MIICizCCAfQCCQCY8tKaMc0BMjANBgkqh...',
    issuer: 'passport-saml',
    logoutCallbackUrl: 'www.mywebsite.com/logout/callback'
  }

Есть несколько изменений, которые мне нужно внести, чтобы соответствовать требованиям IDP:

  1. Добавьте AuthnRequestsSigned=false и WantAssertionsSigned=true в тег SPSSODescriptor.
  2. Измените KeyDescriptor, чтобы использовать подпись вместо шифрования, и удалите теги EncryptionMethod.
  3. Используйте привязки SOAP для SingleLogoutService вместо HTTP-POST

Вот файл metadata.xml, который я хочу получить:

<EntityDescriptor xmlns="urn:oasis:names:tc:SAML:2.0:metadata" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" entityID="passport-saml" ID="passport_saml">
  <SPSSODescriptor AuthnRequestsSigned="false" WantAssertionsSigned="true" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
    <KeyDescriptor use="signing">
      <ds:KeyInfo>
        <ds:X509Data>
          <ds:X509Certificate>MIICizCCAfQCCQCY8tKaMc0BMjANBgkqh...</ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
    </KeyDescriptor>
    <SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="www.mywebsite.com/logout/callback"/>
    <NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</NameIDFormat>
    <AssertionConsumerService index="1" isDefault="true" Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="www.mywebsite.com/login/callback"/>
  </SPSSODescriptor>
</EntityDescriptor>

Есть ли способ настроить паспорт для создания вышеуказанных метаданных? Или я должен просто создать его вручную? Любая помощь или совет будут высоко оценены!


person Li'    schedule 22.08.2020    source источник
comment
Вы нашли решение?   -  person Hendrik Jan    schedule 02.02.2021


Ответы (1)


Это лишь частичный ответ.
Я знаю только, как решить пункт 1 (добавьте AuthnRequestsSigned=false и WantAssertionsSigned=true в тег SPSSODescriptor).

AuthnRequestsSigned и WantAssertionsSigned сообщают IdP, как себя вести, и не требуют каких-либо других изменений в SP.
Вы можете просто вручную добавить AuthnRequestsSigned и WantAssertionsSigned в метаданные.

Или программно добавьте их так:

function generateMetadata() {
    const decryptionCrt = fs.readFileSync(config.crt_file, 'utf8');
    const metadata = samlStrategy.generateServiceProviderMetadata(
        decryptionCrt, // should match with samlStrategy:decryptionPvk
        decryptionCrt // should match with samlStrategy:privateCert
    );

    let xml = '';

    // Convert XML to JSON
    xml2js.parseString(metadata, (err, result) => {
        if (err) {
            throw err;
        }

        // Add AuthnRequestsSigned to the metadata (as requested by ITS)
        result.EntityDescriptor.SPSSODescriptor[0].$.AuthnRequestsSigned = 'true';
        result.EntityDescriptor.SPSSODescriptor[0].$.WantAssertionsSigned = 'true';

        // Convert JSON back to XML
        const builder = new xml2js.Builder();
        xml = builder.buildObject(result);
    });

    return xml;
}

Если вы используете WantAssertionsSigned, убедитесь, что вы установили privateKey в своем passportSaml.Strategy, чтобы паспорт-самл мог читать подписи.

person Hendrik Jan    schedule 10.02.2021