【发布时间】:2011-12-20 23:15:21
【问题描述】:
我为我们的 Intranet 构建了多个 Web 应用程序。我想让用户不用担心登录,所以这些应用程序在访问站点时会拉出当前登录的用户。我使用此代码来实现这一点:
Dim userName As String = User.Identity.Name
CurrentUser = userName.Substring(userName.IndexOf("\") + 1)
这就像一个魅力,在这里没有问题。下一步是查询该登录用户的 Active Directory 以提取各种信息。我目前如何对其进行编码,它在开发方面就像一个魅力(很典型,因为我没有运行 IIS)。
当我将它发布到我的 IIS 服务器(运行 IIS 7.5 的 Windows Server 2008 R2)时,问题就出现了,我收到指向我的代码中查询 Active Directory 的特定行的错误消息。有趣的是,这些应用程序上周运行良好。在我的服务器管理员完成最新一批 Windows 更新后,它们崩溃了(请注意,我使用 .Net Framework 4.0 运行它们)
在我设置每个应用程序以启用 Windows 身份验证之前,其他身份验证类型被禁用。对于提供商,协商是#1,NTLM 是#2。对于 Advanced Settings,Extended Protection = Off,并选中 Enable Kernel-mode authentication。
我的 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 设置也许? 我是否需要恢复服务器更新并找出导致中断发生的原因?
提前感谢您的建议。如果您有任何问题可以帮助回答问题,请告诉我。
更新
我尝试按照 Matt 的建议,将以下剪辑添加到我的 web.config 文件中:
<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 部分中较高的字符串。这也不起作用(仅供参考,这是一个很好的参考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 实施,基本上从头开始,看看问题是否会重现。
任何新的建议都会有很大帮助。
【问题讨论】:
-
今天早上我决定尝试让它在我的运行 IIS 6.0 的 Windows Server 2003 R2 机器上运行。设置它并让它像它应该工作的那样工作非常容易。首先,我创建了一个应用程序池,以便该 Web 实例可以在它自己的实例上运行 .Net Framework 4,而不是与另一个应用程序池共享(否则会出现错误)。然后我在正确的网站下创建了一个虚拟目录。身份验证设置为没有匿名访问的集成 Windows 身份验证。有了这些设置,它就像一个魅力......现在我需要让 Server 08 工作。
标签: asp.net vb.net iis directoryentry