web-dev-qa-db-fra.com

Comment implémenter l'authentification unique (SSO) à l'aide de Microsoft AD pour un serveur interne PHP app?

Je suis vaguement conscient du fait que sur un ordinateur connecté à un domaine IE peut être invité à envoyer des en-têtes supplémentaires que je pourrais utiliser pour me connecter automatiquement à une application. Apache tourne sur un serveur Windows avec mod_php. J'aimerais pouvoir éviter que l'utilisateur ait à se connecter si nécessaire. J'ai trouvé des liens concernant les modules Kerberos et Apache.

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

Depuis que je suis sous Windows, il est prouvé que l'installation de modules Perl ou Apache n'est pas triviale. Mais PHP n'a-t-il pas déjà accès aux en-têtes HTTP?

J'ai trouvé ceci, mais cela ne fait aucune authentification, cela montre simplement que PHP peut lire les en-têtes NTLM . http://siphon9.net/loune/2007/10/simple-lightweight- ntlm-in-php/

J'aimerais pouvoir que mes utilisateurs pointent simplement l'application et les authentifient automatiquement. Quelqu'un at-il eu une expérience avec cela ou l'a obtenu pour fonctionner du tout?

UPDATE Depuis la publication de cette question, nous avons modifié les configurations en nginx et php-fcgi fonctionnant toujours sous Windows. Apache2 et php-cgi sous Windows sont probablement l’une des configurations les plus lentes que vous puissiez configurer sous Windows. On dirait qu'Apache pourrait encore être nécessaire (cela fonctionne avec php-fcgi) mais je préférerais une solution nginx. 

De plus, je ne comprends toujours pas (et aimerais être instruit) pourquoi les plugins de serveur HTTP sont nécessaires et nous ne pouvons pas avoir de solution PHP, agnostique de serveur Web.

28
reconbot

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

Exemple de configuration:

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 aussi utiliser Firefox pour une connexion unique transparente dans un domaine Windows : Il suffit d'aller à about:config, de rechercher network.automatic-ntlm-auth.trusted-uris et d'entrer le nom d'hôte ou le nom de domaine complet de votre application interne (comme myserver ou myserver.corp). .domaine.com). Vous pouvez avoir plus d’une entrée, c’est une liste séparée par des virgules.

17
realMarkusSchmidt

Je serais curieux de connaître une solution qui utilise OpenID comme base (de toutes les manières) pour cela… Je ne voyais rien qui puisse directement s’accrocher à ActiveDirectory lorsque je cherchais dans Google (rapidement). Cependant, il pourrait être assez simple d'implémenter via HTTP (S) (vous seriez un fournisseur OpenID qui vérifiait les informations d'identification par rapport à votre AD local). Dans le meilleur des cas, vous pourrez peut-être ajouter quelques classes à votre application et être opérationnel: aucun module de serveur Web n'est requis. Il y a beaucoup de code source ouvert pour chaque aspect de celui-ci, alors si rien d'autre ne vaut la peine d'être examiné. Si vous exposiez le backend aux utilisateurs (c’est-à-dire en leur donnant des URL OpenID), vous auriez l’avantage supplémentaire de pouvoir se connecter à plus que vos sites internes à l’aide de ces informations d’identité. (Exemple: débordement de pile.)

En passant, je serais contre de faire en sorte que Internet Explorer est requis. Je ne suis pas sûr que ce soit l'objectif de la façon dont vous avez rédigé la question, mais selon votre environnement informatique, je m'attendrais à ce que les personnes qui utilisent Firefox ou Safari (ou Opera ou ...) soient moins enthousiastes. (Vous ne développez pas contre IE d'abord, êtes-vous? Cela a été douloureux chaque fois que je l'ai fait.) Cela ne veut pas dire que vous ne pouvez pas utiliser cette fonctionnalité d'IE, mais qu'elle ne devrait pas ne pas être la seule option. Le lien que vous avez posté indiquait que NTLM travaillait avec plus qu'IE, mais comme je n'en ai aucune expérience, il est difficile de juger de l'efficacité de cette solution.

1
Benjamin Oakes

J'ai eu un problème similaire que je devais résoudre pour mon organisation.

Je cherchais à utiliser adLDAP .

Il existe également une documentation sur le site pour réaliser une authentification transparente avec Active Directory.

1
asgeo1

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 ensuite obtenir le nom d'utilisateur avec:

$winuser = $_SERVER["REMOTE_USER"];

Je m'assure ensuite que $ winuser se trouve dans ma base de données d'utilisateurs autorisés. 

Assurez-vous de tester cela sous un compte non privilégié. Lorsque j'ai installé ceci pour la première fois, je l'ai testé et tout a bien fonctionné, mais plus tard, lorsqu'un utilisateur standard non administrateur de serveur l'a essayé, cela a échoué. Il s'avère que certains des répertoires temporaires doivent avoir des autorisations modifiées pour les utilisateurs invités. Je ne me souviens pas des paramètres exacts.

0
Will Shaver

Une option pour vous est d'utiliser CAS (service d'authentification central).

Il a une bibliothèque client php.

Lien vers MS Active Directory: http://www.ja-sig.org/wiki/display/CASUM/Active+Directory

Vous auriez cependant besoin d'Apache maven 2.

0
Hrishi