Frage

Ich habe einen Intranet-Server auf einer Windows-Domäne (Server ist Windows 2003, IIS6, NTFS-Berechtigungen). Es ist auf der Domäne Domain01. Ich habe Benutzer aus zwei Domänen in der gleichen Gesamtstruktur, die dieses Intranet zugreifen: Domain01 und Domain02 (DCs auch Windows 2003 ausgeführt wird). Derzeit werden die Benutzer durch Eingabe entweder Anmeldung erforderlich: Domain01 \ Benutzername oder Benutzername @ Domain01

Meine Benutzer sind vollständig und gründlich verwirrt, indem die Domäne jedes Mal, wenn sie sich anmelden einzugeben. Gibt es eine Möglichkeit, einfach lassen sie sich anmelden, indem Sie nur den Benutzernamen und das Passwort OHNE Domain? Zum Beispiel haben die Server Domain01 standardmäßig versuchen, und wenn die Anmeldung fehlschlägt Domain02 versuchen?

. HINWEIS: Das möchte ich über IIS oder Server-Einstellungen tun, wenn möglich, nicht programmatisch (als Referenz, ich bin mit ASP.NET 2.0)

War es hilfreich?

Lösung

Ja. In der Regel, was ich tun ist, tun einen globalen Katalog-Suche mit dem angegebenen Benutzernamen als sAMAccountName. Dadurch mit einem Principal erfordert den zugrunde liegenden Directory bekommen und ersetzt es ist SearchRoot. Sobald ich das entsprechende Benutzerobjekt finden extrahieren wir die Domain aus dem Pfad des Benutzerobjekts und verwenden, die als Domäne für den Authentifizierungsschritt. Wie Sie tun, ändert sich die Authentifizierung je nachdem, was Sie es brauchen zu tun. Wenn Sie nicht über Identitätswechsel benötigen, können Sie verwenden, PrincipalContext.ValidateCredentials , um sicherzustellen, dass der Benutzername / Passwort Spiel ein Principal , die die Domäne des Benutzerkontos übereinstimmt, die Sie vorher gefunden. Wenn Sie Identitätswechsel müssen überprüfen dieser Referenz .

// 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;
            }
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top