Ein paar Tipps zur AD LDS (ADAM)-Authentifizierung

Die AD Lightweight Directory Services (AD LDS), vielen wahrscheinlich besser noch als ADAM bekannt, sind deswegen so interessant, da sie einer Anwendung, z.B. einer ASP.NET-Webanwendung, eine einfache Benutzerauthentifizierung bieten – die Authentifizierung kann gegen ADAM-User, lokale Benutzerkonten oder Active Directory-Benutzern (über ein Proxy-Objekt) erfolgen. Das Prinzip der Authentifizierung  gegen einen ADAM-User ist im Grunde sehr einfach, es kommt wie immer lediglich auf ein paar Kleinigkeiten an.

Folgende Voraussetzungen müssen erfüllt sein:

>Das ADAM-user-Objekt (es kommen weitere Objekttypen für die Authentifizierung in Frage) muss zwei Attribute besitzen: ms-DS-UserAccountDisabled muss auf „False“ gesetzt werden (das Konto soll aktiv sein) und userPrincipalName sollte (aber muss nicht) einen Namen (Wert) erhalten, so dass der User nicht über seinen DN angesprochen werden muss.

>Das Kennwort muss, z.B. in ADSIEdit, nachträglich gesetzt werden.

Damit ist das user-Objekt bereit für die Authentifizierung.

Doch wie soll man bei der PowerShell feststellen, ob es den User mit dem festgelegten Passwort gibt? [ADSI] scheidet aus, da sich hier kein Benutzername angeben lässt, die ActiveDirectory-Cmdlets kommen nicht in Frage, wenn AD LDS nicht auf einem Server läuft. Die Lösung: Das DirectoryEntry-Objekt muss direkt angelegt werden. Der „Trick“ besteht allerdings darin, sich mit RootDSE zu verbinden (und nicht mit dem Container, der das user-Objekt enthält). Doch ein Befehl wie

$ADUser = New-Object System.DirectoryServices.DirectoryEntry „LDAP://localhost:389/rootDSE“,“Pemo“,“pw“

führt zu einer wenig aussagekräftigen Fehlermeldung vom Typ „Der Server ist nicht funktionstüchtig“. Dies ist eine der typischen Situationen, in denen nur Ausdauer und Hartnäckigkeit helfen, sofern man die Lösung nicht durch Nachdenken und durch Lesen der Doku lösen kann. Der „Trick“ besteht einfach darin, dass die richtige Authentifizierungsmethode übergeben werden muss, in diesem Fall „FastBind“, da der Zugriff auf eine lokale ADAM-Instanz erfolgt:

$ADUser = New-Object System.DirectoryServices.DirectoryEntry „LDAP://localhost:389/rootDSE“,“Pemo“,“pw“, „FastBind“

Sehr interessant sind die mit .NET 3.5 eingeführten Klassen in System.DirectoryServices.AccountManagment, mit denen z.B. eine Authentifizierung etwas einfacher wird.  Die Klassen lassen sich natürlich auch von der PowerShell nutzen. Einfach die Assembly über ein

Add-Type -Assembly System.DirectoryServices.AccountManagment

hinzufügen (so einfach geht das ab Version 2.0). Man benötigt dann einen PrincipalContext:

$Pc = New-Object System.DirectoryServices.AccountManagement.PrincipalContext „ApplicationDirectory“, „localhost:389“, „o=Pemotrain“

Und die Authentifizierung:

$Pc.ValidateCredentials(„Pemo“, „pw“, „SimpleBind“)

Auch hier kommt es auf die Bindung an. Mehr zu diesen Klassen in einem kommenden Blog-Eintrag.

Advertisements

Kommentar verfassen

Bitte logge dich mit einer dieser Methoden ein, um deinen Kommentar zu veröffentlichen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s