ASP Classic

Personalisiertes Intranet

Web-Seite mit Informationen aus dem Active-Directory aufwerten

Viele Firmen und Organisation haben ein Intranet, in dem Informationen für die Belegschaft hinterlegt sind. Meistens sind diese Informationen aber sehr allgemein gehalten, denn in den wenigsten Fällen findet eine Identifizierung des Benutzers statt, die die Möglichkeit bieten würde die Informationssammlung auf die Mitarbeiter und deren Bedürfnisse zuzuschneiden. Dabei ist die Erkennung des Benutzers recht einfach.

Die Basis dieses Beispiels fungiert der Internet Information Server 6.0 (IIS) des Windows Server 2003 in Zusammenarbeit mit dem Active-Directory, in dem alle Benutzer erfasst sind.

Erstellt man auf dem IIS eine neue Website, so ist der anonyme Zugriff standardmäßig aktiviert, d.h. jeder darf Seiten dieser Site abrufen; eine Validierung findet nicht statt. Genau dies muss man nun ändern, will man erfahren welcher Benutzer die Website gerade aufgerufen hat. Zu diesem Zweck ruft man die Eigenschaften der Website im Internetinformationsdienste-Manager des Web-Servers auf und wechselt auf den Karteireiter Verzeichnissicherheit. Dort findet man unter "Authentifizierung und Zugriffssteuerung" die Schaltfläche "Bearbeiten", mit der man auf den Dialog Authentifizierungsmethoden gelangt.

In diesem Dialog entfernt man zunächst den Haken vor dem Eintrag Anonymen Zugriff aktivieren und setzt ihn anschließend vor dem Eintrag Integrierte Windows-Authentifizierung. Das war's. Jeder der nun nicht zum Benutzerkreis der Windows-Domäne gehört, bekommt beim Aufruf der Site einen Anmeldedialog angezeigt, an dem er sich mit einem gültigen AD-Konto anmelden muss.

Mit dieser Server-Konfiguration und ein wenig ASP-Code kann man nun den Benutzernamen des Intranet-Betrachters identifizieren und mit diesem weitere Informationen aus dem Active-Directory ermitteln. Der Einfachheit halber sollte man den Code in einer externen ASP-Datei kapseln, die man später nur in andere APS-Seiten einbinden braucht.

Die Funktion GetUserInfo im Einzelnen:

Als erstes müssen wir den Benutzernamen ermitteln. Dies geschieht durch einen Zugriff auf die Server-Variable LOGON_USER, in der der voll qualifizierten Domänennamen steht, wenn der Zugriff nicht anonym ist.

strUser = Trim(Request.ServerVariables("LOGON_USER"))

Wir erhalten z.B. MYDOMAIN\kristof. Da wir den Domänennamen nicht mehr brauchen, schneiden wir ihn ab:

If InStr(strUser,"\") then strUser = Mid(strUser,InStr(strUser,"\") + 1)

Damit hätten wir den User-Namen. Um nun mehr Informationen über den Benutzer zu erhalten, z.B. den Vor- und Nachnamen, verwenden wir das LDAP-Protokoll um das Active-Directory abzufragen. Der einfachste Weg führt dabei über ADO. Hierzu initialisieren wir zunächst eine entsprechende Verbindung. Wichtig ist hierbei der richtige Provider, um auf das AD zu kommen. Anstelle der Platzhalter "<Kontoname>" bzw. "<Passwort>" müssen natürlich die Informationen eines abfrageberechtigten Benutzers eingetragen werden.

Set objConn = CreateObject("ADODB.Connection")
objConn.Provider = "ADsDSOObject"
objConn.Properties("User ID") = "<Kontoname>"
objConn.Properties("Password") = "<Passwort>"
objConn.Open "Active Directory Provider"

Als nächstes müssen wir die Abfrage definieren. Dies geschieht in drei Teilen:

1. Teil (strBase) = Definition des AD-Knotes ab dem gesucht werden soll. In diesem Fall der Hauptst "Benutzer" in der Domäne "test.de"

2. Teil (strFilter) = Eingrenzung der Objekte auf die Objekteigenschaften Personen und User und den Account-Namen des zuvor ermittelten Benutzers

3. Teil (strAttributes) = Welche Active-Directory-Felder sollen zurückgegeben werden:

sAMAccountNameAccount-Name
snNachname
givenNameVorname
departmentAbteilung

Diese drei Teile hängen wird anschließend zu einem Abfrage-String zusammen und initialisieren damit ein neues ADO-Command-Objekt.

strBase = "<LDAP://OU=benutzer,DC=test,DC=de>"
strFilter = "(&(objectCategory=person)(objectClass=user)(sAMAccountName=" &
strUser & "*))"
strAttributes = "sAMAccountName,sn,givenName,department"

strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree"

Set objCmd = CreateObject("ADODB.Command") Set objCmd.ActiveConnection = objConn objCmd.CommandText = strQuery objCmd.Properties("Page Size") = 100 objCmd.Properties("Timeout") = 30 objCmd.Properties("Cache Results") = False

Über das ADO-Command-Objekt erhalten wir schließlich ein Recordset, in dessen einzigem Datensatz die gewünschten Informationen enthalten sind. Um diese global verfügbar zu machen, werden sie in Session-Variablen gespeichert.

Set objRS = objCmd.Execute

If Len(Trim(objRS.Fields("sAMAccountName").value)) = 0 then
   Session("UserAccount") = ""
   Session("UserFirstName") = ""
   Session("UserLastName")= ""
   Session("UserDepartment") = ""
Else
   Session("UserAccount") = objRS.Fields("sAMAccountName").value
   Session("UserFirstName") = objRS.Fields("givenName").value
   Session("UserLastName") = objRS.Fields("sn").value
   Session("UserDepartment") = objRS.Fields("department").value
End if

Bleibt schließlich nur noch, das abschließende Aufräumen.

objRS.Close
Set objRS = Nothing
Set objCmd = Nothing
objConn.Close
Set objConn = Nothing

Vorstellbar ist nun den Benutzer gleich auf der ersten Seite mit einer persönlichen Ansprache á la "Willkommen Herr Müller" zu begrüßen. Die Eindeutigkeit eines Accounts in einer Domäne bietet weitere Möglichkeiten, wie die Speicherung persönlicher Präferenzen in einer Datenbank oder ähnliches.

Downloads

GetUserInfo.txt
kick it on dotnet-kicks.de AddThis 0 wikio-Stimme(n) Trackback-Url...

130 Kommentare bislang...

Dein Kommentar hierzu...


Kommentar-Feed für diesen Beitrag
Gravatare werden unterstützt .:. eMail-Adressen werden nicht veröffentlicht
 

RSS-Feed

Die URL des Standard-Newsfeed von zerbit.de lautet:

http://www.zerbit.de/rssfeed.aspx

Login


 

 

Statistik



kürzlich kommentiert

Artikel 27

  • Datum: 21.04.2005
    Kategorie: ASP Classic
    Zugriffe: 3.558
    Kommentare: 130
    Trackbacks: 0

Letzte Beiträge

Kategorien

Buttons & More

Blog-Roll

Banner Piraten-Partei