Comment puis-je implémenter single sign-on (SSO) en utilisant Microsoft AD pour une application PHP interne?

je suis vaguement conscient que sur un ordinateur relié à un domaine IE peut être demandé d'envoyer des en-têtes supplémentaires que je pourrais utiliser pour automatiquement signer sur une application. Apache tourne sur un serveur windows avec mod_php. J'aimerais être en mesure d'éviter à l'utilisateur d'avoir à se connecter si nécessaire. J'ai trouvé des liens qui parlent de Kerberos et D'Apache. module.

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

depuis que je tourne sous Windows, il est prouvé qu'il n'est pas trivial d'installer des modules Perl ou Apache. Mais PHP n'a-t-il pas déjà accès aux en-têtes HTTP?

j'ai trouvé ceci mais il ne fait aucune authentification, il montre juste que PHP peut lire le NTLM tête. http://siphon9.net/loune/2007/10/simple-lightweight-ntlm-in-php/

j'aimerais que mes utilisateurs pointent vers l'application et qu'ils l'authentifient automatiquement. Quelqu'un a eu une expérience avec ce ou eu à le faire fonctionner?

UPDATE Depuis que nous avons posté cette question, nous avons changé les configurations pour nginx et php-fcgi qui tournent encore sous windows. Apache2 et php-cgi sur windows est probablement l'un des les réglages les plus lents que vous pouvez configurer sur windows. Il semble Qu'Apache soit encore nécessaire (il fonctionne avec php-fcgi) mais je préférerais une solution nginx.

Je ne comprends toujours pas (et j'aimerais être instruit) pourquoi les plugins de serveur HTTP sont nécessaires et nous ne pouvons pas avoir de solution agnostique de serveur web PHP.

25
demandé sur Simon East 2009-06-17 00:21:44

5 réponses

Tout ce dont vous avez besoin est le mod_auth_sspi module Apache.

configuration de L'échantillon:

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

Et n'oubliez pas que vous pouvez également utiliser Firefox pour transparent SSO dans un domaine Windows: il suffit d'aller à about:config, rechercher network.automatic-ntlm-auth.trusted-uris, et entrez le nom d'hôte ou FQDN de votre application interne (comme myserver ou myserver.corp.domain.com). Vous pouvez avoir plus d'une entrée, c'est une liste séparée par des virgules.

16
répondu realMarkusSchmidt 2009-10-15 03:32:22

je serais curieux d'une solution qui utilise OpenID comme un backend (en quelque sorte) pour cela... Je ne voyais rien qui se connecterait directement à ActiveDirectory lorsque j'ai cherché sur Google (rapidement). Cependant, il pourrait être assez indolore à mettre en œuvre sur HTTP(s) simple (vous seriez un fournisseur OpenID qui a vérifié les justificatifs d'identité contre votre annonce locale). Dans le meilleur des cas, vous pourriez être en mesure d'ajouter quelques classes à votre application et être désactivé et en cours d'exécution -- aucun module de serveur web requis. Il y a beaucoup de code source ouvert là-bas pour chaque côté de cela, donc si rien d'autre, il vaut la peine de jeter un oeil. Si vous exposez le backend aux utilisateurs (c.-à-d. leur a donné des URLs OpenID), vous aurez l'avantage supplémentaire d'eux être en mesure de se connecter à plus de vos sites internes en utilisant ces justificatifs d'identité. (Exemple: Un Débordement De Pile.)

à part cela, je ne suis pas d'accord pour qu'Internet Explorer soit nécessaire. Je ne suis pas sûr que ce soit le but de la façon dont vous avez écrit la question, mais selon votre environnement informatique, je m'attendrais à des gens qui utilisent Firefox ou Safari (ou Opera or ...) pour être moins enthousiastes. (Vous ne développez pas contre IE d'abord, êtes-vous? Ça a été douloureux quand je l'ai fait.) Ce n'est pas pour dire que vous ne pouviez pas utiliser cette fonctionnalité de IE, juste que ce ne devrait pas être la seule option. Le lien que vous avez posté indique que NTLM a travaillé avec plus QU'IE, mais comme je n'ai aucune expérience avec elle, il est difficile de juger si cela fonctionnerait bien.

1
répondu Benjamin Oakes 2009-10-15 02:51:51

j'avais un problème similaire que j'avais besoin de résoudre pour mon organisation.

je suis à la recherche dans l'aide de adLDAP.

il y a aussi de la documentation sur le site pour réaliser une authentification transparente avec Active Directory.

1
répondu asgeo1 2011-12-07 05:31:23

une option pour vous est D'utiliser CAS (central authentication service).

il a une bibliothèque de clients php.

Comment faire un lien vers MS Active Directory: http://www.ja-sig.org/wiki/display/CASUM/Active+Répertoire

vous auriez besoin D'Apache maven 2 cependant.

0
répondu Hrishi 2009-10-15 02:14:11

pour IIS / PHP FCGI, vous devez envoyer un en-tête non autorisé:

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

Vous pouvez obtenir le nom d'utilisateur par:

$winuser = $_SERVER["REMOTE_USER"];

Je m'assure alors que $ winuser est dans ma base de données des utilisateurs autorisés.

assurez-vous de le tester dans un compte non privilégié. Lorsque je l'ai installé pour la première fois, je l'ai testé et cela a bien fonctionné, mais plus tard, quand un utilisateur non-administrateur-serveur standard l'a essayé, cela a échoué. Il s'avère que certains répertoires temporaires doivent avoir modification des autorisations pour des utilisateurs invités. Je ne me souviens pas des réglages exacts.

0
répondu Will Shaver 2009-10-16 19:05:59