ARES資通電子報

技術交流

PHP5 & Apache 集成 Windows AD 帳號認證

文 - 蘭江濤

引言

由於 Windows AD Server被廣泛應用,為了讓使用者記憶更少的密碼,防止密碼忘記,越來越多企業的應用系統(如 HRMS / ERP / CRM 等)都是基於 Windows AD 來做認證。單點登錄 ( Single Sign-on ) 在企業中的應用越來越普遍。也有很多商業化產品 ( Commercial Products ) 來實現SSO,如 Oracle 的 IAS Server等等。

本文我們主要討論 資通電腦 ARES 的 eHR 系統,一個基於 Open Source 的解決方案,雖然沒有商業化產品功能強大,但是也基本實現了類似 SSO 的認證機制。接下來我們就來討論 Windows 2003 Server 上 PHP5、Apache2 如何集成 Windows AD 認證,實現類似 SSO 認證。

開始
首先我們來看基於 Windows AD 認證的原理。
某個系統要採用 Windows AD Account 認證時,必須要用當前 Login OS 的 Domain Account 和 eHR 系統使用者表中實際的系統使用者做對應,如果能夠對應到相應的使用者就用此使用者自動 Login,並挑其相關的系統許可權。

這裡沒有看到有關 Password 的驗證,是因為 OS 已經幫我們做了這項工作,所以這裡不需要再驗證密碼了。

Server Side Configure
Apache Server 本身沒有集成 Windows AD 的 Module,必須要載入協力廠商的 Module 才可以實現此功能,這個協力廠商的 Module 名稱是 mod_auth_ssip.so 可以從著名的開源軟體網站 sourceforge.net 上取得,最新版本是 1.0.4。安裝及配置的步驟如下:

1)從 http://sourceforge.net/projects/mod-auth-sspi 下載解壓
2) Copy mod_auth_ssip.so 到 $APACHE_HOME/modules/ ( $APACHE_HOME 是 apache 安裝的根目錄)
3)打開 $APACHE_HOME/conf/httpd.conf, 在大約 Line 69
 LoadModule asis_module modules/mod_asis.so
 的下面加上如下代碼
 LoadModule sspi_auth_module modules/mod_auth_sspi.so
4) Restart Apache Server.
 Client Side Configure
 在需要驗證的目錄下新建一個 .htaccess 的 file. File 內容如下:

AuthName "eHR System"
AuthType SSPI
SSPIAuth On
SSPIAuthoritative On
require valid-user
ErrorDocument 401 "<script>alert('Your Account or Password is Error. \r\nClick [OK] button System will redirect to eHR login screen automaticlly.');</script> <meta http-equiv='refresh' content='0;url= ../ess/'/>"


這是要調用 mod_auth_ssip.so 必須的幾項設定,更多的選項請參考上面解壓目錄裡的 /doc INSTALL.

這個檔裡的內容也可以放在上面的 httpd.conf 檔中,根據你個人的喜好,如果不想改 Server 的配置,或是你沒有許可權更新 Server 的 Config 檔的時候可以採用上面的方式。

PHP 程式

// index.php
<?php
if (isset ( $_SERVER ['REMOTE_USER'] ) && ! empty ( $_SERVER ['REMOTE_USER'] )) {
session_start ();
header ( 'Location: ../ess/includes/login.php?remote_user=' . urlencode ( $_SERVER ['REMOTE_USER'] ) . '&sessid=' . session_id () );
exit ();
} else {
header ( 'Location: ../ess/' );
exit ();
} // end if
?>


我們把程式放在需要驗證的根目錄,並命名為 index.php,當運行此目錄時,首先就會調用此程式。

這裡需要說明的是,$_SERVER[‘REMOTE_USER’] 這個 Supper Global 變數只有在 Apache 在 Load mod_auth_sspi.so 之後才會有。

注意事項:
1.使用 .htaccess 方式時,PHP的 curl 模組一定要打開,在 php.ini 中尋找
;extension=php_curl.dll
把前面的分號去掉。

2.選擇合適的 apache 和 mod_auth_sspi.so 版本。
已知的 Issue mod_auth_sspi.so 1.0.4 + Apache2.x 時,在Server 是 windows XP 或 Windows Server 2003 平臺,IE 下面會無法提交 Post 變數。也就是說通過 mod_auth_sspi 來認證後的其它頁無法進行POST,在 PHP 程式裡無法得到 POST 的變數,所以在使用之前請改在 Get 方式。

3.訪問請用主機名稱稱或是功能變數名稱,不要用 IP 來訪問,否則系統每次都 Popup 出輸入 AD 帳號和密碼的 Dialog Window.

4.打開IE 的Automatic logon with current user and password,Internet Options->Security->Customer Level->User Authentication如下圖:


勾選後就第一次會提示輸入 AD Account 和 Password,像 SSO 一樣,之後就會自動 Login .

限於篇幅,具體系統中如何拿 AD Account 和 eHR系統使用者做匹配驗證就不做詳細說明,如有興趣瞭解細節,請期待下一期資通電子報。