2009-06-16 10 views
23

Jestem niejasno świadomy, że na komputerze dołączonym do domeny IE może zostać poproszony o wysłanie dodatkowych nagłówków, których mógłbym użyć, aby automatycznie zalogować się do aplikacji. Mam apache'a działającego na serwerze Windows z mod_php. Chciałbym móc uniknąć konieczności logowania użytkownika w razie potrzeby. Znalazłem kilka linków mówiących o modułach Kerberos i Apache.Jak mogę zaimplementować jednokrotne logowanie (SSO) przy użyciu Microsoft AD dla wewnętrznej aplikacji PHP?

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

Ponieważ biegnę na Windows to okazał się być nietrywialne dostać Perl lub Apache zainstalowanych modułów. Ale czy PHP nie ma już dostępu do nagłówków HTTP?

Znalazłem to, ale nie uwierzytelnia się, pokazuje tylko, że PHP może czytać nagłówki NTLM. http://siphon9.net/loune/2007/10/simple-lightweight-ntlm-in-php/

Chciałbym umożliwić moim użytkownikom wskazanie aplikacji i automatyczne uwierzytelnienie. Czy ktokolwiek miał z tym jakieś doświadczenie, czy też w ogóle nie działał?

UPDATE Ponieważ pierwotnie księgowania to pytanie, zmieniliśmy konfiguracje do nginx i php-fcgi nadal działa w systemie Windows. Apache2 i php-cgi w oknach jest prawdopodobnie jedną z najwolniejszych konfiguracji, które możesz skonfigurować w oknach. Wygląda na to, że Apache wciąż może być potrzebny (działa z php-fcgi), ale wolałbym rozwiązanie nginx.

Nadal nie rozumiem (i bardzo chciałbym się kształcić), dlaczego wtyczki serwera HTTP są niezbędne i nie możemy mieć agnostycznego rozwiązania PHP, serwera WWW.

+0

Czy jest to wewnętrzna aplikacja za zaporą ogniową? –

+0

Tak, to jest wewnętrzna – reconbot

+1

Czy mogę dodać coś jeszcze, aby poprawić to pytanie? – reconbot

Odpowiedz

16

Wszystko czego potrzebujesz to moduł Apache mod_auth_sspi.

Przykładowa konfiguracja:

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 

I nie zapomnij, że można również use Firefox for transparent SSO in a Windows domain: Wystarczy przejść do about:config, wyszukaj network.automatic-ntlm-auth.trusted-uris i wprowadź nazwę hosta lub FQDN z aplikacji wewnętrznej (jak mójserwer lub mójserwer .corp.domena.com). Możesz mieć więcej niż jeden wpis, jest to lista oddzielona przecinkami.

+1

To działa, dostajesz nagrodę i utknąłem z apache. Niektóre inne mogą również działać, ale wciąż nic, co nie wymaga apache lub iis. Mam nadzieję, że pewnego dnia przyjrzymy się temu problemowi. – reconbot

1

Miałem podobny problem, który musiałem rozwiązać dla mojej organizacji.

Szukałem przy użyciu adLDAP.

Na stronie znajduje się pewna dokumentacja umożliwiająca bezproblemowe uwierzytelnianie również w usłudze Active Directory.

+0

Link do dokumentacji jest http://adldap.sourceforge.net/wiki/doku.php?id=seamless_authentication Będę szukać – reconbot

+1

Istnieje kilka dobrych informacji o przekierowaniu na serwer iis w celu uwierzytelnienia za pomocą token, ale głównie wypycha moduły apache na Linuksie. – reconbot

1

Chciałbym być ciekawy rozwiązania, które używa OpenID jako backend (sort) dla tego ... Nie widziałem nic, co mogłoby wejść w ActiveDirectory bezpośrednio, gdy google (szybko). Jednak może to być dość bezbolesne wdrożenie za pośrednictwem zwykłego HTTP (S) (byłbyś dostawcą OpenID, który sprawdzałby dane uwierzytelniające w twoim lokalnym AD). W najlepszym przypadku możesz po prostu dodać kilka klas do swojej aplikacji i być nieaktywnymi - nie są wymagane żadne moduły serwera WWW. Istnieje wiele otwartego kodu źródłowego dla każdej strony tego, więc jeśli nic więcej, to warto spojrzeć. Jeśli udostępnisz backend użytkownikom (tj. Dostarczysz im adresy URL OpenID), będziesz mieć dodatkową zaletę, że będą mogli logować się do więcej niż tylko wewnętrznych witryn przy użyciu tych poświadczeń. (Przykład: przepełnienie stosu).

Na marginesie, byłbym przeciwny temu, aby Internet Explorer był wymagany. Nie jestem pewien, czy to jest cel z tego, jak napisałeś pytanie, ale w zależności od twojego środowiska IT, oczekiwałbym ludzi używających Firefoksa lub Safari (lub Opery lub ...) być mniej niż entuzjastycznie nastawionym. (Nie rozwijasz się przeciwko IE, prawda? To było bolesne, kiedy to zrobiłem.) To nie znaczy, że nie możesz używać tej funkcji IE, tylko że nie powinna to być jedyna opcja . Opublikowany przez ciebie link stwierdził, że NTLM pracował z więcej niż IE, ale ponieważ nie mam z nim żadnego doświadczenia, trudno jest ocenić, jak dobrze by to działało.

+0

Wszystkie przeglądarki obsługują uwierzytelnianie NTLM. IE nie jest już wymogiem. –

0

dla IIS/PHP fcgi, trzeba wysłać nieautoryzowanej nagłówka:

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

Następnie można uzyskać przy użyciu nazwy użytkownika z:

$winuser = $_SERVER["REMOTE_USER"]; 

Następnie upewnij się, że $ winuser jest w mojej bazie danych dozwolonych użytkowników.

Bądź w PEŁNI i przetestuj to na nieuprawnionym koncie. Kiedy po raz pierwszy zainstalowałem to, przetestowałem go i zadziałało dobrze, ale później, gdy spróbował tego zwykły użytkownik niebędący administratorem serwera, to się nie udało. Niektóre z katalogów tymczasowych wymagają zmiany uprawnień dla gości. Nie pamiętam dokładnie ustawień.

+0

Czy to działa na serwerach innych firm? – reconbot

+0

Nie zarządzam serwerami innego typu, więc nie wiem. –

Powiązane problemy