it-swarm.com.de

Wie kann ich Single Sign-On (SSO) mit Microsoft AD für einen internen Server implementieren? PHP App?

Mir ist vage bewusst, dass IE auf einem Computer, der einer Domäne angehört, aufgefordert werden kann, zusätzliche Header zu senden, mit denen ich mich automatisch bei einer Anwendung anmelden kann. Ich habe Apache auf einem Windows-Server mit mod_php ausgeführt. Ich möchte vermeiden können, dass sich der Benutzer bei Bedarf einloggen muss. Ich habe einige Links gefunden, die sich mit Kerberos- und Apache-Modulen befassen.

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

Da ich unter Windows arbeite, ist es nachweislich nicht einfach, Perl- oder Apache-Module zu installieren. Aber hat PHP nicht bereits Zugriff auf HTTP-Header?

Ich habe das gefunden, aber es führt keine Authentifizierung durch. Es zeigt nur, dass PHP die NTLM-Header lesen kann. http://siphon9.net/loune/2007/10/simple-lightweight-ntlm-in-php/

Ich möchte, dass meine Benutzer einfach auf die Anwendung zeigen und sich automatisch authentifizieren. Hat jemand Erfahrung damit oder hat es überhaupt zum Laufen gebracht?

UPDATESeitdem wir diese Frage ursprünglich gestellt haben, haben wir die Einstellungen auf nginx und php-fcgi geändert, die immer noch unter Windows laufen. Apache2 und php-cgi unter Windows ist wahrscheinlich eines der langsamsten Setups, die Sie unter Windows konfigurieren können. Es sieht so aus, als ob Apache immer noch benötigt wird (es funktioniert mit PHP-FCGI), aber ich würde eine Nginx-Lösung vorziehen.

Ich verstehe auch immer noch nicht (und würde gerne darüber aufgeklärt werden), warum HTTP-Server-Plug-ins erforderlich sind und wir keine PHP-, Webserver-unabhängige Lösung haben können.

28
reconbot

Sie benötigen lediglich 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 auch Firefox für transparentes SSO in einer Windows-Domäne verwenden können. : Gehen Sie einfach zu about:config, suchen Sie nach network.automatic-ntlm-auth.trusted-uris, und geben Sie den Hostnamen oder den vollqualifizierten Domänennamen Ihrer internen Anwendung (wie z. B. myserver oder myserver) ein .corp.domain.com). Sie können mehr als einen Eintrag haben, es ist eine durch Kommas getrennte Liste.

17

Ich wäre neugierig auf eine Lösung, die OpenID (eine Art Backend) dafür verwendet ... Ich habe nichts gesehen, was sich direkt in ActiveDirectory einfügt, wenn ich (schnell) gegoogelt habe. Die Implementierung über einfaches HTTP (S) ist jedoch möglicherweise ziemlich problemlos (Sie wären ein OpenID-Anbieter, der die Anmeldeinformationen mit Ihrem lokalen AD geprüft hat). Im besten Fall können Sie möglicherweise nur ein paar Klassen zu Ihrer App hinzufügen und laufen lassen - es sind keine Webservermodule erforderlich. Es gibt eine Menge Open Source-Code für beide Seiten. Wenn nicht anders, lohnt es sich, einen Blick darauf zu werfen. Wenn Sie den Benutzern das Backend zur Verfügung gestellt haben (d. H. Ihnen OpenID-URLs gegeben haben), haben Sie den zusätzlichen Vorteil, dass sie sich mit diesen Anmeldeinformationen bei mehr als nur Ihren internen Sites anmelden können. (Beispiel: Stapelüberlauf.)

Abgesehen davon bin ich dagegen, dass Internet Explorer benötigt wird. Ich bin mir nicht sicher, ob dies das Ziel der Art ist, wie Sie die Frage geschrieben haben, aber abhängig von Ihrer IT-Umgebung würde ich davon ausgehen, dass Personen, die Firefox oder Safari (oder Opera oder ...) verwenden, weniger begeistert sind. (Sie entwickeln sich nicht gegen IE zuerst, oder? Das war schmerzhaft, wenn ich es getan habe.) Dies bedeutet nicht, dass Sie diese Funktion von IE nicht verwenden konnten, nur dass es nicht sollte nicht die einzige Option. 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.

1
Benjamin Oakes

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

Ich habe mich mit adLDAP beschäftigt.

Auf der Site gibt es einige Dokumentationen, um eine nahtlose Authentifizierung auch mit Active Directory zu erreichen.

1
asgeo1

Für IIS/PHP FCGI müssen Sie einen nicht autorisierten Header senden:

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 auf den Benutzernamen zugreifen mit:

$winuser = $_SERVER["REMOTE_USER"];

Ich stelle dann sicher, dass sich der $ winuser in meiner Datenbank der erlaubten Benutzer befindet. 

Seien Sie sicher und testen Sie dies unter einem nicht privilegierten Konto. Als ich das erste Mal installiert habe, habe ich es getestet und es hat gut funktioniert, aber später, als ein Standardbenutzer, der kein Serveradministrator ist, es versucht hat, ist dies fehlgeschlagen. Es stellt sich heraus, dass für einige der temporären Verzeichnisse Berechtigungen für Gastbenutzer geändert werden müssen. Ich kann mich nicht an die genauen Einstellungen erinnern.

0
Will Shaver

Eine Option für Sie ist die Verwendung von CAS (zentraler Authentifizierungsdienst).

Es hat PHP-Client-Bibliothek.

How-to-Link zu MS Active Directory: http://www.ja-sig.org/wiki/display/CASUM/Active+Directory

Sie würden jedoch Apache Maven 2 benötigen.

0
Hrishi