web-dev-qa-db-fra.com

SAML/ADFS node.js guide de mise en œuvre?

Je voudrais commencer par dire que, jusqu’à présent, je n’avais même pas entendu PARLER de SAML, et encore moins développé une stratégie SSO le impliquant. Cela, combiné au fait que je fais à peine un nœud depuis un an, en fait un sandwich novice glorieux. Actuellement, j'ai un client qui utilise SAML et ADFS en tant que fournisseur d'authentification unique. J'utilise déjà passport.js pour les connexions locales, alors utiliser passport-saml semble être le moyen idéal pour implémenter le SSO avec SAML/ADFS. En faisant mes recherches, j'ai trouvé plusieurs guides d'implémentation différents, mais comme je ne connais littéralement RIEN de ce processus, je pourrais utiliser quelques indications. 

Dans la documentation passport-saml, j'ai trouvé ce qui suit pour une stratégie qui fonctionnait avec ADFS (d'après la documentation):

{
  entryPoint: 'https://ad.example.net/adfs/ls/',
  issuer: 'https://your-app.example.net/login/callback',
  callbackUrl: 'https://your-app.example.net/login/callback',
  cert: 'MIICizCCAfQCCQCY8tKaMc0BMjANBgkqh ... W==',
  identifierFormat: null
}

Je suppose que ma principale question est d’où provient ce certificat? Est-ce un certificat que je génère sur mon serveur via SSL? Le fournisseur le fournit-il?

Dans ma recherche, j'ai également trouvé ceci: https://github.com/auth0/passport-wsfed-saml2 , basé sur passport-saml. La configuration suivante est suggérée pour ADFS:

{
  path: '/login/callback',
  realm: 'urn:node:app',
  homeRealm: '', // optionally specify an identity provider 
  identityProviderUrl: 'https://auth10-dev.accesscontrol.windows.net/v2/wsfederation',
  cert: 'MIIDFjCCAf6gAwIBAgIQDRRprj9lv5 ... ='
}

Dans cet exemple, l'objet chemin est évident et mon fournisseur m'a déjà fourni une URL fournisseur. Mais le royaume n’a aucun sens pour moi, et c’est là encore ce sacré cert.

Est-ce que quelqu'un pourrait me fournir un moyen "d'impliquer comme je suis cinq" d'implémenter l'authentification unique SAML/ADFS dans un site node.js? Ou aidez-moi à comprendre clairement les objets d'argument demandés par les deux solutions que j'ai décrites? Très apprécié d'avance!

39
SpacePope

