ASP.Net(IIS 7.5)查询没有用户凭据的Active Directory

时间:2011-12-20 23:15:21

标签: asp.net vb.net iis directoryentry

我有多个我为内联网构建的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身份验证之前,其他身份验证类型已被禁用。对于提供商,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设置? 我是否需要还原服务器更新并确定哪一个导致中断发生?

提前感谢您的建议。如果您有任何问题需要帮助回答这个问题,请告诉我。

更新

我尝试通过将以下剪辑添加到我的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部分中较高的字符串。这也不起作用(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实现,并且基本上从头开始,以查看问题是否重新创建。

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

2 个答案:

答案 0 :(得分: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中元数据库一部分的设置。

答案 1 :(得分: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没问题。

相关问题