Multi-Faktor-Authentifizierung für Mendix

Inhaltsübersicht

Da Emixa großen Wert auf die Erstellung hochwertiger und sicherer Anwendungen legt, implementieren wir derzeit aktiv die Zwei-Faktor-Authentifizierung (2FA) für mehrere Clients. Normalerweise wird dies mit den verfügbaren Mendix Modulen aus dem Mendix Marketplace durchgeführt.Das Emixa Team ist jedochder Meinung, dass eine bessere und sicherere Lösung entwickelt werden kann. Daher hat das Team vor kurzem ein verbessertes Standardmodul während eines der Emixa F&E-Tage entwickelt und es der gesamten globalen Mendix Community zur Verfügung gestellt.

Das Modul unterstützt alle Varianten der zweistufigen Verifizierung: SMS, E-Mail und die sicherste Methode, eine Authentifizierungs-App. Apps wie 1Password, LastPass, Authy, Google und Microsoft können einen Anmeldecode generieren, der nach der Anmeldung mit einem Benutzernamen und Passwort eingegeben werden muss. Unser Ziel ist es, dass dies der neue Standard für die zweistufige Verifizierung in der Mendix Welt wird und die Sicherheit von Anwendungen weltweit erhöht. Unser CTO, Pim van der Noll, hat einen Blog darüber geschrieben:

Was ist Multi-Faktor-Authentifizierung?

Multi-Faktor-Authentifizierung oderMFA ( auch bekannt alsZwei-Faktor-Authentifizierung oder 2FA, zusammen mit ähnlichen Begriffen) ist eine elektronische Authentifizierungsmethode, bei der ein Benutzer nur dann Zugang zu einer Website oder Anwendung erhält, wenn er einem Authentifizierungsmechanismus wie z. B. zwei oder mehr Beweise (oder Faktoren) vorlegen kann:

  • Wissen: etwas, das nur der Benutzerweiß.
  • Besitz: etwas, das nur der Benutzerhat.
  • Inhärenz: etwas, das der Benutzerist.

MFA schützt den Nutzer davor, dass eine unbekannte Person versucht, auf seine Daten wie z. B. persönliche Ausweisdaten oder finanzielle Vermögenswerte zuzugreifen.

"Eine Authentifizierungs-App eines Drittanbieters (TPA) ermöglicht die Zwei-Faktor-Authentifizierung, indem sie in der Regel einen zufällig generierten und ständig aktualisierten Code anzeigt, der für die Authentifizierung zu verwenden ist" - Wikipedia

Welches Problem löst unsere Lösung?

Die verfügbaren Multi-Faktor-Implementierungen im Marketplace bieten dem Endbenutzer einer Mendix Anwendung während des Anmeldevorgangs an, den Code aus einer SMS, E-Mail oder von einem Authentifikator (Google) generiert, nach der eigentlichen Anmeldung (und Erstellung der Benutzersitzung) einzugeben. Siehe das Diagramm unten:

https://swimlanes.io/d/zEPQlLV3T

Bei einer erfolgreichen Anmeldung und vor der Eingabe eines MFA-Codes hat der Benutzer bereits eine gültige Benutzersitzung und Zugriff auf die autorisierten Seiten, Mikroflüsse usw. des Benutzers (aber Sie können sie weder sehen noch einfach darauf zugreifen). Dieser Ansatz funktioniert nur bei dynamischer Rollenzuweisung und nach Eingabe eines gültigen MFA-Codes (was in Mendix nicht standardmäßig der Fall ist).

Was ist die Lösung?

Wir haben ein MFA-Modul entwickelt, das die Mendix LoginAction erweitert, diehier dokumentiert ist.

Der MFA-Code wird zuerst validiert, und erst dann erstellt das Modul eine Benutzersitzung, die den Zugriff auf Seiten und Mikroabläufe ermöglicht.

Wie haben wir sichergestellt, dass das Modul sicher ist?

Wir haben verschiedene Szenarien behandelt, darunter die Standardanmeldung, die Anmeldung über Widgets, die Anmeldung für Webservice- und REST-Konten sowie die benutzerdefinierte Anmeldung mit aktivierter MFA. Wir haben die Sicherheit und Benutzerfreundlichkeit des Moduls in Mendix Anwendungen validiert.

https://swimlanes.io/u/4o7jaAOjY

Zu dem Zeitpunkt nach der Anmeldung im ersten Schritt:

mx.data.get({ xpath:"//System.User", callback:function(data){console.log(data);} })

Es gibt immer noch das anonyme User-Objekt zurück, wie unten gezeigt:

Wie haben wir bewiesen, dass dieses Modul sicher ist?

Zu behandelnde Szenarien:

  • Standardanmeldung über login.html für Konten mit deaktivierter MFA.
  • Standardanmeldung über Widgets für Konten mit deaktivierter MFA.
  • Standardanmeldung für Webservice- und REST-Konten.
  • Anmeldung über eine angepasste login.html mit aktivierter MFA (nur login-with-mfa.html + login-mfa.js + Authenticator-App-Code. Nicht kompatibel mit dem per SMS oder E-Mail gesendeten Code).
  • Anmeldung über Standard-Widgets, aber erweitert um die Möglichkeit, bei aktivierter MFA einen MFA-Code einzugeben.

