Ошибка "Сервер не работает" при использовании классов UserPrincipal и PrincipalCotext
Я видел много ответов на эту проблему, но ни один из них не подходит мне. Я очень борюсь с аутентификацией AD. Ситуация выглядит так.
Мы выделили три контроллера домена. Мы хотим подключить правильный, чтобы мы не получили это исключение. Ситуация такова: на моей локальной машине я не сталкиваюсь с какими-либо проблемами, но при развертывании в IIS на сервере каждый раз, когда я аутентифицируюсь через AD, я получаю эту ошибку. Вот код, который я использую. Это после нескольких моих проверок исправлений и информации от Google и stackru:
public PrincipalContext GetPrincipalContext(string domainName, string userName, string password)
{
try
{
this.logger.Info("Connecting to LDAP");
var domainContext = new DirectoryContext(DirectoryContextType.Domain,userName, password);
var domain = Domain.GetDomain(domainContext);
var controller = domain.FindDomainController();
this.logger.Info("IP Address: {0}", controller.IPAddress);
this.logger.Info("Domain: {0}", controller.Domain.Name);
this.logger.Info("Controller name: {0}", controller.Name);
this.logger.Info("Site name: {0}", controller.SiteName);
this.logger.Info("Schema name: {0}", controller.Forest.Schema.Name);
var context = new PrincipalContext(ContextType.Domain, "makler.local", "DC=makler,DC=local");
this.logger.Info("context.ConnectedServer {0}", context.ConnectedServer);
this.logger.Info("context.Container {0}", context.Container);
this.logger.Info("context.ContextType {0}", context.ContextType);
this.logger.Info(" context.Options {0}", context.Options);
this.logger.Info("context.UserName {0}", context.UserName);
return context;
}
catch (Exception ex)
{
this.logger.Info("Could not connecto to LDAP: {0}", ex.Message);
throw new ApplicationException(string.Format("Could not connecto to LDAP: {0}", ex.Message));
}
}
Вот где я получаю UserPrincipal, чтобы у меня была некоторая информация о группах и тому подобное:
public UserPrincipal GetUserPrincipal(PrincipalContext principalContext, string userName)
{
try
{
this.logger.Info("Getting user principal, connected server {0}", principalContext.ConnectedServer);
return UserPrincipal.FindByIdentity(principalContext, userName);
}
catch (Exception ex)
{
this.logger.Info("GetUserPrincipal exception {0}", ex.Message);
throw new ApplicationException(string.Format("GetUserPrincipal exception {0}", ex.Message));
}
}
Когда я просматриваю пути журналов, кажется, что эта проблема исходит не от PrincipalContext, а от UserPrincipal. Есть много вещей, которые я не знаю об AD, но вот что я попробовал:
- Передача в качестве параметра IP-адреса
- Передача доменного имени, как вы видите в коде
- Я также попытался передать IP-адрес контроллера домена, который я на самом деле получаю из переменной контроллера.
Казалось, ничего не работает. Как я уже говорил, у нас есть три домена альфа. бета, гамма скажем. Независимо от того, что я пытаюсь, я всегда получаю исключение, что он пытается соединиться с Alfa. Есть идеи? Извините за длинный вопрос, но я старался быть как можно более конкретным. Я также могу сказать вам, что проблема исчезает, когда администраторы добавляют этот альфа-контроллер в брандмауэр, но это не очень хорошо. Мы зависим от того факта, что этот контроллер всегда будет жить, но что делать, когда он умрет? Я хотел бы, чтобы мое приложение, скажем, пуленепробиваемое в тот момент:)
пс. Я не хотел бы использовать подход DirectoryEntry, потому что он болезненный, так как я должен знать все вопросы запроса и т. Д. Если это будет единственный способ, то я был бы признателен за простое руководство по этому поводу, возможно, объясняя это шаг за шагом.