2011-12-06 45 views
8

我想要做的事:禁用登錄提示符mod_auth_sspi_1.0.4-2.2.2

  • 創建對我們公司的內部網的主頁,可以自動抓取登錄的人觀看的Windows用戶名頁面沒有當頁面加載時提示此人輸入這些憑證。

  • 目前,我只是想讓它抓住本地用戶名,因爲在我們的IT人員獲得域名安裝之前,我們需要一段時間。例如,現在我希望它在沒有任何提示的情況下捕獲「(PC-Name)\ windows.user.name」。

環境:

  • 的Apache 2.2.21在Windows 7 64位系統(將在CentOS,一旦它在生產)。

  • PHP 5.3.8(VC9-ZTS)。

  • Internet Explorer 9.0.8x和Firefox 6.0.2(稍後會擔心Chrome)。

  • 當前測試頁面只是一個調用print_r($ _SERVER)的PHP腳本。

  • 爲了簡單起見,我測試的目錄不是VirtualHost。

步驟我已經採取迄今:

  • 從SourceForge下載mod_sspi_1.0.4-2.2.2並萃取mod_auth_sspi.so到Apache的模塊目錄中。

  • 添加的模塊聲明:

    的LoadModule sspi_auth_module模塊/ mod_auth_sspi.so

  • 添加的目錄定義:

    的AllowOverride無 選項無 訂購允許,拒絕 所有允許

    AuthName "My Intranet" 
    AuthType SSPI 
    SSPIAuth On 
    SSPIAuthoritative Off 
    
    require valid-user 
    
    配置和network.automatic-NTLM身份auth.trusted-URI的設置PHP腳本的絕對URL路徑,然後重新啓動Firefox中:

  • 通過將大約啓用在Firefox中集成身份驗證。

  • 我還沒有在IE中做過同樣的步驟,但我會一次讓Firefox工作,因爲這是我們主要支持的瀏覽器內部。

  • 重新啓動Apache並嘗試加載測試PHP腳本。

結果:

  • 在IE和Firefox,我得到提示頁面加載之前用戶名和密碼。我不想要那個提示。我想要在沒有提示的情況下自動檢測用戶名。

故障處理迄今:

  • 我試圖通過各種SSPI選項,如authritative開/關和諸如此類的東西循環。沒有效果。

  • 如果我刪除「require valid-user」,但沒有傳遞用戶名(不是NULL;簡單地不在數組期間中設置),則不會再出現提示。

  • 如果我在提示符上點擊「取消」,我會看到標準的「需要驗證」頁面。

  • 如果我輸入了無效的用戶名或正確的用戶名,但輸入了錯誤的密碼,頁面將會加載,但用戶名將是「(PC-Name)\ Guest」。

  • 如果我輸入正確的用戶名/密碼,則會顯示用戶名而不是Guest。

  • 一旦我在IE或Firefox中輸入用戶名/密碼,瀏覽器會記住後續頁面上的用戶名,直到我清除存儲的密碼緩存或重新啓動瀏覽器。

  • 我已經花了最近3個小時谷歌搜索和隨機猜測。零成功。我發現了幾個人問起這個問題的一些孤立的論壇帖子,但要麼他們沒有回答,要麼提供了我已經嘗試過但沒有成功的解決方案。

再次,我要的是爲頁面加載,沒有任何提示,並顯示在$ _SERVER陣列輸出的當前登錄的Windows用戶名。

據我所知,這可能是:Windows配置問題,Apache配置問題或瀏覽器配置問題。除此之外,我是新鮮的想法。

我將非常感謝您提供的任何幫助。謝謝!

- 克里斯

+0

對不起,沒有完全閱讀上面,你正在一個窗口站。 – ehime

回答

7

花了幾天時間,但我終於明白了我自己的想法。顯然,描述Firefox about:config設置的各種文檔和教程都是錯誤的。他們聲稱必須包含完整的URI,包括協議前綴。事實證明,情況恰恰相反。作爲在黑暗中的隨機鏡頭,我嘗試將它設置爲「localhost」(測試服務器運行的域)。瞧!這解決了它!另一方面,「http:// localhost」導致其中斷。

一旦我得到它在Firefox中的工作,驗證服務器端配置是正確的,將它應用到IE和Chrome是一個小問題。對於IE,我只是在「Intranet」區域添加了「http:// localhost」(在這種情況下,您確實需要協議前綴)。而且由於Chrome使用了與IE使用相同的網絡設置,因此該步驟對兩種瀏覽器都有效。

就服務器端配置而言,它看起來像我從一開始就有這個權利。我能夠把它簡化一下,雖然如此,您實際上只在目錄塊需要的是這樣的:

AuthName "Whatever you want to call your intranet" 
AuthType SSPI 
SSPIAuth On 

require valid-user 

採用這種設置,如果你指向一個PHP腳本做的print_r($ _ SERVER),該輸出將包含類似:

[REMOTE_USER] => dev-kdc-pc01\kris.craig 
[AUTH_TYPE] => NTLM 
[PHP_AUTH_USER] => dev-kdc-pc01\kris.craig 

如果你想擺脫域部分(即「DEV-KDC-PC01 \」),你可以解析它在PHP或加入這一行你的SSPI東西在上面提到的httpd.conf中的目錄塊中:

SSPIOmitDomain On 

請注意,我只在Apache webserver在本地主機上運行的Windows系統上進行了測試。我還沒有在Apache服務器在Linux上運行的情況下對它進行測試,儘管這不會對結果產生任何影響,因爲服務器只是接受瀏覽器發送的任何內容。這也要求客戶端運行Windows或其他SSPI兼容環境。我還沒有確定如何爲使用Mac的員工開展這項工作。

另外請注意,我已經成功地在而不是目前有一個域配置的網絡上進行測試。根據其他地方發表的文章,在作爲域成員的工作站上,行爲應該是相同的。

我希望這有助於!謝謝!

+0

嘗試了一切,你的解決方案也不能幫助我... – Somnium

0

這可能是一個部分的答案。

BOOL WINAPI GetUserName(
    __out LPTSTR lpBuffer, 
    __inout LPDWORD lpnSize 
); 

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724432%28v=vs.85%29.aspx

看起來你可以使用這個系統獲取信息,另一半可能是 使用Perl或Python刮信息自動化處理,然後將其發佈到PHP。

這是在Windows中獲取SysInfo的概要。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724426%28v=vs.85%29.aspx

老實說,這是一個非常簡單的事情,與PECL/PAM做,如果你使用的是Linux。

+0

這不一定是運行客戶端,但?服務器最終將運行CentOS,並基本上只接受瀏覽器聲稱的憑據。 –