LDAP - Authentifizierung nur wenn in Gruppe/Member

Rund um die LCL und andere Komponenten
Antworten
catweasel
Beiträge: 220
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.0.10 FPC 3.2.0)

LDAP - Authentifizierung nur wenn in Gruppe/Member

Beitrag von catweasel »

Hallo zusammen

Ich schreibe ein Programm das zwar allen Mitarbeitern auf einem Server zur Verfügung steht, aber nur bestimmte User benutzen können sollen.
Zur Authentifizierung nutze ich hier das tldapsend von synapse.

Ein Beispiel (ohne Gruppen) habe ich gefunden und für mich etwas angepaßt. Das funktioniert soweit gut.
Allerdings wird hier jeder authentisiert der im LDAP administriert ist.

Wie kann ich hier noch eine Gruppe mitgeben in der der User sein muß?
Leider bin ich in LDAP nicht sehr bewandert, daher kenne ich die Möglichkeiten dort nur sehr begrenzt
Brauche ich hier vielleicht garnichts zu tun und das LDAP entscheidet ob ich mich für das Programm authentifizieren darf?


Gruß
Michael

Code: Alles auswählen

procedure TForm8.AnmeldenButtonClick(Sender: TObject);
var
  fldap :tldapsend;
begin
  fldap            := TLDAPSend.Create;
  fldap.TargetHost := adDomainComboBox.Text;
  fldap.UserName   := adUsername_LabeledEdit.Text+'@'+adDomainComboBox.Text;
  fldap.Password   := adPasswort_LabeledEdit.Text;
  {TODO: keine Fehlermeldung wenn falsche Domäne verwendet wird }
  Screen.Cursor:=crHourGlass; //crDefauld
  fldap.Timeout:=15;
  try
     try
        if fldap.Login then
           if fldap.Bind then begin
                                Form1.SucheLabeledEdit.Enabled:=true;
                                Form1.SucheLabeledEdit.Color:=clDefault;
                                Form1.HostSuchenBitBtn.Enabled:=true;
                                Form1.SucheLabeledEdit.SetFocus;
                                close;
                              end
                         else raise exception.Create('LDAP bind failed.');
     except
        on e:exception do begin
           MessageDlg('Fehler','Authentifizierung ist fehlgeschlagen.',mtError,[mbOK],0);
           Form1.SucheLabeledEdit.Enabled:=false;
           Form1.SucheLabeledEdit.Color:=clInactiveCaption;
           Form1.HostSuchenBitBtn.Enabled:=false;
        end;
     end;
  finally
     fldap.logout;
     freeandnil(fldap);
  end;
  Screen.Cursor:=crDefault; //crHourGlass
  adUsername_LabeledEdit.Text:='';
  adPasswort_LabeledEdit.Text:='';
end;
Zuletzt geändert von catweasel am Di 19. Mär 2019, 08:47, insgesamt 1-mal geändert.

catweasel
Beiträge: 220
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.0.10 FPC 3.2.0)

Re: LDAP - Authentifizierung nur wenn in Gruppe/Member

Beitrag von catweasel »

Hallo

Ich bin jetzt einen kleinen Schritt weiter gekommen.

Es ist jetzt möglich anzuzeigen ob der User vorhanden ist und in welchen Gruppen er ist.
Dazu benutze ich folgenden String: 'CN=scmtest1,OU=TestAccounts,OU=User,OU=firma-Intern,DC=firma,DC=biz'

Die Ausgabe mit dem unten stehenden Code ist wie folgt:

Code: Alles auswählen

Results: 1
 
Result: 0
  Object: CN=scmtest1,OU=TestAccounts,OU=User,OU=firma-Intern,DC=firma,DC=biz
  Attribute: givenName
    scmtest1
  Attribute: displayName
    scmtest1
  Attribute: memberOf
    CN=G-SimCon-User,OU=Global,OU=Gruppen,OU=firma-Intern,DC=firma,DC=bizz


