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

StackOverflow https://stackoverflow.com/questions/1003751

Question

Je suis vaguement conscient du fait que sur un ordinateur connecté à un domaine, il peut être demandé à IE d’envoyer des en-têtes supplémentaires que je pourrais utiliser pour me connecter automatiquement à une application. J'ai Apache fonctionnant 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=last https://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 une tâche facile. 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-léger-ntlm-en-php /

J'aimerais que mes utilisateurs pointent simplement sur l'application et les authentifient automatiquement. Quelqu'un a-t-il déjà expérimenté cela ou l'a-t-il mis au travail?

MISE À JOUR 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.

Je ne comprends toujours pas (et n’aimerais pas être éduqué) pourquoi les plug-ins de serveur HTTP sont nécessaires et nous ne pouvons pas avoir de PHP, solution agnostique de serveur Web.

Était-ce utile?

La solution

Vous avez uniquement besoin du mod_auth_sspi module 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

N'oubliez pas que vous pouvez également utiliser Firefox pour une authentification unique transparente. dans un domaine Windows : accédez simplement à à propos de: config , recherchez network.automatic-ntlm-auth.trusted-uris , puis entrez le nom d'hôte ou Nom de domaine complet de votre application interne (comme myserver ou myserver.corp.domain.com). Vous pouvez avoir plusieurs entrées, c'est une liste séparée par des virgules.

Autres conseils

Je serais curieux de connaître une solution qui utilise OpenID comme base (pour le moins) pour cela ... Je ne voyais rien qui puisse s’accrocher directement à ActiveDirectory lorsque je cherchais sur 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 qu’Internet Explorer soit 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 vous développez pas d'abord contre IE, n'est-ce pas? 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 être la seule option possible. . 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 à quel point cela fonctionnerait.

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

Je cherchais à utiliser adLDAP .

Certains documents sur le site permettent également une authentification transparente avec Active Directory.

L’une des options pour vous est d’utiliser CAS (service d’authentification centralisée).

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.

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 = 

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:

<*>

Je m'assure ensuite que $ winuser figure 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.

SERVER["REMOTE_USER"];

Je m'assure ensuite que $ winuser figure 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top