¿Cómo puedo implementar el inicio de sesión único (SSO) usando Microsoft AD para una aplicación PHP interna?

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

Pregunta

Estoy vagamente consciente de que en una computadora unida a un dominio se puede pedir a IE que envíe algunos encabezados adicionales que podría usar para iniciar sesión automáticamente en una aplicación. Tengo Apache corriendo en un servidor de Windows con mod_php. Me gustaría poder evitar que el usuario tenga que iniciar sesión si es necesario. He encontrado algunos enlaces que hablan de los módulos Kerberos y Apache.

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

Ya que estoy ejecutando en Windows, se ha demostrado que no es trivial tener instalados los módulos Perl o Apache. ¿Pero PHP no tiene acceso a los encabezados HTTP?

Encontré esto pero no realiza ninguna autenticación, solo muestra que PHP puede leer los encabezados NTLM. http://siphon9.net/loune/2007/10/ simple-lightweight-ntlm-in-php /

Me gustaría poder hacer que mis usuarios solo apunten a la aplicación y se autentiquen automáticamente. ¿Alguien ha tenido alguna experiencia con esto o lo ha hecho funcionar?

ACTUALIZACIÓN Desde que publicamos esta pregunta originalmente, hemos cambiado las configuraciones a nginx y php-fcgi que todavía se ejecutan en Windows. Apache2 y php-cgi en Windows es probablemente una de las configuraciones más lentas que puede configurar en Windows. Parece que Apache aún podría ser necesario (funciona con php-fcgi) pero preferiría una solución nginx.

Tampoco entiendo (y me encantaría ser educado) por qué los complementos del servidor HTTP son necesarios y no podemos tener una solución independiente de PHP, servidor web.

¿Fue útil?

Solución

Todo lo que necesitas es el mod_auth_sspi módulo Apache.

Configuración de muestra:

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

Y no olvides que también puedes usar Firefox para un SSO transparente en un dominio de Windows : Simplemente vaya a sobre: ??config , busque network.automatic-ntlm-auth.trusted-uris , e ingrese el nombre del host o FQDN de su aplicación interna (como myserver o myserver.corp.domain.com). Puedes tener más de una entrada, es una lista separada por comas.

Otros consejos

Sentiría curiosidad por una solución que use OpenID como backend (más o menos) para esto ... No estaba viendo nada que pudiera engancharse en ActiveDirectory directamente cuando busqué en Google (rápidamente). Sin embargo, podría ser bastante fácil de implementar sobre HTTP (S) (sería un proveedor de OpenID que verificó las credenciales en su AD local). En el mejor de los casos, es posible que solo pueda agregar un par de clases a su aplicación y estar en funcionamiento, sin necesidad de módulos de servidor web. Hay una gran cantidad de código de código abierto por ambos lados de esto, así que si nada más, vale la pena echarle un vistazo. Si expusiera el backend a los usuarios (es decir, les proporcionó las URL de OpenID), tendría la ventaja adicional de poder iniciar sesión en más de sus sitios internos utilizando estas credenciales. (Ejemplo: desbordamiento de pila).

Aparte de eso, estaría en contra de hacerlo para que se requiera Internet Explorer. No estoy seguro de si ese es el objetivo de la forma en que escribiste la pregunta, pero dependiendo de tu entorno de TI, esperaría que las personas que usan Firefox o Safari (u Opera u ...) sean menos entusiastas. (No se está desarrollando contra IE primero, ¿verdad? Ha sido doloroso cuando lo he hecho). Esto no quiere decir que no pueda usar esta función de IE, solo que no debería ser la única opción. . El enlace que publicaste indica que NTLM funcionó con más de IE, pero como no tengo ninguna experiencia con él, es difícil juzgar qué tan bien funcionaría.

Tuve un problema similar que necesitaba resolver para mi organización.

Estaba estudiando el uso de adLDAP .

También hay algo de documentación en el sitio para lograr una autenticación sin problemas con Active Directory.

Una opción para usted es usar CAS (servicio de autenticación central).

Tiene una librería cliente php.

Cómo hacer un enlace a MS Active Directory: http: // www.ja-sig.org/wiki/display/CASUM/Active+Directory

Sin embargo, necesitarías Apache maven 2.

Para IIS / PHP FCGI, debe enviar un encabezado no autorizado:

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

Luego puede obtener el nombre de usuario con:

$winuser = 

Para IIS / PHP FCGI, debe enviar un encabezado no autorizado:

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

Luego puede obtener el nombre de usuario con:

<*>

Luego me aseguro de que $ winuser esté en mi base de datos de usuarios permitidos.

Asegúrese de probar esto bajo una cuenta sin privilegios. Cuando lo instalé por primera vez, lo probé y funcionó bien, pero más tarde, cuando un usuario estándar que no era administrador del servidor lo intentó, falló. Resulta que algunos de los directorios temporales necesitan que se cambien los permisos para los usuarios invitados. No puedo recordar la configuración exacta.

SERVER["REMOTE_USER"];

Luego me aseguro de que $ winuser esté en mi base de datos de usuarios permitidos.

Asegúrese de probar esto bajo una cuenta sin privilegios. Cuando lo instalé por primera vez, lo probé y funcionó bien, pero más tarde, cuando un usuario estándar que no era administrador del servidor lo intentó, falló. Resulta que algunos de los directorios temporales necesitan que se cambien los permisos para los usuarios invitados. No puedo recordar la configuración exacta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top