it-swarm.com.de

SAML/ADFS node.js Implementierungshandbuch?

Ich möchte dem vorausgehen, dass ich bisher noch nicht einmal HEARD von SAML gehört habe, geschweige denn eine SSO-Strategie entwickelt habe. Das, zusammen mit der Tatsache, dass ich seit einem Jahr kaum Knoten gemacht habe, macht ein herrliches Neuling-Sandwich aus. Derzeit habe ich einen Client, der SAML und ADFS als SSO-Anbieter verwendet. Ich verwende bereits passport.js für lokale Anmeldungen. Daher ist die Verwendung von Passport-Saml der beste Weg, um das SSO mithilfe von SAML/ADFS zu implementieren. Bei meiner Recherche habe ich ein paar verschiedene Implementierungsanleitungen gefunden, aber da ich NOTHING wissentlich über diesen Prozess weiß, könnte ich ein paar Hinweise verwenden. 

In der Pass-saml-Dokumentation habe ich Folgendes für eine Strategie gefunden, die nachweislich mit ADFS funktioniert (gemäß den Dokumenten):

{
  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
}

Ich denke, meine Hauptfrage ist, woher kommt dieses Zertifikat? Ist dies ein Zertifikat, das ich auf meinem Server über SSL generiere? Bietet der Anbieter es an?

Bei meiner Suche habe ich auch Folgendes gefunden: https://github.com/auth0/passport-wsfed-saml2 , das auf Pass-Saml basiert. Die folgende Konfiguration wird für ADFS vorgeschlagen:

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

In diesem Beispiel ist das Pfadobjekt offensichtlich, und mein Provider hat mir bereits eine providerURL angegeben. Aber Realm macht für mich keinen Sinn, und es gibt wieder diesen verdammten Cert.

Könnte mir jemand eine "erklären-wie-ich-fünf" -Methode geben, um SAML/ADFS SSO in einer node.js-Site zu implementieren? Oder helfen Sie mir, aus den Argumenten, die die beiden Lösungen angefordert haben, Köpfe oder Schwänze zu machen? Sehr geschätzt im Voraus!

39
SpacePope

Ich durchlief kürzlich denselben Gedankengang: Nachdem ich noch nie von SAML gehört hatte, musste ich eine Webanwendung für die Authentifizierung über SAML mit OneLogin als Identitätsanbieter (anstelle von Active Directory) aktivieren. 

Während der Implementierung habe ich intensiv die Dokumentation von OneLogin und die passport-saml-Bibliothek verwendet, die ich beide empfehle, obwohl ich mit keinem der beiden Partner verbunden bin.

Mir wurde klar, dass die Verwirrung dreifach war: 

(1) wie SAML funktioniert, 

(2) wie die passport-saml-Bibliothek in Node funktioniert, und 

(3) wie der Identitätsanbieter konfiguriert wird (OneLogin, Active Directory oder anders). Was folgt, ist mein Versuch einer Erklärung "Erklären-wie-Ich-Fünf".

SAML

SAML (Security Assertion Markup Language) ist ein XML-Standard, mit dem sich Benutzer basierend auf ihrer Browsersitzung anmelden können. Es gibt viel, aber im Grunde ermöglicht es einen einfacheren Authentifizierungsprozess. Ein Benutzer kann auf eine Schaltfläche klicken, anstatt ein Formular mit Benutzername und Kennwort zu senden.

Die Funktionsweise von SAML ist etwas komplizierter. Ich fand diese Übersicht von OneLogin und das dazugehörige Diagramm hilfreich:

SAML SSO flow, OneLogin.com