Wichtig ist jetzt allerdings ob der User in der Gruppe "G-SimCon-User" ist oder nicht
Was ich nicht weis wie ich den Suchstring jetzt mit "memberOf" anpassen muß.

Kann mir hier jemand einen Hinweis geben wie der String in ldap.Search auszusehen hat, damit ich prüfen kann ob der User "scmtest1" in der Gruppe "CN=G-SimCon-User" vorhanden ist?


Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  ldap     : TLDAPsend;
  Attribute: TStringList;
begin
  memo1.Clear;
  ldap      := TLDAPsend.Create;
  Attribute := TStringList.Create;
  try
    ldap.TargetHost := 'firma.biz';
    ldap.UserName   := 'scmtest1@firma.biz';
    ldap.Password   := 'geheim!';         
    ldap.Login;
    ldap.Bind;
    Attribute.Add('displayname');
    Attribute.Add('description');
    Attribute.Add('givenName');
    Attribute.Add('memberOf');
 
    ldap.Search('CN=scmtest1,OU=TestAccounts,OU=User,OU=firma-Intern,DC=firma,DC=biz', false, '(objectclass=*)', Attribute);
 
    memo1.Lines.Add(LDAPResultdump(ldap.SearchResult));
    ldap.Logout;
  finally
    ldap.Free;
    Attribute.Free;
  end;
end;
Zuletzt geändert von catweasel am So 17. Mär 2019, 10:34, insgesamt 1-mal geändert.

Benutzeravatar
six1
Beiträge: 250
Registriert: Do 1. Jul 2010, 19:01

Re: LDAP - Authentifizierung nur wenn in Gruppe/Member

Beitrag von six1 »

Hi,
vielleicht bringt dich eine Routine von mir weiter, welche zwar Bestandteil einer DotNet dll ist, aber den Weg aufzeigt.
Du übergibst den Namen des User und einen Search String (auch Teil) auf die gesuchte Gruppe.

Vielleicht hilft es dir weiter...

Code: Alles auswählen

 
Function GetADGroups( username, filter : String) : string;
var
      search, search_address : DirectorySearcher;
      groupCount : Integer;
      counter, counter2 : integer;
      GroupName, xmlout : String;
      iresult, iresult_address : SearchResult;
      test : String;
      grResp : NameResolutionCollection ;
begin
     xmlout := '<?xml version="1.0" encoding="UTF-8"?>';
     xmlout := xmlout + '<GROUPS>';
 
        Try
            search := DirectorySearcher.Create();
            search.Filter := '(&(!(userAccountControl:1.2.840.113556.1.4.803:=2))(objectCategory=user)(samaccountname=' + UserName.ToString.Trim + '))';
            search.PropertiesToLoad.Add('memberOf');
            iresult := search.FindOne();
 
            search_address := DirectorySearcher.Create();
 
            If (iresult <> NIL) Then begin
                Try
                    groupCount := iresult.Properties['memberOf'].Count
                except
                    groupCount := 0;
                end;
                If groupCount > 0 Then begin
                    counter2:=0;
                    For counter := 0 To groupCount - 1 do begin
                        GroupName := '';
                        GroupName := iresult.Properties['memberOf'].Item[counter].ToString;
                        GroupName := copy(GroupName, 4, pos(',',GroupName)-4);
                        if ((filter = '')or(pos(filter.ToUpper,GroupName.ToUpper) > 0)) then begin
                           counter2:=counter2+1;
                           xmlout := xmlout + '<GROUP'+counter2.ToString+'>'+GroupName+'</GROUP'+counter2.ToString+'>';
                        end;
                    end;
                    xmlout := xmlout + '<GROUPCOUNT>'+counter2.ToString+'</GROUPCOUNT>';
                End;
            End;
        result := xmlout + '</GROUPS>';
        finally
          search.Dispose();
        End;
End;
 
 


Wenn du nach "(&(!(userAccountControl:1.2.840.113556.1.4.803:=2))(objectCategory=user)" in Google suchst, wirst du jede Menge anderer Beispiele dazu finden!
Gruß, Michael

