[英]ASP.Net (IIS 7.5) Querying Active Directory without User Credentials
我有多個我為內聯網構建的Web應用程序。 我想讓用戶不必擔心登錄,因此這些應用程序會在當前登錄的用戶訪問網站時將其拉出。 我使用此代碼實現此目的:
Dim userName As String = User.Identity.Name
CurrentUser = userName.Substring(userName.IndexOf("\") + 1)
這就像一個魅力,這里沒有問題。 下一步是查詢該登錄用戶的Active Directory以提取各種信息。 我目前如何編碼,它的工作方式就像在devleopment方面的魅力(典型的是因為我沒有運行IIS)。
當我將其發布到我的IIS服務器(運行IIS 7.5的Windows Server 2008 R2)時出現問題,我收到的錯誤消息指向我的代碼中查詢Active Directory的特定行。 有趣的是,這些應用程序上周運行良好。 在我的服務器管理員執行了最新一批Windows更新后,他們破了(請注意,我使用.Net Framework 4.0運行它們)
在我為每個應用程序設置以便啟用Windows身份驗證之前,其他身份驗證類型已被禁用。 對於提供商,Negotiate是#1,NTLM是#2。 對於高級設置,請選中“擴展保護=關閉”和“啟用內核模式身份驗證”。
我的web.config有以下設置:
<customErrors mode="Off"/>
<authentication mode="Windows" />
<authorization>
<deny users="?"/>
</authorization>
這些是我的設置,一切都像魅力一樣。 現在要讓它有點工作我需要交換提供商,所以NTLM是#1,Negotiate是#2。 因此,用戶的憑據未正確傳入,並且AD查詢失敗。 這是我用於查詢的編碼:
Dim adSearchRoot As New DirectoryEntry("LDAP://DC=[DOMAIN],DC=com")
Dim adSearch As New DirectorySearcher(adSearchRoot)
adSearch.Filter = "(&(ObjectClass=User)(sAMAccountName=" & CurrentUser & "))"
Dim searchResult As SearchResult = adSearch.FindOne()
自更新以來,當前面的Negotiate加載網站時,它在底線上失敗,因為我沒有為DirectoryEntry設置用戶名/密碼。 即使我設置了用戶名/密碼,它仍然不像過去那樣100%工作。
所以我的問題變成了,我需要做什么才能讓用戶訪問網站,我可以知道他們的用戶名,並且可以查詢活動目錄而無需在DirectoryEntry中使用用戶名/密碼?
它是IIS中的設置嗎? 或者我需要重新編碼? 也許是web.config設置? 我是否需要還原服務器更新並確定哪一個導致中斷發生?
感謝您的建議。 如果您有任何問題要幫助回答這個問題,請告訴我。
UPDATE
我嘗試通過將以下剪輯添加到我的web.config文件中來建議Matt:
<security>
<authorization>
<add accessType="Deny" users="?" />
</authorization>
</security>
這沒用。 我做了一些閱讀,然后進一步修改了這一部分:
<location path="Default Web Site/NameOfApp">
<system.webServer>
<security>
<authentication>
<anonymousAuthentication enabled="false"/>
<windowsAuthentication enabled="true">
<providers>
<add value="Negotiate" />
<add value="NTLM" />
</providers>
</windowsAuthentication>
</authentication>
<authorization>
<add accessType="Deny" users="?" />
</authorization>
</security>
</system.webServer>
</location>
在這樣做的過程中,我還刪除了web.config部分中較高的字符串。 這也不起作用(fyi,這是一個很好的參考http://www.iis.net/ConfigReference/system.webServer/security/authentication )
然后我跳過這篇文章: http : //social.technet.microsoft.com/Forums/en/winserverDS/thread/7deba16b-295a-4887-98f9-9f291ed49871 ,這似乎是一個類似的情況。 本文最后引用了“Double Hops”,在研究了這個並嘗試了一些事情之后,這也沒有解決我的問題。
下一步
我將在不同的Server 2008 R2系統上嘗試新的IIS 7.5實現,並且基本上從頭開始,以查看問題是否重新創建。
任何新的建議都會有很大的幫助。
我能夠在Windows 2008 Server上執行代碼而不會出現任何問題。 我創建了一個新的.NET 4.0應用程序池並將其分配給Web應用程序。 我更改了web.config以拒絕匿名訪問並使用Windows身份驗證。 代碼執行無例外。
看看你的web.config剪輯,我想知道這可能是你所缺少的:
<system.webServer>
<security>
<authorization>
<add accessType="Deny" users="?" />
</authorization>
</security>
</system.webServer>
在system.webServer部分中擁有此授權部分非常重要。 IIS 7使用system.webServer部分存儲一些屬於IIS 6中元數據庫的設置。
我有同樣的問題。 這是我解決它的方式:
對DirectoryEntry構造函數使用重載4 of 5,它不僅允許路徑,還允許用戶名和密碼。 因此,您的AD連接應如下所示:
DirectoryEntry adSearchRoot = new DirectoryEntry("LDAP://DC=[DOMAIN],DC=com", "DOMAIN\Username", "Password");
DirectorySearcher adSearch = new DirectorySearcher(entry);
現在,使用服務帳戶代替“DOMAIN \\ Username”,然后使用密碼,顯然,使用服務帳戶的密碼。
我認為只要服務帳戶是“域用戶”組的成員,那么您應該能夠查詢AD沒問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.