我在Windows域上有一个Intranet服务器(服务器是Windows 2003,IIS6,NTFS权限)。它位于域Domain01上。我有来自访问此Intranet的同一林中的两个域的用户:Domain01和Domain02(DC也运行Windows 2003)。目前,用户需要输入以下任一项进行登录: Domain01 \用户名或用户名@ Domain01
我的用户完全彻底地,每次登录时都必须输入域名。 有没有办法让他们只输入他们的用户名和密码而不用域名登录?例如,让服务器默认尝试Domain01,如果登录失败尝试Domain02?
注意:如果可能,我想通过IIS或服务器设置执行此操作,而不是以编程方式执行此操作(供参考,我使用的是ASP.NET 2.0)。
答案 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;
}
}
}
}