2009-06-16 3 views
23

Ich bin vage bewusst, dass auf einem Computer mit einer Domäne Internet Explorer aufgefordert werden kann, einige zusätzliche Header senden, die ich verwenden könnte, um automatisch an einer Anwendung anmelden. Ich habe Apache läuft auf einem Windows-Server mit mod_php. Ich möchte vermeiden können, dass sich der Benutzer bei Bedarf einloggen muss. Ich habe einige Links über Kerberos und Apache Module gefunden.Wie kann ich Single Sign-On (SSO) mithilfe von Microsoft AD für eine interne PHP-Anwendung implementieren?

http://www.onlamp.com/pub/a/onlamp/2003/09/11/kerberos.html?page=last https://metacpan.org/pod/Apache2::AuthenNTLM

Da ich auf Windows renne es ist erwiesen, nicht-trivial sein installiert Perl oder Apache-Module zu erhalten. Aber hat PHP nicht schon Zugriff auf HTTP-Header?

Ich fand dies, aber es tut keine Authentifizierung, es zeigt nur, dass PHP die NTLM-Header lesen kann. http://siphon9.net/loune/2007/10/simple-lightweight-ntlm-in-php/

Ich möchte meine Benutzer nur auf die Anwendung zeigen lassen und sie automatisch authentifizieren lassen. Hat irgendjemand irgendwelche Erfahrungen damit gemacht oder es überhaupt zur Arbeit gebracht?

UPDATE Da diese Frage ursprünglich veröffentlichen, haben wir Setups geändert auf Windows nginx und php-fcgi läuft noch. Apache2 und php-cgi unter Windows ist wahrscheinlich eine der langsamsten Setups, die Sie unter Windows konfigurieren können. Es sieht aus, als ob Apache immer noch benötigt wird (es funktioniert mit php-fcgi), aber ich würde eine nginx-Lösung bevorzugen.

Ich verstehe auch immer noch nicht (und wäre gerne informiert), warum HTTP-Server-Plugins notwendig sind und wir keine PHP, Webserver-Agnostic-Lösung haben können.

+0

Ist dies eine interne hinter der Firewall-Anwendung? –

+0

Ja, es ist intern – reconbot

+1

Kann ich noch etwas hinzufügen, um diese Frage zu verbessern? – reconbot

Antwort

16

Alles, was Sie brauchen, ist das mod_auth_sspi Apache-Modul.

Beispielkonfiguration:

AuthType SSPI 
SSPIAuth On 
SSPIAuthoritative On 
SSPIDomain mydomain 

# Set this if you want to allow access with clients that do not support NTLM, or via proxy from outside. Don't forget to require SSL in this case! 
SSPIOfferBasic On 

# Set this if you have only one domain and don't want the MYDOMAIN\ prefix on each user name 
SSPIOmitDomain On 

# AD user names are case-insensitive, so use this for normalization if your application's user names are case-sensitive 
SSPIUsernameCase Lower 
AuthName "Some text to prompt for domain credentials" 
Require valid-user 

Und vergessen Sie nicht, dass Sie können auch use Firefox for transparent SSO in a Windows domain: Einfach zu about:config gehen, die Suche nach network.automatic-ntlm-auth.trusted-uris, und geben Sie den Hostnamen oder FQDN Ihrer internen Anwendung (wie myserver oder myserver .corp.domain.com). Sie können mehr als einen Eintrag haben, es ist eine durch Kommas getrennte Liste.

+1

Das funktioniert, Sie bekommen die Prämie und ich bleibe bei Apache stecken. Einige der anderen funktionieren vielleicht auch, aber immer noch nichts, das Apache oder IIS nicht benötigt. Ich hoffe, dieses Problem eines Tages noch einmal zu überdenken. – reconbot

1

Ich hatte ein ähnliches Problem, das ich für meine Organisation lösen musste.

Ich suchte mit adLDAP.

Es gibt einige Dokumentationen auf der Website, um eine nahtlose Authentifizierung mit Active Directory zu erreichen.

+0

Der fragliche Link für die Dokumentation ist http://adldap.sourceforge.net/wiki/doku.php?id=seamless_authentication Ich werde einen Blick werfen – reconbot

+1

Es gibt einige gute Informationen über die Umleitung auf einen IIS-Server für die Authentifizierung mit einem Token, aber es drückt hauptsächlich Apache-Module auf Linux. – reconbot

1

Ich wäre neugierig auf eine Lösung, die OpenID als Backend (von Art) dafür verwendet ... Ich habe nichts gesehen, das direkt in ActiveDirectory einhaken würde, wenn ich (schnell) googelte. Es könnte jedoch ziemlich schmerzlos sein, sie über einfaches HTTP (S) zu implementieren (Sie wären ein OpenID-Anbieter, der Ihre Anmeldeinformationen gegen Ihr lokales AD überprüft). Im besten Fall können Sie einfach mehrere Klassen zu Ihrer App hinzufügen und diese ausführen - es sind keine Webservermodule erforderlich. Es gibt eine Menge von Open-Source-Code für beide Seiten, also, wenn nichts anderes, lohnt es sich, einen Blick darauf zu werfen. Wenn Sie das Back-End den Benutzern zur Verfügung gestellt haben (d. H. Ihnen OpenID-URLs gegeben haben), hätten Sie den zusätzlichen Vorteil, dass sie sich mit diesen Anmeldeinformationen bei mehr als nur Ihren internen Websites anmelden können. (Beispiel: Stack Overflow.)

Als Nebenbemerkung wäre ich dagegen, dass Internet Explorer erforderlich ist. Ich bin mir nicht sicher, ob dies das Ziel der Frage ist, aber abhängig von Ihrer IT-Umgebung würde ich Leute erwarten, die Firefox oder Safari (oder Opera oder ...) weniger als begeistert sein. (Sie entwickeln sich nicht zuerst gegen den IE, oder? Das war immer schmerzhaft, wenn ich das getan habe.) Das heißt nicht, dass Sie diese Funktion von IE nicht verwenden könnten, nur dass es nicht die einzige Option sein sollte . Der Link, den Sie gepostet haben, besagt, dass NTLM mit mehr als IE gearbeitet hat, aber da ich keine Erfahrung damit habe, ist es schwer zu beurteilen, wie gut das funktionieren würde.

+0

Alle Browser unterstützen die NTLM-Authentifizierung. IE ist keine Voraussetzung mehr. –

0

Für IIS/PHP FCGI, benötigen Sie eine nicht autorisierte Header auszusenden:

function EnableAuthentication() 
{ 
    $realm = "yoursite"; 
    header('WWW-Authenticate: Digest realm="'.$realm.'",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"'); 
    header("HTTP/1.1 401 Unauthorized"); 
    exit; 
} 

Sie können dann mit auf dem Benutzernamen erhalten:

$winuser = $_SERVER["REMOTE_USER"]; 

ich dann sicherstellen, dass die $ winuser ist in meiner Datenbank der erlaubten Benutzer.

Seien Sie SICHER und testen Sie dies unter einem nicht-privilegierten Konto. Als ich das zum ersten Mal installiert habe, habe ich es getestet und es hat gut funktioniert, aber später, als ein Standard-Benutzer ohne Server-Admin es versuchte, ist dies fehlgeschlagen. Stellt sich heraus, einige der temporären Verzeichnisse müssen Berechtigungen für Gastbenutzer geändert haben. Ich kann mich nicht an die genauen Einstellungen erinnern.

+0

Funktioniert das für nicht-iis-Server? – reconbot

+0

Ich verwalte keine Nicht-IIS-Server, also weiß ich nicht. –

Verwandte Themen