2010-06-02 18 views
23

Devo accedere ad Active Directory per ottenere informazioni sui gruppi a cui appartengono i clienti. Il progetto che ho è un'applicazione ASP.Net MVC che utilizza C#. Non ho mai programmato prima Active Directory e ho bisogno di qualche consiglio su quale sia il modo migliore per iniziare, quale modello di sicurezza usare per accedere alle informazioni e magari indirizzarmi ad alcuni buoni tutorial.Accesso ad Active Directory da ASP.Net MVC tramite C#

risposta

45

Dal momento che si sta utilizzando MVC, si ha accesso alla nuova System.DirectoryServices.AccountManagement spazio dei nomi in .NET 3.5. Queste classi dovrebbero essere preferite rispetto alle classi precedenti in DirectoryServices in quanto sono molto più semplici da usare. Ci sono un paio di trucchi che non sono stati risolti in 3.5 (limite di 1500 membri quando si interrogano gruppi, ad esempio), ma sono certo che questi sono stati risolti in .NET 4.0. Per la maggior parte delle attività, le nuove classi funzionano molto bene.

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

+1 interessante! Ho avuto solo la possibilità di lavorare contro l'AD in .NET 2.0. =) –

+0

Davvero, davvero sexy! –

+0

È bello quando funziona – IdahoSixString

12

Utilizzare lo spazio dei nomi System.DirectoryServices per accedere all'AD.

Le due classi più importanti sono:

  1. DirectoryEntry;
  2. DirectorySearcher.

Supponiamo che il dominio è: MyIntranet.MyCompany.com

Poi, si dovrà creare un'istanza radice della classe DirectoryEntry:

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

Durante la ricerca l'AD per un evento particolare di un gruppo o utente:

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

Diciamo che si desidera cercare un nome utente di nome: AnyUser1, il DirectorySearcher.Filter dovrebbe essere simile:

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

Quindi, ottenere il risultato attraverso la classe SearchResult come segue:

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(); 

quindi, è possibile ottenere i gruppi di cui l'utente è membro in questo modo attraverso il memberOf proprietà:

user.Properties("memberOf").Value 

Per una buona panoramica, vedere questo articolo CodeProject: How to (almost) everything in Active Directory.

E di un elenco delle proprietà: Mapping Between IADsUser Properties and Active Directory Attributes.

EDIT # 1

Se si utilizza la rappresentazione, si potrebbe forse prendere in considerazione l'impostazione di alcuni parametri per la vostra applicazione, come DefaultRootDomain, DefaultUserName e DefaultPassword, quindi utilizzare quando un'istanza tua root 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

non Devo specifiy un account utente e una password da utilizzare per accedere ai dati? –

+0

Se si utilizza la rappresentazione, sì. Altrimenti, la classe 'DirectoryEntry' e l'AD presuppongono l'utente attualmente connesso (per una sessione di Windows, ad esempio. Non so come usarlo tramite un'applicazione Web). –

0

Se si dispone di .NET 3.5 o se è possibile aggiornare ad esso - con tutti i mezzi utilizzare la nuova funzionalità di System.DirectoryServices.AccountManagement!

Vedere un ottimo articolo introduttivo Managing Directory Security Principals in the .NET Framework 3.5 su MSDN Magazine per ulteriori informazioni e un jumpstart.

Problemi correlati