2016-05-04 25 views
2

我有一個IIS應用程序(AngularJS和PHP),身份驗證使用Windows身份驗證(禁用匿名身份驗證)。我想有一個按鈕,無論何時單擊,將查找活動目錄用戶。在登錄是否有可能將LDAP與當前登錄的用戶綁定到PHP?

$ldap_server = "ldap://MyDomain.local"; 
$auth_user = "[email protected]"; 
$auth_pass = "myPass"; 
$base_dn = "OU=MyDomain, DC=MyDomain, DC=local"; 
$filter = "(&(objectClass=user)(objectCategory=person)(cn=*))"; 

if (!([email protected]_connect($ldap_server))) { 
    die("Could not connect to ldap server"); 
} 

if (!([email protected]_bind($connect, $auth_user, $auth_pass))) { 
    die("Unable to bind to server: ". ldap_error($connect) . " (" . ldap_errno($connect) . ")"); 
} 

if (!([email protected]_search($connect, $base_dn, $filter))) { 
    die("Unable to search ldap server: ". ldap_error($connect) . " (" . ldap_errno($connect) . ")"); 
} 

然而,用戶已經提供的憑證時(通過IIS Windows身份驗證),我想使用相同的用戶憑據(或實際模擬用戶):它與下面的代碼成功的作品。 我可以在不詢問用戶名和密碼的情況下這樣做嗎?

我試圖讓服務器的變量({$ _ SERVER [ 'AUTH_USER']}{$ _ SERVER [ 'AUTH_PASSWORD']})。只有用戶被填充(有意義...)。

我也試圖跳過的ldap_bind(),只與調用它$連接參數,但我總是得到同樣的錯誤: 無法搜索LDAP服務器:操作錯誤(1)

當然,我可以在PHP中存儲專用的用戶名+密碼,但希望避免這種情況,並使用已登錄的用戶身份驗證。

謝謝!

+0

哎喲。通常,服務器甚至不會看到用戶密碼(取決於IIS,瀏覽器,客戶機的配置),而是使用Kerberos。此時事情開始變得棘手。您可以授予用戶IIS(通常是計算機)下運行的標誌「可信任委派」。但即使如此,PHP不支持GSSAPI綁定。所以你在那裏運氣不好。 –

+0

謝謝@Johannes。我感到奇怪的是,我正在使用經過驗證的用戶上下文運行,該用戶上下文具有搜索活動目錄的所有權限,但我需要再次詢問憑據。感覺就像我們錯過了什麼...... – Elad

+0

我有同樣的需要,我覺得我已經走過這條路。第一步是將IIS配置爲使用模擬。這使得在Web服務器上運行的PHP程序可以使用來自客戶端工作站的安全令牌,在該工作站中,用戶已經通過了Windows身份驗證,而不是運行Web服務器的通用安全上下文。它允許Web服務器「模擬」工作站用戶。它適用於Web服務器本身的資源。下一步被稱爲「授權」,並在網絡上的許多地方進行了描述。搜索「double hop delegation kerberos」 –

回答

1

您可以使用以下PHP + Powershell解決方案在服務器端實現LDAP和其他類型的通信。下面的代碼示例讓我顯示或隱藏基於LOGON_USER網頁內容(NG-如果是AngularJS指示,我用它來顯示/隱藏的內容):

PHP:

<span ng-if="<?php $ADUserName = $_SERVER['LOGON_USER'];$output = shell_exec('powershell -file chkgrp.ps1 -ADUserName "'.$ADUserName.'"');echo $output; ?>">YOUR HTML CODE</span> 

chkgrp名爲.ps1:

Param([string]$ADUserName); Import-Module ActiveDirectory; $User=$ADUserName.split("\")[1]; $Group="YOUR GROUP"; $Members = Get-ADGroupMember -Identity $Group -Recursive | Select -ExpandProperty SamAccountName; If ($Members -contains $User) {write-output "true"} Else {write-output "false"} 

-CJ

+0

謝謝@Cyber​​Jam。這有點有用,但有點笨拙,並帶來安全風險(shell_exec)。另外,每次服務器端調用發生時產生一個PowerShell進程都會引入性能問題。 – Elad

+0

哦,順便說一句,我剛剛意識到,傳遞LOGON_USER變量甚至不需要,因爲模擬在這裏起作用,所以Powershell將知道域\用戶名。我同意安全性和性能也必須考慮並優先考慮。 – CyberJam

相關問題