Простой логин для многодоменной интрасети? - PullRequest
0 голосов
/ 03 февраля 2009

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

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

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

1 Ответ

2 голосов
/ 03 февраля 2009

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

// 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;
            }
        }
    }
}
...