2009-06-16 5 views
23

Sono vagamente consapevole del fatto che su un computer collegato a un dominio IE può essere richiesto di inviare alcune intestazioni aggiuntive che potrei utilizzare per accedere automaticamente a un'applicazione. Ho apache in esecuzione su un server Windows con mod_php. Mi piacerebbe essere in grado di evitare che l'utente debba effettuare il login, se necessario. Ho trovato alcuni link che parlano di moduli Kerberos e Apache.Come posso implementare il Single Sign-On (SSO) utilizzando Microsoft AD per un'app interna PHP?

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

Dal momento che sto in esecuzione su Windows è dimostrato di essere non banale per ottenere i moduli Perl o Apache installati. Ma PHP non ha già accesso alle intestazioni HTTP?

ho trovato questo, ma non fa alcuna autenticazione, mostra solo che il PHP in grado di leggere le intestazioni NTLM. http://siphon9.net/loune/2007/10/simple-lightweight-ntlm-in-php/

Mi piacerebbe essere in grado di far puntare i miei utenti sull'applicazione e farli autenticare automaticamente. Qualcuno ha avuto qualche esperienza con questo o l'ha fatto funzionare per niente?

UPDATE Dal originariamente distacco a questa domanda, abbiamo cambiato messe a punto per nginx e php-fcgi ancora in esecuzione su Windows. Apache2 e php-cgi su Windows sono probabilmente una delle configurazioni più lente che si possano configurare su Windows. Sembra che Apache potrebbe essere ancora necessario (funziona con php-fcgi) ma preferirei una soluzione nginx.

anche io continuo a non capire (e mi piacerebbe essere educati) perché HTTP plugin del server sono necessari e non possiamo avere un PHP, web server soluzione agnostica.

+0

Si tratta di un'applicazione interna dietro il firewall? –

+0

Sì, è interno – reconbot

+1

C'è qualcos'altro che posso aggiungere per migliorare questa domanda? – reconbot

risposta

16

Tutto ciò che serve è il modulo Apache mod_auth_sspi.

configurazione di esempio:

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 

E non dimenticate che è anche possibile use Firefox for transparent SSO in a Windows domain: Basta andare about:config, ricerca di network.automatic-ntlm-auth.trusted-uris e immettere il nome host o nome di dominio completo dell'applicazione interna (come myserver o mioserver .corp.domain.com). Puoi avere più di una voce, è un elenco separato da virgole.

+1

Funziona, ottieni la munificenza e rimango bloccato con apache. Alcuni degli altri potrebbero funzionare anche, ma ancora nulla che non richieda apache o iis. Spero di rivisitare questo problema un giorno. – reconbot

1

Avevo un problema simile che dovevo risolvere per la mia organizzazione.

che cercavo nel usando adLDAP.

C'è una certa documentazione sul sito per ottenere l'autenticazione senza soluzione di continuità con Active Directory troppo.

+0

Il link in questione per la documentazione è http://adldap.sourceforge.net/wiki/doku.php?id=seamless_authentication Prenderò un'occhiata – reconbot

+1

Ci sono alcune buone informazioni sul reindirizzamento a un server iis per l'autenticazione con un token, ma principalmente spinge i moduli apache su linux. – reconbot

1

Sarei curioso di una soluzione che utilizza OpenID come back-end (di questo tipo) per questo ... Non vedevo nulla che si collegasse direttamente ad ActiveDirectory quando ho cercato su Google (rapidamente). Tuttavia, potrebbe essere abbastanza semplice implementare su un semplice HTTP (S) (si tratterebbe di un provider OpenID che ha controllato le credenziali contro l'AD locale). Nel migliore dei casi, potresti essere in grado di aggiungere solo un paio di classi alla tua app e di essere spento e in esecuzione - nessun modulo del server web richiesto. C'è un sacco di codice open source là fuori per entrambi i lati di questo, quindi se non altro, vale la pena dare un'occhiata. Se hai esposto il back-end agli utenti (cioè gli hanno dato gli URL OpenID), avresti il ​​vantaggio aggiuntivo di poter accedere a più di un semplice sito interno utilizzando queste credenziali. (Esempio:. Stack Overflow)

Per inciso, sarei contro il fare in modo che è necessario Internet Explorer. Non sono sicuro se questo è l'obiettivo dal modo in cui hai scritto la domanda, ma a seconda del tuo ambiente IT, mi aspetterei che le persone che utilizzano Firefox o Safari (o Opera o ...) per essere meno che entusiasta. (Non stai sviluppando contro IE per prima cosa, sei? È stato doloroso ogni volta che l'ho fatto.) Questo non vuol dire che non potresti usare questa caratteristica di IE, solo che non dovrebbe essere l'unica opzione . Il link che hai postato ha dichiarato che NTLM ha funzionato con più di IE, ma dal momento che non ho alcuna esperienza con esso, è difficile giudicare quanto bene funzionerebbe.

+0

Tutti i browser supportano l'autenticazione NTLM. IE non è più un requisito. –

0

Per IIS/PHP fcgi, è necessario inviare un'intestazione non autorizzata:

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

È quindi possibile ottenere presso il nome utente con:

$winuser = $_SERVER["REMOTE_USER"]; 

Ho poi assicurarsi che il $ winuser è nel mio database di utenti autorizzati.

Essere SICURI e testare questo sotto un account non privilegiato. Quando l'ho installato per la prima volta, l'ho testato e ha funzionato correttamente, ma in seguito, quando un utente standard non amministratore-server l'ha provato, ciò non è riuscito. Risulta che alcune delle directory temporanee devono avere autorizzazioni modificate per gli utenti ospiti. Non riesco a ricordare le impostazioni esatte.

+0

Funziona per i server non iis? – reconbot

+0

Non gestisco nessun server non-iis quindi non lo so. –