【问题标题】:Issue Querying LDAP DirectoryEntry in ASP.NET在 ASP.NET 中查询 LDAP DirectoryEntry 的问题
【发布时间】:2010-04-27 20:36:43
【问题描述】:

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

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

当页面重新加载时,我检查 Session("impersonate_user") 是否具有 "" 以外的值,然后尝试使用此会话变量查询 Active Directory,如下所示:

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

但这不起作用。相反,它会在第一个 Session 行抛出一个错误,指出“DirectoryServicesCOMException 未被用户代码处理服务器上没有这样的对象”。 为什么?我知道我给了它一个有效的用户名!会议的选角是否发生了一些奇怪的事情?每种方法之间的代码基本上是相同的,除了在一个方法中而不是从票证中提取。名称我从会话变量中提取我将使用 AD 查找的登录名。

【问题讨论】:

    标签: asp.net active-directory ldap session-variables


    【解决方案1】:

    也许您的进程正在运行的身份需要访问活动目录的权限。您可以通过更改您的应用程序在 IIS 应用程序池中运行的身份来做到这一点。

    在文本框中输入了什么?

    【讨论】:

    • 嗯...但是当我将 adTicketID 设置为 ticket.name 时,AD 查询工作正常,当我将其设置为 CStr(Session("impersonate_user")) 时它就不起作用了。在此示例中,我将“验证”应用程序的登录名可能是 bj442,文本框可能包含相同的“bj442”或其他人(“rj442”)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多