LDAP - Authentifizierung nur wenn in Gruppe/Member

Rund um die LCL und andere Komponenten

LDAP - Authentifizierung nur wenn in Gruppe/Member

Beitragvon catweasel » 13. Mär 2019, 07:25 LDAP - Authentifizierung nur wenn in Gruppe/Member

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 19. Mär 2019, 08:47, insgesamt 1-mal geändert.
catweasel
 
Beiträge: 207
Registriert: 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 18.3 - (L 1.8.4 FPC 3.0.4) | 
Nach oben

Beitragvon catweasel » 15. Mär 2019, 08:29 Re: LDAP - Authentifizierung nur wenn in Gruppe/Member

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 17. Mär 2019, 10:34, insgesamt 1-mal geändert.
catweasel
 
Beiträge: 207
Registriert: 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 18.3 - (L 1.8.4 FPC 3.0.4) | 
Nach oben

Beitragvon six1 » 15. Mär 2019, 08:46 Re: LDAP - Authentifizierung nur wenn in Gruppe/Member

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!
six1
 
Beiträge: 43
Registriert: 1. Jul 2010, 18:01

Beitragvon catweasel » 17. Mär 2019, 10:33 Re: LDAP - Authentifizierung nur wenn in Gruppe/Member

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.
catweasel
 
Beiträge: 207
Registriert: 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 18.3 - (L 1.8.4 FPC 3.0.4) | 
Nach oben

Beitragvon six1 » 18. Mär 2019, 06:31 Re: LDAP - Authentifizierung nur wenn in Gruppe/Member

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)
six1
 
Beiträge: 43
Registriert: 1. Jul 2010, 18:01

Beitragvon Eb » 21. Mär 2019, 17:28 Re: LDAP - Authentifizierung nur wenn in Gruppe/Member

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.
Eb
 
Beiträge: 192
Registriert: 5. Feb 2008, 15:32
Wohnort: Stuttgart
OS, Lazarus, FPC: linux - Laz 1.4.2 | 
CPU-Target: 32Bit
Nach oben

• Themenende •

Zurück zu Komponenten und Packages



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

porpoises-institution
accuracy-worried