2009-02-03 6 views
0

У меня есть сервер интрасети в домене Windows (сервер - это разрешения Windows 2003, IIS6, NTFS). Он находится в домене Domain01. У меня есть пользователи из двух доменов в том же лесу, которые обращаются к этой интрасети: Domain01 и Domain02 (DCs также работают под управлением Windows 2003). В настоящее время, пользователи должны войти в систему, введя либо: Domain01 \ имя пользователя или имя пользователя @ Domain01Простой логин для многодоменной интрасети?

Мои пользователи полностью и тщательно запутываемый необходимости вводить домен каждый раз, когда они войти в Есть ли способ. просто разрешить им входить в систему, введя только свое имя пользователя и пароль БЕЗ домена? Например, попробуйте ли сервер выполнить Domain01 по умолчанию, и если логин не может попробовать Domain02?

ПРИМЕЧАНИЕ. Я хотел бы сделать это с помощью параметров IIS или сервера, если это возможно, а не программно (для справки, я использую ASP.NET 2.0).

+0

Вы можете написать код, который делает это, если у вас есть контроль над этим с помощью приложения вашей интрасети (вы не указали никаких деталей на нем). Также вы не указали, что такое домен (Win2008 или Win2003 и т. Д.), И связь между этими двумя доменами. –

ответ

2

Да. Обычно то, что я делаю, это поиск глобального каталога с использованием предоставленного имени пользователя в качестве имени sAMAccountName. Для этого с PrincipalSearcher требуется получить базовый DirectorySearcher и заменить его SearchRoot. Как только я нахожу соответствующий объект пользователя, я извлекаю домен из пути объекта пользователя и использую его как домен для этапа аутентификации. Как вы выполняете аутентификацию, зависит от того, что вам нужно. Если вам не нужна олицетворение, вы можете использовать PrincipalContext.ValidateCredentials, чтобы убедиться, что имя пользователя/пароль совпадает с PrincipalContext, которое соответствует домену учетной записи пользователя, которую вы ранее обнаружили. Если вам нужна выдача олицетворения this reference.

// NOTE: implement IDisposable and dispose of this if not null when done. 
private DirectoryEntry userSearchRoot = null; 
private UserPrincipal FindUserInGlobalContext(string userName) 
{ 
    using (PrincipalSearcher userSearcher = new PrincipalSearcher()) 
    { 
     using (PrincipalContext context 
       = new PrincipalContext(ContextType.Domain)) 
     { 
      userSearcher.QueryFilter = new UserPrincipal(context); 
      DirectorySearcher searcher 
       = (DirectorySearcher)userSearcher.GetUnderlyingSearcher(); 

      // I usually set the GC path from the existing search root 
      // by doing some string manipulation based on our domain 
      // Your code would be different. 
      string GCPath = ...set GC path.. 

      // lazy loading of the search root entry. 
      if (userSearchRoot == null) 
      { 
       userSearchRoot = new DirectoryEntry(GCPath); 
      } 

      searcher.SearchRoot = userSearchRoot; 
      using (PrincipalContext gcContext = 
        new PrincipalContext(ContextType.Domain, 
              null, 
              GCPath.Replace("GC://","")) 
      { 
       UserPrincipal userFilter = new UserPrincipal(gcContext); 
       userFilter.SamAccountName = userName; 
       userSearcher.QueryFilter = userFilter; 
       return userSearcher.FindOne() as UserPrincipal; 
      } 
     } 
    } 
} 
Смежные вопросы