Система.Каталог - сервер не работает
Я получаю сообщение об ошибке от веб-сайта,на котором я использую аутентификацию Windows.
Странные вещи:
- происходит только в том случае, если пользователь еще не сохранен в базе данных (новый неизвестный пользователь)
- появляется только на живой системе, все прекрасно на локальной среде разработки
Вот что я получаю в логовом письме:
Источник: Система.DirectoryServices
Сообщение: сервер не работает.
След:
около Система.Каталог.Директорское кресло.Bind (Boolean throwIfFail)
в системе.Каталог.Директорское кресло.Bind ()
в системе.Каталог.Директорское кресло.get_AdsObject ()
в системе.Каталог.Режиссер-постановщик.FindAll (Boolean findMoreThanOne)
в системе.Каталог.Режиссер-постановщик.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
(S.DS.AM) пространство имен. Читайте Все об этом здесь:В принципе, вы можете определить контекст домена и легко найти пользователей и/или группы в AD:
- управление участниками безопасности каталогов в .NET Framework 3.5
- MSDN docs on System.Каталог.AccountManagement
// 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 делает его действительно легко играть с пользователями и группы в рекламе!
Чтобы добавить к ответу 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.