Система.Каталог - сервер не работает
Я получаю сообщение об ошибке на веб-сайте, на котором я использую проверку подлинности Windows.
странные вещи:
- происходит только если пользователь еще не сохранен в базе данных (новых неизвестных пользователей)
- появляется только на живой системе, все в порядке на локальной среде разработки
Это то, что я получаю в Почте журнала:
Источник : Системы.DirectoryServices
сообщение: сервер не оперативный.
трассировка:
в системе.DirectoryServices.Класс directoryentry.Bind (Boolean throwIfFail)
в системе.DirectoryServices.Класс directoryentry.Bind ()
в системе.DirectoryServices.Класс directoryentry.get_AdsObject()
в системе.DirectoryServices.Directorysearcher с.FindAll (Boolean findMoreThanOne)
в системе.DirectoryServices.Directorysearcher с.FindOne()
в Смартхаусе.Лаборатории.Доступа к данным.UserListManager.SaveUser (строка windowsUserName)
вот как я реализую DirectorySearch:
private void SaveUser(string windowsUserName)
{
string[] domainAndUser = windowsUserName.Split('');
string domain = domainAndUser[0];
string username = domainAndUser[1];
DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain);
DirectorySearcher search = new DirectorySearcher(entry);
try
{
// Bind to the native AdsObject to force authentication.
search.Filter = "(SAMAccountName=" + username + ")";
search.PropertiesToLoad.Add("cn");
search.PropertiesToLoad.Add("sn");
search.PropertiesToLoad.Add("givenName");
search.PropertiesToLoad.Add("mail");
SearchResult result = search.FindOne();
if (result == null)
{
throw new Exception("No results found in Windows authentication.");
}
User userToSave = new User();
userToSave.FirstName = (String) result.Properties["givenName"][0];
userToSave.LastName = (String) result.Properties["sn"][0];
userToSave.Email = (String) result.Properties["mail"][0];
userToSave.Username = windowsUserName;
userToSave.Guid = Guid.NewGuid();
SaveUser(userToSave);
}
catch (Exception ex)
{
throw new Exception("Error authenticating user. " + ex.Message, ex);
}
finally
{
//Dispose service and search to prevent leek in memory
entry.Dispose();
search.Dispose();
}
}
Если нужны дополнительные примеры кода, просто скажите мне.
4 ответов
ваша проблема в том, что вы используете "простое" доменное имя для привязки - это не будет работать в LDAP. На самом деле, если вы попытаетесь привязать к LDAP://MyDomain
, ты действительно пытаюсь привязать к сервер под названием MyDomain
.
вам нужна действительная строка привязки LDAP-что-то вроде LDAP://dc=yourdomain,dc=local
или что-то в этом роде.
чтобы узнать, что ваш контекст привязки LDAP по умолчанию, используйте этот фрагмент кода:
DirectoryEntry deRoot = new DirectoryEntry("LDAP://RootDSE");
if (deRoot != null)
{
string defaultNamingContext = deRoot.Properties["defaultNamingContext"].Value.ToString();
}
после этой строки - использовать это как ваша строка привязки к вашему серверу LDAP.
и если вы находитесь на .NET 3.5 и выше, вы должны проверить System.DirectoryServices.AccountManagement
(С. ДС.АМ) пространства имен. Прочитать все об этом здесь:
- управление участниками безопасности каталогов в .NET Framework 3.5
- документы MSDN в системе.DirectoryServices.AccountManagement
в основном, вы можете определить контекст домена и легко найти пользователей и / или группы в AD:
// set up domain context -- no domain name needed, uses default domain
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
// find a user
UserPrincipal user = UserPrincipal.FindByIdentity(ctx, username);
if(user != null)
{
// do something here....
}
новый S. DS.AM позволяет легко играть с пользователями и группами в AD!
добавить ответ marc_s выше, мне нужно было искать несколько доменов. Поэтому для каждого домена я сделал следующее:
DirectoryEntry deRoot = new DirectoryEntry("LDAP://" +"DomainName"+ "/RootDSE");
string defaultNamingContext = "LDAP://" + deRoot.Properties["defaultNamingContext"].Value.ToString();
DirectoryEntry mySearchRoot = new DirectoryEntry(defaultNamingContext);
DirectorySearcher myDirectorySearcher = new DirectorySearcher(mySearchRoot);
можно использовать строки привязки в формате LDAP: / / mydomain.com: 389. Я продолжал получать "доступ запрещен" при попытке использовать формат LDAP://DC=mydomain,DC=com. Как только я переключился на LDAP://mydomain.com: 389 формат, и связаны с использованием AuthenticationTypes.Флаг ServerBind при построении моего DirectoryEntry, он отлично работал. Это было в Службе приложений Azure.
аналогичная ошибка произошла со мной (хотя это происходило все время, а не в конкретных случаях, как указано здесь) из-за неправильной строки подключения Active Directory. я использовал корпус вместо прода . Используйте то, что работает для другого приложения в вашей организации, если он существует.