web-dev-qa-db-fra.com

Pouvez-vous obtenir un nom d'utilisateur Windows (AD) en PHP?

J'ai une application Web PHP sur un intranet qui peut extraire l'adresse IP et le nom d'hôte de l'utilisateur actuel sur cette page, mais je me demandais s'il était possible d'obtenir/d'extraire également leur nom d'utilisateur Active Directory/Windows. . Est-ce possible?

40
fuentesjr

Vérifiez la variable de requête AUTH_USER. Ce sera vide si votre application Web autorise un accès anonyme, mais si votre serveur utilise une authentification de base ou une authentification intégrée à Windows, il contiendra le nom d'utilisateur de l'utilisateur authentifié.

Dans un domaine Active Directory, si vos clients exécutent Internet Explorer et que vos autorisations de serveur Web/système de fichiers sont configurées correctement, IE soumettra en mode silencieux les informations d'identification de domaine à votre serveur et AUTH_USER sera MYDOMAIN\user.name sans que les utilisateurs aient à se connecter dans votre application web.

41
Dylan Beattie

Php mysql tourne sur IIS - Je peux utiliser $_SERVER["AUTH_USER"] si j'active l'authentification Windows dans IIS -> Authentification et désactive l'authentification anonyme (important)

J'ai utilisé cela pour obtenir mon utilisateur et mon domaine:

$user = $_SERVER['AUTH_USER'];

$user renverra une valeur telle que: DOMAIN\username sur notre réseau, puis il suffira de supprimer le DOMAIN\ de la chaîne.

Cela a fonctionné dans IE, FF, Chrome, Safari (testé) jusqu'à présent.

12
Schwarz.Oz

Examinez les fonctions de la bibliothèque LDAP PHP: http://us.php.net/ldap

Active Directory [généralement] est conforme à la norme LDAP.

4
warren

Si vous utilisez Apache sous Windows, vous pouvez installer le module mod_auth_sspi à partir de 

https://sourceforge.net/projects/mod-auth-sspi/

Les instructions sont dans le fichier INSTALL et il y a un exemple avec whoami.php. (Il suffit de copier le fichier mod_auth_sspi.so dans un dossier et d’ajouter une ligne dans httpd.conf.)

Une fois installé et les paramètres nécessaires définis dans httpd.conf pour protéger les répertoires souhaités, PHP remplira le $_SERVER['REMOTE_USER'] avec l'utilisateur et le domaine ('USER\DOMAIN') de l'utilisateur authentifié dans IE - ou Invitez et authentifiez-vous dans Firefox avant de le transmettre.

Les informations sont basées sur les sessions, de sorte que la connexion unique (ish) est possible même dans Firefox ...

-Craig

3
CrayFishUK

Vous pourriez probablement authentifier leutilisateur dans Apache avec mod_auth_kerb en exigeant un accès authentifié à certains fichiers… Je pense que de cette façon, le nom d'utilisateur devrait également être disponible dans PHP Les variables d'environnement quelque part… probablement préférable de vérifier avec <?php phpinfo(); ?> une fois que vous l'avez exécuté.

2
hangy

Vous pouvez dire getenv('USERNAME')

1
Someone

Découvrez le module d'authentification NTLM corrigé pour Apache https://github.com/rsim/mod_ntlm

Basé sur le module d'authentification NTLM pour Apache/Unix http://modntlm.sourceforge.net/

En savoir plus sur http://blog.rayapps.com/

Source: http://imthi.com/blog/programming/leopard-Apache2-ntlm-php-integrated-windows-authentication.php

1
blomman9

Si vous recherchez la récupération d'un IDSID/nom d'utilisateur d'utilisateur distant, utilisez:

echo gethostbyaddr($_SERVER['REMOTE_ADDR']);

Vous obtiendrez quelque chose commeiamuser1-mys.corp.company.com

Filtrez le reste du domaine derrière et vous ne pourrez obtenir que l'identifiant idsid. 

Pour plus d'informations, visitez http://lostwithin.net/how-to-get-users-ip-and-computer-name-using-php/

1
Eddy Goh

Non, mais vous pouvez demander à votre administrateur Active Directory d'activer le protocole LDAP afin que les utilisateurs puissent conserver un ensemble d'informations d'identification.

http://us2.php.net/ldap

1
Peter Bailey

Nous avons plusieurs domaines dans notre environnement, donc j'utilise preg_replace avec regex pour obtenir uniquement le nom d'utilisateur sans DOMAIN \.

preg_replace("/^.+\\\\/", "", $_SERVER["AUTH_USER"]);
1
GMR

C’est un exemple simple d’intégration NTLM AD, autorise l’ouverture de session unique avec Internet Explorer, nécessite une connexion/configuration dans d’autres navigateurs.

Exemple PHP

<?php 
$user = $_SERVER['REMOTE_USER'];
$domain = getenv('USERDOMAIN');

?>

Dans votre fichier httpd.conf Apache

LoadModule authnz_sspi_module modules/mod_authnz_sspi.so

<Directory "/path/to/folder">
    AllowOverride     All
    Options           ExecCGI
    AuthName          "SSPI Authentication"
    AuthType          SSPI
    SSPIAuth          On
    SSPIAuthoritative On
    SSPIOmitDomain    On
    Require           valid-user
    Require           user "NT AUTHORITY\ANONYMOUS LOGON" denied
</Directory>

Et si vous avez besoin du module, ce lien est utile:

https://www.apachehaus.net/modules/mod_authnz_sspi/

0
PodTech.io

Référencement essayant également de déterminer si AUTH_USER fait partie d'un groupe de domaine particulier; une façon intelligente de le faire est de créer un dossier verrouillé avec des fichiers texte (peut être vide). Définissez la sécurité pour n’avoir que le groupe de sécurité/distribution que vous souhaitez valider. Une fois que vous avez exécuté @file_get_contents (<--- lancera un avertissement) ... si l'utilisateur ne dispose pas d'un accès au groupe, il ne pourra pas obtenir le contenu du fichier et n'aura donc pas accès à ce groupe AD particulier. C'est simple et fonctionne à merveille.

0
George

get_user_name fonctionne de la même manière que getenv ('USERNAME');

J'ai eu des problèmes d'encodage (avec le cyrillique) en utilisant getenv ('USERNAME')

0
Kornilov Ruslan