【问题标题】:ASP.Net (IIS 7.5) Querying Active Directory without User CredentialsASP.Net (IIS 7.5) 在没有用户凭据的情况下查询 Active Directory
【发布时间】: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


【解决方案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 中元数据库的一部分。

【讨论】:

  • 我将此代码添加到应用程序的 web.config 文件的 system.webServer 部分。这并没有改变什么。如果我在 DirectorySearcher 字符串上添加用户名/密码,我仍然可以让它工作。我今天没有更多时间看它,但我明天会玩弄它。你至少给了我一些新的玩意!
  • 您是否尝试过更改运行应用程序池的用户?您不想保持这种方式,但您可能想看看如果您提供域管理员帐户会发生什么。这会告诉你这是否是权限问题。
  • 不,我明天试试。
  • 我还没有试一试,仍然有问题(不想让这个线程挂起),但工作太忙,无法弄清楚......会到达那里最终。
【解决方案2】:

我遇到了同样的问题。以下是我的解决方法:

对 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应该是没问题的。

【讨论】:

  • 问题在于,整个问题是不需要输入用户名/密码。正如我所说,我让它在没有用户名/密码的情况下工作,然后在没有通知的情况下停止工作。尤其是在 IIS 6 中,我能够毫无问题地让它工作。感谢您的努力:)
  • 好吧,我采用的方法(我发布的方法)不需要用户提供用户名和密码。它使用专门为此活动目录查询目的创建的硬编码服务帐户。我知道这不是最好的方法,但这是我能想出的使用 IIS 7.5 解决它的唯一解决方案。是的...IIS 6 更加宽松。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多