Jak zaimplementować jednokrotne logowanie (SSO) przy użyciu Microsoft AD dla wewnętrznej aplikacji PHP?

Zdaję sobie sprawę, że na komputerze podłączonym do domeny IE można poprosić o wysłanie dodatkowych nagłówków, których mógłbym użyć do automatycznego zalogowania się do aplikacji. Mam apache ' a działającego na windows server z mod_php. Chciałbym móc uniknąć konieczności logowania się przez użytkownika. Znalazłem kilka linków mówiących o Kerberos i Apache Moduły.

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

Ponieważ działam na Windowsie okazało się, że nietrywialne jest zainstalowanie modułów Perla lub Apache. Ale czy PHP nie ma już dostępu do nagłówków HTTP?

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

Chciałbym, aby moi użytkownicy mogli po prostu wskazać aplikację i mieć je automatycznie uwierzytelnione. Czy ktoś miał z tym jakieś doświadczenie lub w ogóle je uruchomił?

UPDATE Od momentu opublikowania tego pytania zmieniliśmy ustawienia na nginx i php - FCGI nadal działające w systemie windows. W tym roku, w 2017 roku, w Polsce, w 2018 roku, w Polsce i na świecie, w 2019 roku, w 2019 roku, w Polsce i na świecie. konfiguracja w systemie windows. Wygląda na to, że Apache może być nadal potrzebny (działa z php-fcgi), ale wolałbym rozwiązanie nginx.

Ja też nadal nie Rozumiem (i chciałbym się uczyć) dlaczego wtyczki serwera HTTP są potrzebne i nie możemy mieć PHP, web server agnostycznego rozwiązania.

Author: Simon East, 2009-06-17

5 answers

Wszystko czego potrzebujesz to mod_auth_sspi moduł Apache.

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 zapominaj, że możesz również używać Firefoksa do przezroczystego SSO w domenie Windows: po prostu przejdź do about:config, wyszukaj network.automatic-ntlm-auth.trusted-uris i wprowadź nazwę hosta lub FQDN swojej wewnętrznej aplikacji (np. myserver.corp.domain.com). możesz mieć więcej niż jeden wpis, jest to lista oddzielona przecinkami.

 16
Author: realMarkusSchmidt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-15 03:32:22

Byłbym ciekaw rozwiązania, które używa OpenID jako backend (swego rodzaju) do tego... Nie widziałem niczego, co podłączałoby się bezpośrednio do ActiveDirectory, gdy googlowałem (szybko). Jednak implementacja przez zwykły HTTP(S) może być dość bezbolesna (byłby to dostawca OpenID, który sprawdzał poświadczenia w stosunku do lokalnej reklamy). W najlepszym przypadku możesz po prostu dodać kilka klas do swojej aplikacji i być wyłączonym i działającym - nie są wymagane moduły serwera www. Jest wiele z otwartego kodu źródłowego dla obu stron tego, więc jeśli nic innego, warto spojrzeć. Jeśli udostępnisz backend użytkownikom (tj. podasz im adresy URL OpenID), zyskasz dodatkową korzyść, ponieważ będą mogli logować się do więcej niż tylko do witryn wewnętrznych za pomocą tych poświadczeń. (Przykład: Przepełnienie Stosu.)

Na marginesie, byłbym przeciwny, aby Internet Explorer był wymagany. Nie jestem pewien czy taki jest cel z tego jak napisałeś pytanie, ale w zależności od twoje środowisko IT, spodziewałbym się ludzi, którzy używają Firefoksa lub Safari (lub Opery lub ...) być mniej niż entuzjastycznym. (Nie rozwijasz się najpierw przeciwko IE, prawda? To było bolesne, kiedy to robiłem.) Nie oznacza to, że nie można użyć tej funkcji IE, tylko, że nie powinna być jedyną opcją. Link, który zamieściłeś stwierdził, że NTLM współpracuje z czymś więcej niż IE, ale ponieważ nie mam z nim żadnego doświadczenia, trudno ocenić, jak dobrze by to działało.

 1
Author: Benjamin Oakes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-15 02:51:51

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

Rozważałem użycie adLDAP .

Na stronie znajduje się dokumentacja umożliwiająca bezproblemowe uwierzytelnianie za pomocą usługi Active Directory.

 1
Author: asgeo1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-07 05:31:23

Jedną z opcji jest skorzystanie z CAS (central authentication service).

Posiada bibliotekę klienta php.

Jak połączyć się z MS Active Directory: http://www.ja-sig.org/wiki/display/CASUM/Active + Katalog

Wymagałbyś jednak Apache maven 2.

 0
Author: Hrishi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-15 02:14:11

Dla IIS / PHP FCGI, musisz wysłać nieautoryzowany nagłówek:

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

Możesz następnie uzyskać nazwę Użytkownika za pomocą:

$winuser = $_SERVER["REMOTE_USER"];

Upewniam się, że $winuser jest w mojej bazie dozwolonych użytkowników.

Upewnij się i przetestuj to pod kontem nieuprzywilejowanym. Kiedy po raz pierwszy zainstalowałem to przetestowałem i działało dobrze, ale później, gdy standardowy użytkownik non-server-admin próbował to nie powiodło się. Okazuje się, że niektóre katalogi tymczasowe muszą mieć zmienione uprawnienia gościa użytkowników. Nie pamiętam dokładnych ustawień.

 0
Author: Will Shaver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-16 19:05:59