Null-Client in OAuth2-Multi-Faktor-Authentifizierung

8

Der vollständige Code für eine Spring OAuth2-Implementierung der Multi-Faktor-Authentifizierung wurde auf eine Dateifreigabesite hochgeladen, die Sie herunterladen können, indem Sie auf diesen Link klicken . In den folgenden Anweisungen wird erläutert, wie Sie den Link verwenden, um das aktuelle Problem auf einem Computer neu zu erstellen. Eine 500-Punkte-Prämie wird angeboten.

DER AKTUELLE FEHLER:

Wenn ein Benutzer versucht, sich mithilfe der Zwei-Faktor-Authentifizierung in der Spring Boot OAuth2-App über den Link im vorherigen Absatz . Der Fehler wird an dem Punkt ausgelöst, an dem die App eine zweite Seite bereitstellen soll, in der der Benutzer nach einem PIN-Code gefragt wird, um die Identität des Benutzers zu bestätigen.

Da ein Null-Client diesen Fehler auslöst, scheint das Problem darin zu bestehen, in Spring Boot OAuth2 eine ClientDetailsService mit einer Custom OAuth2RequestFactory zu verbinden.

Das vollständige Debug-Protokoll kann auf einer Dateifreigabeseite durch Klicken auf diesen Link gelesen werden. Die vollständige Stack-Ablaufverfolgung in den Protokollen enthält nur einen Verweis auf Code, der sich tatsächlich in der App befindet, und diese Codezeile lautet:

%Vor%

Der Fehler in den Debug-Protokollen lautet:

%Vor%

KONTROLLFLUSS WENN FEHLER ANGEWORFEN IST:

Ich habe das folgende Flussdiagramm erstellt, um den beabsichtigten Ablauf von Multi-Faktor-Authentifizierungsanforderungen in @ James 'vorgeschlagene Implementierung :

Im vorherigen Flussdiagramm wird der aktuelle Fehler zwischen dem Benutzername & amp; Password View und die Schritte GET / secure / two_factor_authenticated .

Die Lösung für dieses OP beschränkt sich auf den ERSTEN PASS, der 1.) durch den Endpunkt /oauth/authorize und dann 2.) über /oauth/authorize auf den Endpunkt TwoFactorAuthenticationController zurückkehrt.

Wir wollen also einfach NoSuchClientException auflösen und gleichzeitig zeigen, dass dem Client ROLE_TWO_FACTOR_AUTHENTICATED in POST /secure/two_factor_authenticated erfolgreich gewährt wurde. Da es sich bei den nachfolgenden Schritten um eine Boiler-Plate handelt, ist es akzeptabel, dass der Flow nachweislich den Eintrag SECOND PASS in CustomOAuth2RequestFactory unterbricht, solange der Benutzer den SECOND PASS stark> mit allen Artefakten, die den FIRST PASS erfolgreich bestanden haben. Der SECOND PASS kann eine separate Frage sein, solange wir den FIRST PASS hier erfolgreich lösen.

RELEVANTE CODE-AUSZEICHNUNGEN:

Hier ist der Code für AuthorizationServerConfigurerAdapter , wo ich versuche die Verbindung aufzubauen:

%Vor%

Hier ist der Code für TwoFactorAuthenticationFilter , der den Code enthält, der den Fehler auslöst:

%Vor%

ERSTELLEN DES PROBLEMS AUF IHREM COMPUTER:

Sie können das Problem auf jedem Computer in nur wenigen Minuten neu erstellen, indem Sie die folgenden einfachen Schritte ausführen:

1.) Laden Sie die gezippte Version der App von einer Dateifreigabeseite herunter, indem Sie auf diesen Link klicken .

2.) Entpacken Sie die App, indem Sie Folgendes eingeben: tar -zxvf oauth2.tar(1).gz

3.) Starten Sie die authserver App, indem Sie zu oauth2/authserver navigieren und dann mvn spring-boot:run eingeben.

4.) Starten Sie die resource App, indem Sie zu oauth2/resource navigieren und dann mvn spring-boot:run

