2

У меня есть веб-приложение (.NET 3.5), которое отправляет уведомления по электронной почте пользователям. Для этого я ищу Active Directory, чтобы найти электронное письмо каждого человека.Как использовать зарегистрированные персональные данные для поиска в Active Directory?

На данный момент, я жестко прописывать свое собственное имя пользователя и пароль, как это для того, чтобы найти AD:

Dim entry As New DirectoryEntry("LDAP://companyad", "myUsername", "myPassword", AuthenticationTypes.Secure) 
    Dim srch As New DirectorySearcher(entry) 
    srch.Filter = [String].Format("(&(objectClass=person)(sAMAccountName={0}))", "someOtherUsername") 
    Dim result As SearchResult = srch.FindOne() 

Теперь, очевидно, это не является идеальным, и я не хочу, чтобы эти полномочия жёстко. В моем веб-приложении используется проверка подлинности Windows. Он также использует олицетворение (как зарегистрированный пользователь) для доступа к файлам и SQL Server. Есть ли способ для меня «олицетворять» зарегистрированного пользователя для поиска AD?

EDIT 1

Я думал, что лучше объяснить, почему я выбрал этот ответ. Проблема оказалась не в проблемах с несколькими перелетами или в кеберосах, поскольку, кажется, я правильно их установил.

Я недавно изменил свое приложение, чтобы разрешить доступ только к определенной группе через настройки web.config. Раньше я только разрешал доступ к себе. Я создал группу и добавил к ней. Затем я удалил жестко установленные учетные данные и попытался запустить приложение БЕЗ ВОССТАНОВЛЕНИЯ моего компьютера.

В соответствии с моим сетевым администратором, я бы не вошел в систему под этой новой группой, пока не перезапустил компьютер, который, по моему мнению, является причиной моей проблемы. Итак, ответ Preet на самом деле самый точный, поскольку мне просто нужно было пройти путь LDAP к DirectoryEntry.

EDIT 2

Я также необходимо зарегистрировать имя участника службы.

Я побежал это:

setspn -A HTTP/[dns name of the site] [machine name] 

на моей машине развития.

Спасибо всем остальным за их ответы.

ответ

0

ли не

Dim entry As New DirectoryEntry("LDAP://companyad") 

работу?

+0

К сожалению, нет. Я получаю это исключение: «Тип: System.Runtime.InteropServices.COMException, mscorlib, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089 Сообщение: произошла ошибка операций." Полезно, да? – Andrew

+0

Проверьте, что он говорит в журнале событий. –

0

Почему бы не создать нового пользователя для этой цели в одиночку? Пользователь с правами только поиска.

+0

Я предполагаю, что этот вариант будет моим последним средством. Кроме того, это политика компании для всех паролей, которые будут сбрасываться каждый месяц, что означало бы, что мне придется менять пароль в приложении каждый месяц. – Andrew

+0

Ах !!! :) даже у нас есть политика, но исключения существуют для особых случаев. – Shoban

+0

Ха-ха, да, если дело доходит до этого, я надеюсь, что мой босс будет достаточно гибким, чтобы его разместить. – Andrew

0

Я установил < identity impersonate = "true"/> в свой web.config и добавил следующий код к моему обработчику событий моей страницы. Он работал нормально. Вы уверены, что не имеете дело с ситуацией с несколькими прыжками? В этом случае ваша учетная запись пула приложений должна быть настроена для проверки подлинности Kerberos для поддержки олицетворения в сценарии многопользовательской игры.Более подробную информацию об этом здесь: http://support.microsoft.com/kb/329986

Response.Write(User.Identity.Name); 
DirectoryEntry entry = new DirectoryEntry("LDAP://[mydomain.net]"); 
DirectorySearcher srch = new DirectorySearcher(entry); 
srch.Filter = string.Format("(&(objectClass=person)(sAMAccountName={0}))", "[user]"); 
SearchResult result = srch.FindOne(); 
Response.Write(result.Path); 
0

Если вы хотите использовать Windows, зарегистрированным в учетной записи пользователя в качестве учетных данных в отношении AD, вы должны использовать следующее:

public bool IsExistingUser() { 
    DirectoryEntry de = new DirectoryEntry(Environment.UserDomainName) 
    DirectorySearcher ds = new DirectorySearcher(de) 
    ds.Filter = string.Format("((objectClass=user)(SAMAccountName={0}))", Environment.UserName) 

    try 
     SearchResult sr = ds.FindOne(); 
     if (sr != null && sr.DirectoryEntry.Name.Contains(Environment.UserName)) 
      return true; 
    catch (DirectoryServicesCOMException ex) 
    catch (COMException ex) 
     throw new Exception("Can't find logged in user in AD", ex); 

    return false; 
} 

Предполагая, что этот код будет компиляции и запуска, он будет проверять, знает ли существующий зарегистрированный пользователь вашим контроллером домена.

Олицетворение обескуражено, так как оно позволяет перемещать строки переполнения в вашей сети. Поэтому старайтесь избегать его как можно больше.

EDIT Вот довольно полезная ссылка для AD: Howto: (Almost) Everything In Active Directory via C# Я нашел этот пост потрясающим!

Смежные вопросы