Ich muss eine Autorisierungsanfrage mit der Basisauthentifizierung senden. Ich habe dies erfolgreich mit jquery implementiert. Wenn ich jedoch einen 401-Fehler erhalte, wird das Popup-Fenster für den grundlegenden Authentifizierungsbrowser geöffnet und der Rückruf von jquery ajax-Fehlern wird nicht aufgerufen.
javascript
jquery
rest
basic-authentication
Alexey Zakharov
quelle
quelle
Antworten:
Ich war kürzlich auch mit diesem Problem konfrontiert. Da Sie das Standardverhalten des Browsers beim Anzeigen des Popups im Falle einer
401
( Basis- oder Digest- Authentifizierung) nicht ändern können , gibt es zwei Möglichkeiten, dies zu beheben:401
. Geben Sie200
stattdessen einen Code zurück und behandeln Sie diesen in Ihrem jQuery-Client.Ändern Sie die Methode, die Sie für die Autorisierung verwenden, in einen benutzerdefinierten Wert in Ihrer Kopfzeile. Browser zeigen das Popup für Basic und Digest an . Sie müssen dies sowohl auf dem Client als auch auf dem Server ändern.
Bitte nehmen Sie auch einen Blick auf diese für ein Beispiel mit jQuery mit Basic - Auth.
quelle
<security:http-basic/>
nicht definieren müssen,basicAuthenticationFilter
sondern es definieren sollten als<security:http-basic entry-point-ref="myBasicAuthenticationEntryPoint"/>
.401
WWW-Authenticate:Bearer WWW-Authenticate:NTLM WWW-Authenticate:Negotiate
Geben Sie einen generischen 400-Statuscode zurück und verarbeiten Sie diesen dann clientseitig.
Oder Sie können den 401 behalten und nicht den WWW-Authenticate-Header zurückgeben, auf den der Browser mit dem Authentifizierungs-Popup reagiert. Wenn der WWW-Authenticate-Header fehlt, fordert der Browser keine Anmeldeinformationen an.
quelle
res.removeHeader('www-authenticate'); // prevents browser from popping up a basic auth window.
Sie können das grundlegende Authentifizierungs-Popup mit einer Anforderungs-URL wie folgt unterdrücken:
Wenn Sie einen 401-Fehler (falscher Benutzername oder falsches Passwort) erhalten, wird dieser mit dem Rückruf eines jquery-Fehlers korrekt behandelt. Es kann einige Sicherheitsprobleme verursachen (im Fall des http-Protokolls anstelle von https), aber es funktioniert.
UPD: Diese Lösungsunterstützung wird in Chrome 59 entfernt
quelle
https://user:pass@host/
in M59, um Juni 2017 einstellen. Weitere Informationen finden Sie in diesem Chromestatus-Blogbeitrag .Wie andere bereits betont haben, besteht die einzige Möglichkeit, das Verhalten des Browsers zu ändern, darin, sicherzustellen, dass die Antwort entweder keinen 401-Statuscode enthält oder, falls dies der Fall ist, den
WWW-Authenticate: Basic
Header nicht enthält . Da das Ändern des Statuscodes nicht sehr semantisch und unerwünscht ist, besteht ein guter Ansatz darin, denWWW-Authenticate
Header zu entfernen . Wenn Sie Ihre Webserveranwendung nicht ändern können oder möchten, können Sie sie jederzeit über Apache bereitstellen oder als Proxy verwenden (wenn Sie Apache noch nicht verwenden).Hier ist eine Konfiguration für Apache, um die Antwort neu zu schreiben, um den WWW-Authenticate-Header zu entfernen. IFF, den die Anforderung enthält, enthält den Header
X-Requested-With: XMLHttpRequest
(der standardmäßig von wichtigen Javascript-Frameworks wie JQuery / AngularJS usw. festgelegt wird) UND die Antwort enthält den HeaderWWW-Authenticate: Basic
.Getestet auf Apache 2.4 (nicht sicher, ob es mit 2.2 funktioniert). Dies hängt davon ab, welches
mod_headers
Modul installiert wird. (Unter Debian / Ubuntusudo a2enmod headers
und Apache neu starten)quelle
proxy_hide_header WWW-Authenticate;
Verwenden Sie X-Requested-With: XMLHttpRequest mit Ihrem Anforderungsheader. Der Antwortheader enthält also nicht WWW-Authenticate: Basic.
quelle
Wenn Sie einen IIS-Server verwenden, können Sie IIS URL Rewriting (v2) einrichten, um den
WWW-Authentication
HeaderNone
auf die angeforderte URL umzuschreiben .Leitfaden hier .
Der Wert, den Sie ändern möchten, ist
response_www_authenticate
.Wenn Sie weitere Informationen benötigen, fügen Sie einen Kommentar hinzu und ich werde die Datei web.config veröffentlichen.
quelle
Wenn der WWW-Authenticate-Header entfernt wird, werden die Anmeldeinformationen nicht zwischengespeichert und der Autorisierungsheader wird nicht angefordert. Das bedeutet, dass Sie jetzt die Anmeldeinformationen für jede neue Anforderung eingeben müssen, die Sie generieren.
quelle
Wenn Sie Ihre Serverantwort anpassen können, können Sie alternativ eine 403 Forbidden zurückgeben.
Der Browser öffnet das Authentifizierungs-Popup nicht und der jquery-Rückruf wird aufgerufen.
quelle
In Safari können Sie synchrone Anforderungen verwenden, um zu vermeiden, dass der Browser das Popup anzeigt. Natürlich sollten synchrone Anforderungen in diesem Fall nur zum Überprüfen der Benutzeranmeldeinformationen verwendet werden. Sie können eine solche Anforderung verwenden, bevor Sie die eigentliche Anforderung senden. Dies kann zu einer schlechten Benutzererfahrung führen, wenn der Inhalt (gesendet oder empfangen) sehr umfangreich ist.
quelle
Erstellen Sie eine / login-URL, und akzeptieren Sie dann die Parameter "Benutzer" und "Passwort" über GET. Sie benötigen keine grundlegende Authentifizierung. Verwenden Sie hier PHP, Node, Java, was auch immer und analysieren Sie Ihre passwd-Datei und stimmen Sie die Parameter (Benutzer / Pass) damit ab. Wenn eine Übereinstimmung vorliegt, leiten Sie sie an http: // user: [email protected]/ weiter (dies setzt die Anmeldeinformationen in Ihrem Browser fest). Wenn nicht, senden Sie eine 401-Antwort (ohne WWW-Authenticate-Header).
quelle
Von der Rückseite mit Spring Boot habe ich benutzerdefinierten BasicAuthenticationEntryPoint verwendet:
quelle