2010-06-02 10 views
23

Ich muss auf Active Directory zugreifen, um Informationen über Gruppen zu erhalten, denen die Kunden angehören. Das Projekt, das ich habe, ist eine ASP.Net MVC-Anwendung, die C# verwendet. Ich habe noch nie zuvor mit Active Directory programmiert und brauche einen Rat, wie man am besten anfängt, welches Sicherheitsmodell verwendet wird, um auf die Informationen zuzugreifen, und vielleicht auf einige gute Tutorials verweisen kann.Zugriff auf Active Directory von ASP.Net MVC mit C#

Antwort

45

Da Sie MVC verwenden, haben Sie Zugriff auf den neuen System.DirectoryServices.AccountManagement Namespace in .NET 3.5. Diese Klassen sollten gegenüber den älteren Klassen in DirectoryServices selbst bevorzugt werden, da sie viel einfacher zu verwenden sind. Es gibt ein paar Fehler, die nicht in 3.5 gelöst wurden (1500 Mitgliederlimit bei der Abfrage von Gruppen zum Beispiel), aber ich bin sicher, dass diese in .NET 4.0 behoben wurden. Für die meisten Aufgaben funktionieren die neuen Klassen sehr gut.

using (var context = new PrincipalContext(ContextType.Domain)) 
{ 
     using (var user = UserPrincipal.FindByIdentity(context, "username")) 
     { 
      var groups = user.GetAuthorizationGroups(); 
      ... 
     } 
} 
+1

+1 Interessant! Ich hatte nur die Möglichkeit, in .NET 2.0 gegen das AD zu arbeiten. =) –

+0

Wirklich, wirklich sexy! –

+0

Es ist schön, wenn es einfach funktioniert – IdahoSixString

12

Verwenden Sie den Namespace System.DirectoryServices, um auf den AD zuzugreifen.

Die beiden wichtigsten Klassen sind:

  1. DirectoryEntry;
  2. DirectorySearcher.

Nehmen wir an, dass Ihre Domäne ist: MyIntranet.MyCompany.com

Dann werden Sie eine Root-Instanz der DirectoryEntry Klasse erstellen müssen:

DirectoryEntry root = new DirectoryEntry("LDAP://DC=MyIntranet,DC=MyCompany,DC=com"); 

Wenn die AD-Suche für ein bestimmtes Auftreten einer Gruppe oder eines Benutzers:

DirectorySearcher searcher = new DirectorySearcher(); 
searcher.SearchRoot = root; 
searcher.SearchScope = SearchScope.Subtree; 

Angenommen, Sie haben einen Benutzernamen benannt aussehen wollen: AnyUser1 sollte die DirectorySearcher.Filter wie folgt aussehen:

searcher.Filter = string.Format("(&(objectCategory=person)(objectClass=user)(sAMAccountName={0})", "AnyUser1"); 

Dann erhalten Sie das Ergebnis durch die SearchResult Klasse wie folgt:

bool userFound = false; 
SearchResult foundUser = null; 

try { 
    foundUser = searcher.FindOne(); // You might as well use the FindAll() method if you expect more then one result. 
    userFound = foundUser != null; 
} catch(Exception) { 
    throw; 
} 

if (!userFound) 
    return; 

DirectoryEntry user = foundUser.GetDirectoryEntry(); 

dann können Sie die verschiedenen Gruppen erhalten, die dieser Benutzer ist Mitglied wie so durch die memberOf Eigenschaft:

user.Properties("memberOf").Value 

Eine gute Übersicht finden Sie in diesem CodeProject-Artikel: How to (almost) everything in Active Directory.

Und ofr eine Liste der Eigenschaften: Mapping Between IADsUser Properties and Active Directory Attributes.

EDIT # 1

Wenn Sie Identitätswechsel verwenden, könnten Sie vielleicht einige Parameter für Ihre Anwendung prüfen Einstellung wie DefaultRootDomain, Default und Default, sie dann verwenden, wenn Instanziieren Ihre Wurzel DirectoroEntry.

public static class AdHelper { 

    public static string DefaultRootDse { 
     get { 
      return Properties.Settings.Default.DefaultRootDomain; 
     } 
    } 

    private static string DefaultUserName { 
     get { 
      return Properties.Settings.Default.DefaultUserName; 
     } 
    } 

    private static string DefaultPassword { 
     get { 
      return Properties.Settings.Default.DefaultPassword; 
     } 
    } 

    public static DirectoryEntry RootDse { 
     get { 
      if (_rootDse == null) 
       _rootDse = new DirectoryEntry(DefaultRootDse, DefaultUserName, DefaultPassword); 
      return _rootDse; 
     } 
    } 
    private static DirectoryEntry _rootDse; 
} 
+0

Muß ich ein Benutzerkonto und Passwort nicht muß specifiy verwenden, um die Daten zugreifen? –

+0

Wenn Sie Identitätswechsel verwenden, ja. Andernfalls nehmen die 'DirectoryEntry'-Klasse und das AD den aktuell verbundenen Benutzer an (sagen wir mal für eine Windows-Sitzung. Ich weiß nicht, ob ich sie über eine Webanwendung benutzen soll). –

0

Wenn Sie .NET 3.5 oder haben Sie es aktualisieren können - mit allen Mitteln verwenden, um die neue Funktion in System.DirectoryServices.AccountManagement!

Weitere Informationen und einen Jumpstart finden Sie im MSDN Magazine in einem ausführlichen Artikel Managing Directory Security Principals in the .NET Framework 3.5.

Verwandte Themen