我为我们的 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 实现,并且基本上从头开始,看看问题是否会重现。
任何新的建议都会有很大帮助。