У меня есть пользователи, которые входят в мое приложение через 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
Но это не работает. Вместо этого он выдает ошибку в первой строке сеанса, утверждая, что «DirectoryServicesCOMException не был обработан кодом пользователя. На сервере такого объекта нет».
Зачем? Я знаю, что даю ему действительное имя пользователя! Что-то странное происходит на кастинге сеанса? Код практически одинаков для каждого метода, за исключением того, что в одном методе вместо извлечения из заявки. Имя я извлекаю из переменной сеанса для имени входа, которое я буду искать с помощью AD.