Wie einfach ist die Verwendung dieses Moduls in Ihrer Mendix Anwendung?

Laden Sie das Modul vom Mendix Marketplacehier oder vonGithub herunter.

Es gibt ein paar Dinge zu konfigurieren:

Nach dem Start der Konfiguration:
1. Fügen SieASU_MFA Microflow in Ihrer Nach dem Start Konfiguration hinzu.

2. Ändern Sie SUB_MFA_UserDisabledCheck, um Ihre Logik aufzurufen, um festzustellen, ob der angemeldete Benutzer eine Multi-Faktor-Authentifizierung benötigt. Fügen Sie die neuen Attribute HasMFAenabled(Boolean) und LastLogin2FA (DateTime) zur Entität Account hinzu.

3. Fügen Sie Ihre Methode(n) der Multi-Faktor-Authentifizierung inSUB_ValidateMFAforUser hinzu:

Drei Muster verfügbar:

Google Authenticator-Anschluss

SMS

E-Mail-Verifizierung mit Code zur Verifizierung

  • SUB_InformMFACodeForUserändern, um die E-Mail zu senden
  • Verwenden Sie z. B. das Standardmodul Emailtemplate oder die Sendgrid-API, um diese E-Mail an Ihren Benutzer zu verfassen.

4. Fügen Sie das SnippetSN_MFA_LoginPage zu Ihrer Anmeldeseite hinzu

5. Verschieben Sie ggf. die Dateien login-with-mfa.html und js/login-mfa.js aus dem Verzeichnis resources in Ihr Theme-Verzeichnis, um Login-Aktionen mit MFA von diesen Seiten aus zu unterstützen.

6. Setzen Sie die KonstanteEnabledMFA auf true, um loszulegen!

Denken Sie daran, wenn Sie das Modul in Zukunft über den Appstore aktualisieren:

Dadurch wird der Anmeldemechanismus unterbrochen, aber Sie werden benachrichtigt, weil standardmäßig eine Ausnahme ausgelöst wird, wenn das Modul nicht (korrekt) mit Ihrer eigenen MFA-Logik konfiguriert ist. Etwa so: "Ein Fehler ist bei der Bearbeitung der Anfrage aufgetreten: java.lang.Exception: Create code not yet implemented".

Was wir gelernt haben

Wir bevorzugten einen nicht-persistenten Ansatz, um die Anmeldeschritte des anonymen Benutzers zu verfolgen (erster mit Login, zweiter mit MFA-Code). Wir fanden heraus, dass, wenn der erste Versuch erfolgreich validiert wurde, im zweiten Schritt, wenn der MFA-Code übergeben wurde, der Kontext/die Beziehung zur vorherigen anonymen Sitzung gelöscht wurde. Daher konnten wir dies nicht mit dem ersten Schritt in Verbindung bringen. Wenn wir eine dauerhafte MFA-Entität verwenden (und das MFA-Objekt nach dem ersten Anmeldeschritt übergeben), funktioniert es.

Fortgeschrittene: Java-Herausforderungen:

Als wir die Klasse Login Action erweiterten und versuchten, Parameter aus dieser Klasse in unserer erweiterten Klasse zu setzen, stellten wir fest, dass dies in Kombination mit der Methode super.execute() nicht möglich war. Wir beschlossen,createSession zu verwenden. Wir haben den Benutzernamen und das Kennwort bereits im ersten Schritt validiert und das MFA-Objekt kann vom anonymen Benutzer nicht geändert/erstellt werden (und wird auch zweimal überprüft).

Wir wollten auch, dass das Modul über eine login.html-Variante und die benutzerdefinierte login-with-mfa.html kompatibel ist. Daher ist es notwendig, den MFA-Code zusammen mit Ihrem Benutzernamen und Passwort zu senden. Wir müssen diesen MFA-Code durch den Header übergeben, da die Nutzlast von der Core LoginAction-Funktionalität entfernt wird.

Anmelden-mit-mfa.html:

Login-mfa.js:

MultiFactorAuthLoginAction.java:

Möchten Sie mehr erfahren?

In der Technologiebranche gibt es zahlreiche Möglichkeiten, den digitalen Wandel voranzutreiben. Möchten Sie die digitale Situation Ihres Unternehmens verbessern? Und suchen Sie einen Partner, der Sie bei der Erreichung dieses Ziels unterstützen kann? Dann ist Emixa der richtige Partner für Sie. Wir übersetzen komplexe Sachverhalte in einfache, benutzerfreundliche IT-Lösungen, die Ihre digitale Transformation beschleunigen und Ihr Unternehmen auf ein höheres Niveau bringen.Zögern Sie nicht, uns zu kontaktieren. Wir würden uns freuen, Sie kennenzulernen!