在ASP.NET中查询LDAP DirectoryEntry时出现问题

在ASP.NET中查询LDAP DirectoryEntry时出现问题,asp.net,active-directory,ldap,session-variables,Asp.net,Active Directory,Ldap,Session Variables,我让用户通过Active Directory登录到我的应用程序,然后从他们的广告信息中获取关于该用户的信息,如下所示: Dim ID as FormsIdentity = DirectCast(User.Identity, FormsIdentity) Dim ticket as FormsAuthenticationTicket = ID.Ticket Dim adDirectory as New DirectoryEntry("LDAP://DC=my,DC=domain,DC=com")

我让用户通过Active Directory登录到我的应用程序,然后从他们的广告信息中获取关于该用户的信息,如下所示:

Dim ID as FormsIdentity = DirectCast(User.Identity, FormsIdentity)
Dim ticket as FormsAuthenticationTicket = ID.Ticket
Dim adDirectory as New DirectoryEntry("LDAP://DC=my,DC=domain,DC=com")
Dim adTicketID as String = ticket.Name.Substring(0, 5)
Session("people_id") = adDirectory.Children.Find("CN=" & adTicketID).Properties("employeeID").Value
Session("person_name") = adDirectory.Children.Find("CN=" & adTicketID).Properties("displayName").Value
现在,我希望能够模拟其他用户……这样我就可以像他们一样“测试”应用程序,所以我在页面上添加了一个文本框和一个按钮,当单击按钮时,文本被分配给一个会话变量,如下所示:

 Session("impersonate_user") = TextBox1.Text
If CStr(Session("impersonate_user")) <> "" Then
  Dim adDirectory as New DirectoryEntry(LDAP://DC=my,DC=domain,DC=com")
  Dim adTicketID as String = CStr(Session("impersonate_user"))
  Session("people_id") = adDirectory.Children.Find("CN=" & adTicketID).Properties("employeeID").Value
  Session("person_name")= adDirectory.Children.Find("CN=" & adTicketID).Properties("displayName").Value
Else
  [use the actual ticket.name to get this info.]
End If
重新加载页面时,我会检查会话(“模拟用户”)是否具有“”以外的值,然后尝试使用此会话变量查询Active Directory,如下所示:

 Session("impersonate_user") = TextBox1.Text
If CStr(Session("impersonate_user")) <> "" Then
  Dim adDirectory as New DirectoryEntry(LDAP://DC=my,DC=domain,DC=com")
  Dim adTicketID as String = CStr(Session("impersonate_user"))
  Session("people_id") = adDirectory.Children.Find("CN=" & adTicketID).Properties("employeeID").Value
  Session("person_name")= adDirectory.Children.Find("CN=" & adTicketID).Properties("displayName").Value
Else
  [use the actual ticket.name to get this info.]
End If
如果CStr(会话(“模拟用户”)”),则
Dim adDirectory作为新目录条目(LDAP://DC=my,DC=domain,DC=com)
Dim ADTICKTID as String=CStr(会话(“模拟用户”))
Session(“people_id”)=adDirectory.Children.Find(“CN=”&adTicketID.Properties(“employeeID”).Value
Session(“person_name”)=adDirectory.Children.Find(“CN=”&adTicketID.Properties(“displayName”).Value
其他的
[使用实际ticket.name获取此信息。]
如果结束
但这不起作用。相反,它在第一个会话行上抛出一个错误,声明“DirectoryServicesCOMException未由用户代码处理,服务器上没有这样的对象。”
为什么?我知道我给了它一个有效的用户名!在会话的强制转换过程中是否发生了一些奇怪的事情?每个方法之间的代码基本上是相同的,只是在一个方法中,而不是从票证中提取。我从会话变量中提取名称,用于我将使用AD查找的登录名。

可能是进程运行时使用的标识需要访问active directory的权限。您可以通过更改应用程序在IIS应用程序池中运行时所使用的标识来执行此操作


文本框中输入了什么?

可能进程运行时所使用的标识需要访问active directory的权限。您可以通过在IIS应用程序池中更改应用程序运行时所使用的标识来完成此操作


文本框中输入了什么?

Hmmm…但是当我将adTicketID设置为ticket.name时,广告查询工作正常,但当我将其设置为CStr(会话(“模拟用户”))时,它就不工作了。在本例中,我要“验证”应用程序的登录名可能是bj442,文本框可能包含相同的“bj442”或其他人(“rj442”)嗯……但当我将adTicketID设置为ticket.name时,广告查询工作正常,但当我将其设置为CStr(会话(“模拟用户”))时,广告查询就不起作用了。在本例中,我要“验证”应用程序的登录名可能是bj442,文本框可能包含相同的“bj442”或其他人(“rj442”)