Die Nginx-Sub-Request-Authentifizierung funktioniert nicht wie erwartet

Die Nginx-Sub-Request-Authentifizierung funktioniert nicht wie erwartet

Ich möchte Zugriffskontrollen für einen ganzen virtuellen Host auf einem Reverse-Proxy hinzufügen. Dazu verwende ich die Nginx-Sub-Request-Authentifizierung. Die erwartete Interaktion besteht darin, dass der Benutzer entweder eine Fehlermeldung mit einem Link zur Anmeldeseite erhält oder die Anmeldeseite unter der angeforderten URL angezeigt bekommt. Nach Abschluss des Anmeldevorgangs sollte es einen Mechanismus geben, mit dem der Benutzer zur ursprünglich angeforderten URL navigieren bzw. diese neu laden kann. Auf dem Reverse-Proxy selbst gibt es keine Skriptfunktion (also kein PHP), was die Optionen zum Erfassen und Weitergeben der ursprünglichen URL durch den Authentifizierungsprozess einschränkt.

Meine Erwartung: Wenn die Authentifizierung der Anfrage fehlschlägt (d. h.http://authprovider.example.com:8081/gateway/index.phpgibt eine 401 zurück) Ich möchte, dass an die angeforderte URL bestimmter Inhalt ohne Weiterleitung und mit einem 4xx-Status zurückgegeben wird.

server {
    listen 80;
    server_name www.example.com;
    root /var/www/html;

    error_page 401 iprestricted.html;
    ## This provides feedback to the user when request is disallowed
    ## (including a link to login)
    # location /iprestricted.html {
    #       try_files $uri $uri/ =404;
    # }

    # This implements the sub-request check....
    location /restricted {
            internal;
            proxy_pass http://authprovider.example.com:8081/gateway/index.php ;
            proxy_pass_request_body off;
            proxy_set_header Content-Length "";
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Original-URI $request_uri;
    }
    location / {
            auth_request /restricted;
            proxy_pass http://localwebserver/;
    }
}

Jedoch:

Wenn location /iprestricted.html{...}auskommentiert ist, erhalte ich eine Umleitungsschleife beihttp://www.example.com

Wenn es nicht kommentiert ist, erhalten alle Anfragen eine 302-Antwort mit dem Standort /iprestricted.html, die einen Statuscode 200 zurückgibt

Wie implementiere ich eine Unteranforderungsauthentifizierung ohne Weiterleitungen?

Gibt es eine andere Möglichkeit, die ursprüngliche URL zu erfassen und diese nur mithilfe der Nginx-Konfiguration an den Authentifizierungsschritt weiterzuleiten?

Ich habe versucht, add_header WWW-Authenticate "Basic realm=bipdevtest";die beiden oben genannten Standorte hinzuzufügen, aber dies wurde nicht in den HTTP-Antworten zurückgesendet.

Antwort1

Es ist immer eine gute Idee,RTFM

Nginx wird einen WWW-Authenticate-Header weiterleiten, wenn dieser vom auth_request-Provider zurückgegeben wird (http://authprovider.example.com:8081/gateway/index.phpin obigem).

Ich werde die Frage jedoch offen lassen, da ich verwirrt/besorgt darüber bin, dass die benutzerdefinierte Fehlerseite zu einer 302-Weiterleitung gefolgt von einer 200-Antwort führt.

verwandte Informationen