4

我为我们的 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 实现,并且基本上从头开始,看看问题是否会重现。

任何新的建议都会有很大帮助。

4

2 回答 2

1

我能够在 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 中元数据库的一部分。

于 2011-12-29T22:08:36.073 回答
0

我有同样的问题。这是我解决它的方法:

对 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 没有问题。

于 2012-04-10T19:37:24.303 回答