Простой вход в многодоменную интрасеть?

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

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

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


person Rick    schedule 03.02.2009    source источник
comment
Вы можете написать код, который делает это, предполагая, что вы контролируете это с помощью своего приложения для интрасети (вы не указали никаких подробностей об этом). Также вы не указали домен (Win2008 или Win2003 и т. д.) и отношения между двумя доменами.   -  person Robert MacLean    schedule 03.02.2009


Ответы (1)


да. Обычно я выполняю поиск по глобальному каталогу, используя предоставленное имя пользователя в качестве 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;
            }
        }
    }
}
person tvanfosson    schedule 03.02.2009