#node.js #saml #passport-saml
#node.js #saml #паспорт-saml
Вопрос:
Я пытаюсь использовать passport-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:
- Добавьте AuthnRequestsSigned=»false» и WantAssertionsSigned=»true» в тег SPSSODescriptor
- Измените KeyDescriptor на использование «signing» вместо «encryption» и удалите теги EncryptionMethod
- Используйте привязки 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>
Есть ли способ настроить passport для генерации вышеуказанных метаданных? Или я должен просто создать это вручную? Любая помощь или совет были бы весьма признательны!
Комментарии:
1. Вы нашли решение?
Ответ №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
, чтобы passport-saml мог считывать подписи.