简单登录多域内联网?

时间:2009-02-03 16:11:28

标签: login dns ntfs intranet

我在Windows域上有一个Intranet服务器(服务器是Windows 2003,IIS6,NTFS权限)。它位于域Domain01上。我有来自访问此Intranet的同一林中的两个域的用户:Domain01和Domain02(DC也运行Windows 2003)。目前,用户需要输入以下任一项进行登录: Domain01 \用户名或用户名@ Domain01

我的用户完全彻底地,每次登录时都必须输入域名。 有没有办法让他们只输入他们的用户名和密码而不用域名登录?例如,让服务器默认尝试Domain01,如果登录失败尝试Domain02?

注意:如果可能,我想通过IIS或服务器设置执行此操作,而不是以编程方式执行此操作(供参考,我使用的是ASP.NET 2.0)。

1 个答案:

答案 0 :(得分: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;
            }
        }
    }
}