【发布时间】: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