내부 PHP 앱 용 Microsoft AD를 사용하여 SSO (Single Sign-On) (SSO)를 구현하려면 어떻게해야합니까?

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

문제

나는 컴퓨터에서 도메인에 결합 된 컴퓨터에서 응용 프로그램에 자동으로 사인을하는 데 사용할 수있는 추가 헤더를 보내도록 요청받을 수 있다는 것을 모호하게 알고 있습니다. mod_php가있는 Windows 서버에서 Apache가 실행되었습니다. 필요한 경우 사용자가 로그인 해야하는 것을 피하고 싶습니다. Kerberos 및 Apache 모듈에 대해 이야기하는 링크를 발견했습니다.

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

Windows에서 실행되기 때문에 Perl 또는 Apache 모듈을 설치하는 것은 사소한 것으로 입증되었습니다. 그러나 PHP는 이미 HTTP 헤더에 액세스 할 수 없습니까?

나는 이것을 발견했지만 인증을 수행하지는 않지만 PHP가 NTLM 헤더를 읽을 수 있음을 보여줍니다.http://siphon9.net/loune/2007/10/simple-lightweight-ntlm-in-php/

사용자가 응용 프로그램을 가리키고 자동으로 인증하도록 할 수 있기를 원합니다. 누구든지 이것에 대한 경험이 있거나 전혀 일하기 위해 얻은 사람이 있습니까?

업데이트원래이 질문을 게시 한 이후로 설정을 NGINX 및 PHP-FCGI로 여전히 Windows에서 실행중인 것으로 변경했습니다. Windows의 APACHE2 및 PHP-CGI는 아마도 Windows에서 구성 할 수있는 가장 느린 설정 중 하나 일 것입니다. Apache가 여전히 필요한 것처럼 보이지만 (PHP-FCGI와 함께 작동 함) Nginx 솔루션을 선호합니다.

또한 HTTP 서버 플러그인이 필요한 이유를 이해하지 못하고 교육을 받고 싶습니다. Web Server Agnostic 솔루션 인 PHP를 가질 수 없습니다.

도움이 되었습니까?

해결책

당신이 필요한 것은 mod_auth_sspi 아파치 모듈.

샘플 구성 :

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

그리고 당신도 할 수 있다는 것을 잊지 마십시오 Windows 도메인에서 투명한 SSO에 Firefox를 사용하십시오: 간단히 가십시오 about:config, 검색 network.automatic-ntlm-auth.trusted-uris, 내부 응용 프로그램의 호스트 이름 또는 FQDN을 입력하십시오 (MyServer 또는 MyServer.corp.domain.com). 하나 이상의 항목을 가질 수 있습니다. 쉼표로 구분 된 목록입니다.

다른 팁

나는 OpenID를 이것을위한 백엔드로 사용하는 솔루션에 대해 궁금합니다 ... 나는 Googled (빨리) 할 때 Activedivedirectory에 직접 연결되는 것을 보지 못했습니다. 그러나 평범한 HTTP를 통해 구현하는 것은 매우 고통 스러울 수 있습니다 (지역 광고에 대한 자격 증명을 확인한 OpenID 제공 업체가 될 것입니다). 최상의 시나리오에서는 앱에 몇 가지 클래스를 추가하고 웹 서버 모듈이 필요하지 않아도됩니다. 이것의 어느 쪽이든 많은 오픈 소스 코드가 있으므로 다른 것이 없다면 살펴볼 가치가 있습니다. 백엔드를 사용자에게 노출 한 경우 (즉, OpenID URL을 제공 함) 이러한 자격 증명을 사용하여 내부 사이트보다 더 많은 내부 사이트에 로그인 할 수 있다는 이점이 추가 될 수 있습니다. (예 : 스택 오버플로)

제쳐두고, 나는 인터넷 익스플로러가 필요하기 위해 그것을 만드는 것에 반대 할 것입니다. 그것이 당신이 질문을 쓴 방식에서 목표인지 확실하지 않지만, IT 환경에 따라 Firefox 또는 Safari (또는 Opera 또는 ...)를 사용하는 사람들이 열정이 아니라고 기대합니다. (당신은 먼저 IE에 대항하지 않습니까, 당신은 내가 그렇게 할 때마다 고통 스러웠습니다.) 이것은 당신이 IE 의이 기능을 사용할 수 없다고 말하는 것이 아닙니다. . 당신이 게시 한 링크는 NTLM이 IE 이상으로 작동했다고 말했지만 경험이 없기 때문에 그것이 얼마나 잘 작동하는지 판단하기가 어렵습니다.

조직을 위해 해결해야 할 비슷한 문제가있었습니다.

나는 사용을 찾고 있었다 adldap.

사이트에 Active Directory를 사용하여 원활한 인증을 달성하기위한 문서가 있습니다.

귀하를위한 한 가지 옵션은 CAS (Central Authentication Service)를 사용하는 것입니다.

PHP 클라이언트 라이브러리가 있습니다.

MS Active Directory에 링크하는 방법 : http://www.ja-sig.org/wiki/display/casum/active+directory

그래도 Apache Maven 2가 필요합니다.

IIS/PHP FCGI의 경우 승인되지 않은 헤더를 보내야합니다.

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

그런 다음 다음과 같이 사용자 이름을 얻을 수 있습니다.

$winuser = $_SERVER["REMOTE_USER"];

그런 다음 $ winuser가 허용 사용자 데이터베이스에 있는지 확인합니다.

비정상적인 계정으로 확인하고 테스트하십시오. 내가 이것을 처음 설치했을 때 나는 그것을 테스트했고 잘 작동했지만 나중에 표준 비 서버 아드 민 사용자가 시도했을 때이 실패. 임시 디렉토리 중 일부는 게스트 사용자에게 권한을 변경해야합니다. 정확한 설정을 기억할 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top