J'ai récemment suivi le même processus de pensée: n'ayant jamais entendu parler de SAML, je devais permettre à une application Web de s'authentifier via SAML avec OneLogin en tant que fournisseur d'identité (au lieu d'Active Directory). 

Au cours de la mise en œuvre, j'ai beaucoup utilisé la documentation de OneLogin et la bibliothèque passport-saml, que je recommande tous les deux, même si je ne suis pas affilié non plus.

Ce que j’ai compris, c’est que la confusion était triple: 

(1) comment fonctionne SAML, 

(2) comment fonctionne la bibliothèque passport-saml dans Node, et 

(3) comment configurer le fournisseur d'identité (OneLogin, Active Directory ou autre). Ce qui suit est ma tentative d'explication du type "expliquer comme je suis cinq".

SAML

Le langage SAML (Security Assertion Markup Language) est une norme XML qui permet aux utilisateurs de se connecter en fonction de leur session de navigateur. Il y a beaucoup à faire, mais en gros, cela permet un processus d'authentification plus simple. Un utilisateur peut cliquer sur un bouton plutôt que de soumettre un formulaire avec un nom d'utilisateur et un mot de passe.

Le fonctionnement de SAML est un peu plus complexe. J'ai trouvé cette vue d'ensemble de OneLogin et le diagramme qui l'accompagne utile:

SAML SSO flow, OneLogin.com

Le diagramme représente le processus suivant:

  1. L'utilisateur clique sur un bouton pour s'authentifier pour une application donnée (parfois appelée fournisseur de services) à l'aide de SAML. Une demande est faite (au noeud ou autrement) pour générer une demande d'autorisation SAML.
  2. Une demande d'autorisation est construite. Cette demande d'autorisation est XML ( voir plus sur OneLogin ), codée et/ou cryptée et ajoutée à une URL en tant que paramètre de requête. Le noeud redirige le navigateur vers cette URL (quelque chose comme https://domain.onelogin.com/trust/saml2/http-post/sso/123456?SAMLRequest=...encodedXML .. .).
  3. OneLogin, en tant que fournisseur d'identité, détermine à partir de la session de navigation si l'utilisateur est déjà connecté. Sinon, l'utilisateur est invité à utiliser le formulaire de connexion de OneLogin. Si tel est le cas, le navigateur POST une réponse SAML à l'application (fournisseur de services). Cette réponse SAML (à nouveau XML) inclut certaines propriétés relatives à l'utilisateur, telles que NameID.
  4. De retour dans le nœud, l'application vérifie la réponse SAML et complète l'authentification.

Node et passport-saml

Passport.js est un middleware d'authentification pour Node. Cela nécessite une stratégie, qui pourrait être quelque chose comme passport-local ou, dans notre cas, passport-saml

Comme la stratégie passport-local permet l'authentification Passport à l'aide du nom d'utilisateur/mot de passe, la stratégie passport-saml permet l'authentification Passport à l'aide de la session du navigateur et des valeurs de fournisseur d'identité configurables.

Bien que passport-saml ait vraiment bien servi mes objectifs, ses documents étaient difficiles à raisonner. L'exemple de configuration ne fonctionne pas car le fournisseur d'identité OpenIdp est inactif et il y a beaucoup de paramètres configurables. 

Le principal qui me tenait à cœur: entryPoint et path (ou callbackURL). Je n'avais besoin que de ces deux, qui font ce qui suit:

  • entryPoint est l'URL à rediriger avec la demande d'autorisation (voir n ° 2 ci-dessus).
  • pathcallbackURL définir l'URL/route dans Node pour que la réponse SAML soit POSTÉE à (voir N ° 3 ci-dessus).

Il existe une multitude d'autres paramètres importants et utiles, mais il est possible de configurer l'authentification unique SAML à l'aide de ces deux éléments seulement.

_/Configuration du fournisseur d'identité

Enfin, le fournisseur d'identité lui-même doit être configuré pour que, dans le cas d'une demande d'autorisation SAML, il sache où envoyer la réponse SAML. Dans le cas de OneLogin, cela signifie que vous définissez une ACS (Consumer) URL et une ACS (Consumer) URL Validator, qui doivent correspondre à la pathcallbackURL configurée pour passport-saml.

D'autres éléments peuvent être configurés (pour prendre en charge la déconnexion et d'autres fonctionnalités), mais il s'agit du strict minimum pour s'authentifier.


_/ Résumé

La question initiale comportait deux parties: (1) la mise en œuvre de l'intégration SAML/ADFS et (2) le guide de mise en œuvre SAML node.js de haut niveau. Cette réponse s'adresse à la seconde.

En ce qui concerne l'intégration spécifique à Active Directory, je recommande _ { les documents de passport-saml sur ADFS }, _ _, en gardant à l'esprit qu'il y a deux étapes: configuration de passport-saml pour utiliser un fournisseur d'identité ADFS ET configurer votre serveur ADFS pour qu'il réponde Nœud.

75

Je peux me tromper ici, mais je crois que cela vient des serveurs XML ADFS trouvés à https://servername/FederationMetadata/2007-06/FederationMetadata.xml.

Sortez le X509Certificate. J'ai les mêmes problèmes et je vais l'essayer ensuite.

0
akanieski

En ce qui concerne la première partie de votre question, le certificat provient du fournisseur. Veuillez consulter la documentation passport-saml .

Extrayez simplement le certificat de signature publique du fournisseur d'identité (X.509) et assurez-vous de le formater au codage PEM. Le certificat codé PEM correctement formaté commence par -----BEGIN CERTIFICATE----- et se termine par -----END CERTIFICATE-----.

0
PhiNessa