Das Diagramm stellt den folgenden Prozess dar:

  1. Der Benutzer klickt auf eine Schaltfläche, um sich mit SAML für eine bestimmte Anwendung (manchmal auch als Dienstanbieter bezeichnet) zu authentifizieren. Es wird eine Anforderung (an den Knoten oder auf andere Weise) zum Erstellen einer SAML-Autorisierungsanforderung gestellt.
  2. Eine Autorisierungsanfrage wird erstellt. Diese Autorisierungsanforderung ist XML ( weitere Informationen zu OneLogin ), codiert und/oder verschlüsselt und an eine URL als Abfrageparameter angehängt. Der Knoten leitet den Browser an diese URL weiter (z. B. https://domain.onelogin.com/trust/saml2/http-post/sso/123456?SAMLRequest=...encodedXML .. .).
  3. OneLogin bestimmt als Identitätsanbieter anhand der Browsersitzung, ob der Benutzer bereits angemeldet ist. Andernfalls wird der Benutzer mit dem Anmeldeformular von OneLogin aufgefordert. Wenn dies der Fall ist, POSTT der Browser eine SAML-Antwort zurück an die Anwendung (Dienstanbieter). Diese SAML-Antwort (wiederum XML) enthält bestimmte Eigenschaften des Benutzers, z. B. NameID.
  4. Zurück im Knoten überprüft die Anwendung die SAML-Antwort und schließt die Authentifizierung ab.

Knoten und passport-saml

Passport.js ist Authentifizierungs-Middleware für Node. Dies erfordert eine Strategie, die in etwa passport-local oder in unserem Fall passport-saml sein kann. 

Da die Strategie passport-local die Passport-Authentifizierung mit Benutzername/Kennwort aktiviert, aktiviert die Strategie passport-saml die Passport-Authentifizierung mithilfe der Browsersitzung und der Werte für konfigurierbare Identitätsanbieter.

Während passport-saml meinen Zwecken wirklich gute Dienste leistete, waren seine Dokumente schwer zu durchdenken. Das Konfigurationsbeispiel funktioniert nicht, da der OpenIdp-Identitätsanbieter inaktiv ist und lots konfigurierbare Parameter vorhanden sind. 

Der wichtigste, um den ich mich sorgte: entryPoint und path (oder callbackURL). Ich brauchte nur diese beiden, die Folgendes tun:

  • entryPoint ist die URL, zu der mit der Autorisierungsanfrage umgeleitet werden soll (siehe oben, Nr. 2).
  • pathcallbackURL setzt die URL/Route in Node, für die die SAML-Antwort gepostet werden soll (siehe Punkt 3 oben).

Es gibt eine Menge anderer Parameter, die wichtig und wertvoll sind, aber es ist möglich, SAML SSO nur mit diesen beiden zu konfigurieren.

_/Identity Provider Konfiguration

Schließlich muss der Identitätsanbieter selbst so konfiguriert werden, dass er bei einer SAML-Autorisierungsanforderung weiß, wohin die SAML-Antwort gesendet werden soll. Im Falle von OneLogin bedeutet dies, dass ein ACS (Consumer) URL und ein ACS (Consumer) URL Validator gesetzt werden, die beide mit dem für passport-saml konfigurierten pathcallbackURL übereinstimmen sollten.

Andere Dinge können konfiguriert werden (um das Abmelden und andere Funktionen zu unterstützen), aber dies ist das absolute Minimum für die Authentifizierung.


_/ Zusammenfassung

Die ursprüngliche Frage bestand aus zwei Teilen: (1) Implementieren der SAML/ADFS-Integration und (2) High-Level-Implementierungshandbuch für SAML node.js. Diese Antwort richtet sich an die zweite.

Für die spezifische Integration in Active Directory empfehle ich Passport-Samls Docs auf ADFS , wobei zu berücksichtigen ist, dass es zwei Teile gibt: Konfigurieren von Passport-Saml für die Verwendung eines ADFS-Identitätsanbieters UND Konfigurieren Ihres ADFS-Servers, auf den Sie antworten möchten Knoten.

Ich könnte hier falsch liegen, aber ich glaube, dass es von den ADFS-Servern stammt, die bei https://servername/FederationMetadata/2007-06/FederationMetadata.xml gefunden wurden.

Ziehen Sie das X509Zertifikat heraus. Ich habe die gleichen Probleme und werde es als nächstes versuchen.

0
akanieski

Für den ersten Teil Ihrer Frage stammt das Zertifikat vom Anbieter. Bitte sehen Sie sich die Dokumentation passport-saml an.

Ziehen Sie einfach das öffentliche Signaturzertifikat des Identitätsanbieters (X.509) aus und stellen Sie sicher, dass es mit der PEM-Codierung formatiert ist. Das korrekt formatierte PEM-codierte Zertifikat beginnt mit -----BEGIN CERTIFICATE----- und endet mit -----END CERTIFICATE-----.

0
PhiNessa