catweasel
Beiträge: 220
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.0.10 FPC 3.2.0)

Re: LDAP - Authentifizierung nur wenn in Gruppe/Member

Beitrag von catweasel »

six1 hat geschrieben:Hi,
vielleicht bringt dich eine Routine von mir weiter, welche zwar Bestandteil einer DotNet dll ist, aber den Weg aufzeigt.
Du übergibst den Namen des User und einen Search String (auch Teil) auf die gesuchte Gruppe.

Danke, aber das hat mir nicht weitergeholfen, da ich nicht weis wie ich das bei mir integrieren soll :cry:

Ich bekomme bei meiner Version schon angezeigt in welchen Gruppen (CN=G-SimCon-User) vorhanden ist.

Code: Alles auswählen

Results: 1
 
Result: 0
  Object: CN=scmtest1,OU=TestAccounts,OU=User,OU=firma-Intern,DC=firma,DC=biz
  Attribute: givenName
    scmtest1
  Attribute: displayName
    scmtest1
  Attribute: memberOf
    CN=G-SimCon-User,OU=Global,OU=Gruppen,OU=firma-Intern,DC=firma,DC=biz


Was mir fehlt ist eine entsprechende korrekte Abfrage.

Egal wie ist es bisher versucht habe in meiner Search Abfrage einzutagen, kommt immer kein Ergebnis/Treffer zurück:
z.B.:

Code: Alles auswählen

ldap.Search('CN=scmtest1,CN=G-SimCon-User,OU=TestAccounts,OU=User,OU=firma-Intern,DC=firma,DC=biz', false, '(objectclass=*)', Attribute);

oder

Code: Alles auswählen

ldap.Search('CN=scmtest1,CN=G-SimCon-User,OU=Global,OU=Gruppen,OU=firma-Intern,DC=firma,DC=biz', false, '(objectclass=*)', Attribute);

oder

Code: Alles auswählen

ldap.Search('CN=scmtest1,OU=User,memberOf=CN=G-SimCon-User,OU=firma-Intern,DC=firma,DC=biz', false, '(objectclass=*)', Attribute);


Es muß doch eine Möglichkeit geben den Usernamen, die Gruppen deren Zugehörigkeit geprüfet werden soll und die Domain in einem entsprechenden Suchstring einzugeben und dann ein OK oder nicht zurückzubekommen
Ich weis leider nicht mehr weiter.

Benutzeravatar
six1
Beiträge: 250
Registriert: Do 1. Jul 2010, 19:01

Re: LDAP - Authentifizierung nur wenn in Gruppe/Member

Beitrag von six1 »

Schau mal hier:

https://www.kagerer.net/ad-gespeicherte-abfragen/

https://docs.microsoft.com/en-us/window ... ter-syntax

An example of such a query is one designed to check if a user "user1" is a member of group "group1". You would set the base to the user DN (cn=user1, cn=users, dc=x) and the scope to base, and use the following query.

C++

Copy
(memberof:1.2.840.113556.1.4.1941:=cn=Group1,OU=groupsOU,DC=x)
Gruß, Michael

Eb
Lazarusforum e. V.
Beiträge: 212
Registriert: Di 5. Feb 2008, 15:32
OS, Lazarus, FPC: Linux Mint - Laz 2.0.6
CPU-Target: 64Bit
Wohnort: Stuttgart

Re: LDAP - Authentifizierung nur wenn in Gruppe/Member

Beitrag von Eb »

Ich weiß nicht, ob dir das hilft, aber so liest ein Linux-basierter Server die Benutzernamen einer AD-Gruppe aus dem AD aus:

Target DN for sync : CN=<Name der AD-Gruppe>, OU=<OU Ebene 3>, OU=<OU Ebene 2>, OU=<OU Ebene 1>, DC=<Domain-Name>, DC=<Domain-Extension>
Scope : Recurse Tree

Filter to Apply : objectclass=*
Attributes to Retrieve : sAMAccountName
Request Paging : 1000
Group Expansion : Expansion is enabled using 'member' to a depth of 10.

Antworten