2009-02-03 9 views
0

J'ai un serveur intranet sur un domaine Windows (le serveur est Windows 2003, IIS6, autorisations NTFS). C'est sur le domaine Domain01. J'ai des utilisateurs de deux domaines dans la même forêt qui accèdent à cet intranet: Domain01 et Domain02 (DC exécutant également Windows 2003). À l'heure actuelle, les utilisateurs doivent se connecter en entrant: Domaine01 \ nom d'utilisateur ou nom d'utilisateur @ Domaine01Connexion simple pour l'intranet multi-domaine?

Mes utilisateurs sont complètement et à fond confus d'avoir à entrer dans le domaine chaque fois qu'ils se connectent Est-il possible. simplement leur permettre de se connecter en entrant simplement leur nom d'utilisateur et mot de passe SANS le domaine? Par exemple, le serveur tente-t-il Domain01 par défaut et si la connexion échoue à essayer Domain02?

REMARQUE: je souhaite le faire via IIS ou les paramètres du serveur, si possible, plutôt que par programmation (pour référence, j'utilise ASP.NET 2.0).

+0

Vous pouvez écrire du code qui fait cela, en supposant que vous en ayez le contrôle avec votre application intranet (vous n'avez pas indiqué de détails à ce sujet). Aussi, vous n'avez pas déclaré ce que le domaine est (Win2008 ou Win2003 etc ...) et la relation entre les deux domaines sont. –

Répondre

2

Oui. Habituellement, ce que je fais est de faire une recherche de catalogue global en utilisant le nom d'utilisateur fourni comme sAMAccountName. Faire cela avec un PrincipalSearcher nécessite d'obtenir le DirectorySearcher sous-jacent et de le remplacer par SearchRoot. Une fois que je trouve l'objet utilisateur correspondant, j'extrais le domaine du chemin de l'objet utilisateur et l'utilise comme domaine pour l'étape d'authentification. Comment vous faites l'authentification varie en fonction de ce que vous avez besoin de faire. Si vous n'avez pas besoin d'usurpation d'identité, vous pouvez utiliser PrincipalContext.ValidateCredentials pour vous assurer que le nom d'utilisateur/mot de passe correspond en utilisant un PrincipalContext qui correspond au domaine du compte d'utilisateur que vous avez précédemment trouvé. Si vous avez besoin d'usurpation d'identité, consultez 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; 
      } 
     } 
    } 
} 
Questions connexes