簡體   English   中英

如何使用 Microsoft AD 為內部 PHP 應用程序實施單點登錄 (SSO)?

[英]How can I implement single sign-on (SSO) using Microsoft AD for an internal PHP app?

我隱約意識到在加入域的計算機上,可以要求 IE 發送一些額外的標頭,我可以使用這些標頭自動登錄到應用程序。 我有 apache 在帶有 mod_php 的 windows 服務器上運行。 我希望能夠避免用戶在必要時必須登錄。 我發現了一些談論 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 上運行。Apache2 和 windows 上的 php-cgi 可能是您可以在 8838236010511888 上配置的最慢的設置之一,它可能仍然像 888.8 一樣看起來像 888.8需要(它適用於 php-fcgi),但我更喜歡 nginx 解決方案。

我仍然不明白(並且很想接受教育)為什么 HTTP 服務器插件是必需的,我們不能有 PHP、web 服務器不可知的解決方案。

您只需要mod_auth_sspi Apache 模塊。

示例配置:

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 域中使用 Firefox 進行透明 SSO :只需將 go 設置為about:config ,搜索network.automatic-ntlm-auth.trusted-uris ,然后輸入您內部網絡的主機名或 FQDN應用程序(如 myserver 或 myserver.corp.domain.com)。 您可以有多個條目,它是一個以逗號分隔的列表。

我有一個類似的問題需要為我的組織解決。

我正在研究使用adLDAP

站點上也有一些文檔可以實現與 Active Directory 的無縫身份驗證。

我很好奇一個使用 OpenID 作為后端(某種)的解決方案......當我用谷歌搜索(快速)時,我沒有看到任何可以直接連接到 ActiveDirectory 的東西。 但是,通過純 HTTP(S) 實現可能非常輕松(您將是一個 OpenID 提供者,根據您的本地 AD 檢查憑據)。 在最好的情況下,您可能只需向您的應用程序添加幾個類,即可關閉並運行——不需要 web 服務器模塊。 這方面的任何一方都有很多開源代碼,所以如果不出意外,值得一看。 如果您向用戶公開后端(即給他們 OpenID URL),您將獲得額外的好處,即他們能夠使用這些憑據登錄到您的內部站點之外的其他站點。 (例如:堆棧溢出。)

順便說一句,我反對要求使用 Inte.net Explorer。 我不確定這是否是您編寫問題的方式的目標,但根據您的 IT 環境,我希望使用 Firefox 或 Safari(或 Opera 或...)的人不會那么熱情。 (您不會首先針對 IE 進行開發,是嗎?每當我這樣做時,這都很痛苦。)這並不是說您不能使用 IE 的這個功能,只是它不應該是唯一的選擇. 您發布的鏈接指出 NTLM 不僅僅適用於 IE,但由於我沒有任何經驗,因此很難判斷它的效果如何。

您的一種選擇是使用 CAS(中央身份驗證服務)。

它有 php 客戶端庫。

如何鏈接到 MS Active Directory: http://www.ja-sig.org/wiki/display/CASUM/Active+Directory

不過,您需要 Apache maven 2。

對於IIS/PHP FCGI,你需要發出未經授權的header:

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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM