2009-10-23 13 views
6

Ich entwerfe einen RESTful Web Service (JBoss + RESTeasy). Der UI-Programmierer schreibt eine Ajax-Webanwendung, die ihn verwenden wird. Die Web-App wird eine HTML-Seite sein, auf der alles in JavaScript ausgeführt wird. Aus Sicherheitsgründen erfolgt der gesamte Datenverkehr über SSL.Ajax Authentifizierung ohne Browser Popup-Login-Dialog

Derzeit verwende ich die Standardauthentifizierung. Der UI-Programmierer kann einen Dialog anzeigen, um einen Benutzernamen und ein Passwort zu erhalten und "Autorisierung: Basic xxxxx" in die Kopfzeile eingeben. Leider, wenn das Passwort falsch ist, erscheint das hässliche Browser Login-Dialogfeld. Außerdem kann sich der Benutzer nicht abmelden. Das ist inakzeptabel.

Es scheint keine Möglichkeit zu geben, eine 401 Antwort auf eine XMLHttpRequest in einem der Browser abzufangen, die wir verwenden werden.

Formularbasierte Authentifizierung funktioniert nicht für uns. Wir benötigen eine automatische Abmeldung nach einem gewissen Zeitraum der Inaktivität (das Äquivalent eines Sitzungszeitlimits). Wir können nicht zulassen, dass der Server plötzlich eine Anmeldeseite zurückgibt, wenn der Client ein JSON-Objekt erwartet.

JBoss bietet vier Authentifizierungsstrategien: BASIC, FORM, CLIENT-CERT und DIGEST. Ich denke, DIGEST hat das gleiche Problem wie BASIC. Keines der vier ist was wir wollen.

Diese Webanwendung wird (vorerst) der einzige Client sein, daher ist keine Verwendung von BASIC erforderlich. Gibt es eine andere Authentifizierungsstrategie, die ich installieren kann? Zum Beispiel gibt es eine Implementierung von WSSE UsernameToken, die ich verwenden kann? (Wie in Kapitel 8 des Buches O'Reilly RESTful Web Services beschrieben.) Der Server würde "WSSE" anstelle von "Basic" im WWW-Authenticate-Header senden und vermutlich würde der Browser ihn ignorieren und direkt weiterleiten.

Ich möchte Sicherheit dort konfigurieren, wo sie hingehört - in den JBoss-Konfigurationsdateien, nicht in meinem RESTful Web Service - also suche ich nach einer Implementierung, die ich einfach in JBoss einbinden kann.

Antwort

7

Der Browser zeigt das Kennwortdialogfeld nicht an, wenn es das Authentifizierungsschema im WWW-Authenticate-Header nicht erkennt. Ihre beste Wette könnte sein, weiterhin Basic Auth auf dem Server zu verwenden, während Sie den Header für 401-Antworten manuell auf "Basic/MyApp" setzen.

+0

Die Authentifizierung wird durchgeführt, bevor die Anforderung den Webdienst erreicht. Kann ich damit umgehen, indem ich einen Filter schreibe, der vor dem Sicherheitsframework sitzt? Dann könnte ich dem Webprogrammierer sagen, dass er der ersten Anfrage einen Header "Authorization: Basic/MyApp" hinzufügen soll. Der Filter könnte es dann als "Authorization: Basic" umschreiben und den Header "WWW-Authenticate: Basic" in der Antwort als "WWW-Authenticate: Basic/MyApp" umschreiben. Alle anderen Clients können die normale Standardauthentifizierung verwenden. Ob das funktioniert? Ich denke es könnte. –

+0

Hmm ... Ich nahm an, dass Sie die Kontrolle über die Authentifizierung auf der Skript-Ebene auf dem Server hatten, und der Header würde gesetzt werden, nachdem die Authentifizierung behandelt wurde, aber bevor Sie eine Antwort zurückgaben. Ich kenne JBoss nicht sehr gut, aber wenn Sie Anfragen filtern und neu schreiben können, bevor die Authentifizierung stattfindet, klingt das nach Ihrer besten Lösung. Durch das Festlegen des Autorisierungsheaders in der Web App sind normale Clients nicht betroffen. Nett. –

+0

Wie sich herausstellt, können Sie keinen Vor-Login-Filter haben. Der WebLogic-Server erlaubt dies, aber der Standard lässt dies nicht zu und JBoss und Tomcat erlauben dies nicht. Es sieht so aus, als würde ich mit JAAS herumspielen müssen, um das zu tun. –

Verwandte Themen