eingeben

5.) Starten Sie die App ui , indem Sie zu oauth2/ui navigieren und dann mvn spring-boot:run

eingeben

6.) Öffnen Sie einen Webbrowser und navigieren Sie zu http : // localhost : 8080

7.) Klicken Sie auf Login und geben Sie dann Frodo als Benutzer und MyRing als Passwort ein und klicken Sie zum Absenden auf. Dies löst den oben gezeigten Fehler aus.

Sie können den vollständigen Quellcode folgendermaßen anzeigen:

a.) Importieren der Maven-Projekte in Ihre IDE oder durch

b.) Navigieren in den entpackten Verzeichnissen und Öffnen mit einem Texteditor.

Hinweis: Der Code im obigen Link zum Teilen von Dateien ist eine Kombination aus das Spring Boot OAuth2 GitHub-Beispiel unter diesem Link und das Vorschläge für die 2-Faktor-Authentifizierung von @James unter diesem Link . Die einzigen Änderungen am Spring Boot GitHub-Beispiel wurden in der App authserver vorgenommen, speziell in authserver/src/main/java und in authserver/src/main/resources/templates .

DAS PROBLEM BEEINFLUSSEN:

Per @ AbrahamGrief's Vorschlag, ich habe eine FilterConfigurationBean hinzugefügt, die NoSuchClientException aufgelöst hat. Aber das OP fragt, wie man den FIRST PASS durch den Kontrollfluss im Diagramm für ein 500 Punkte-Bounty vervollständigt.

Ich habe dann das Problem eingegrenzt, indem ich ROLE_TWO_FACTOR_AUTHENTICATION_ENABLED in Users.loadUserByUername() wie folgt eingestellt habe:

%Vor%

Dadurch müssen keine Clients und Ressourcen mehr konfiguriert werden, sodass das aktuelle Problem weiterhin eng ist. Der nächste Roadblock ist jedoch, dass Spring Security die Anfrage des Benutzers für /security/two_factor_authentication ablehnt. Welche weiteren Änderungen müssen vorgenommen werden, um den ERSTEN DURCHLAUF durch den Kontrollfluss zu vervollständigen, so dass das POST /secure/two_factor_authentication SYSO ROLE_TWO_FACTOR_AUTHENTICATED ?

kann     
CodeMed 27.04.2016, 19:38
quelle

1 Antwort

3

Es gibt eine Menge von Modifikationen, die für das Projekt benötigt werden, um den beschriebenen Ablauf zu implementieren, mehr als für eine einzelne Frage. Diese Antwort konzentriert sich ausschließlich auf die Lösung:

  

org.springframework.security.oauth2.provider.NoSuchClientException: Nein   Client mit der angeforderten ID: null

beim Versuch, eine SecurityWebApplicationInitializer - und eine Filter -Bohne zu verwenden, während sie auf einem Spring Boot-Autorisierungsserver ausgeführt werden.

Der Grund für diese Ausnahme ist, dass WebApplicationInitializer -Instanzen nicht sind Lauf durch Spring Boot . Dazu gehören alle AbstractSecurityWebApplicationInitializer -Unterklassen, die in einer WAR-Datei funktionieren würden, die in einem eigenständigen Servlet-Container bereitgestellt wird. Was also passiert ist Spring Boot erstellt Ihren Filter wegen der @Bean Annotation, ignoriert Ihre AbstractSecurityWebApplicationInitializer und wendet Ihren Filter auf alle URLs an. In der Zwischenzeit möchten Sie nur, dass Ihr Filter auf die URLs angewendet wird, die Sie an addMappingForUrlPatterns weitergeben möchten.

Um stattdessen einen Servlet-Filter auf bestimmte URLs im Spring Boot anzuwenden, sollten Sie ein FilterConfigurationBean definieren . Für den in der Frage beschriebenen Ablauf, der versucht, eine benutzerdefinierte TwoFactorAuthenticationFilter auf /oauth/authorize anzuwenden, sieht das folgendermaßen aus:

%Vor%     
heenenee 04.05.2016, 05:10
quelle