2009-02-03 2 views
0

Windows 도메인에 인트라넷 서버가 있습니다 (서버는 Windows 2003, IIS6, NTFS 권한). Domain01 도메인에 있습니다. 이 인트라넷에 액세스하는 동일한 포리스트의 두 도메인 사용자 (Domain01 및 Domain02) (Windows 2003을 실행하는 DC)가 있습니다. 다중 도메인 인트라넷에 대한 간단한 로그인?

내 사용자가 완전하고 철저 도메인에게 그들이에 로그인 할 때마다 입력 할 필요 혼란을 입니다 Domain01

@ Domain01 \ 사용자 이름 또는 사용자 이름 어떤 방법이 있나요 : 현재, 사용자는 하나를 입력하여 로그인해야합니다. 도메인없이 사용자 이름과 비밀번호 만 입력하여 로그인 할 수 있도록 허용 하시겠습니까? 예를 들어, 서버가 기본적으로 Domain01을 시도하도록하고, 로그인이 Domain02를 시도하지 못하면?

참고 : 가능하면 프로그램 적으로 (참고로 ASP.NET 2.0을 사용하고 있습니다) IIS 또는 서버 설정을 통해이 작업을 수행하고 싶습니다.

+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; 
      } 
     } 
    } 
}