Dank der neuen Arbeitszeitgesetzt ist mein Arbeitgeber auf ein neues Tool zum Arbeitszeiten verwalten umgestiegen.
Da aber irgendwie alle Tools doof sind, hatte ich für mich und auch meine Kollegen ein eigenes Lazarus Tool gebastelt, was tatsächlich Benutzbar und schlank ist.
Nun hat das neue Tool aber keinen Login via SSH mehr sondern dieses Ominöse Single Sign On.
Wie ich das mit der SSH Variante gemacht hatte habe ich auch hier versucht das ganze von "Hand" nach zu bauen, doch leider antwortet mir der Server mit 403

Kennt jemand eine Lazarus Kompenente die sowas kann ? (oder kan Synapse das evtl schon und ich habs nur nicht gefunden ?)
Code: Alles auswählen
Function TSTIHLATOSS.Login: Boolean;
Var
_Action: String;
_RelayState: String;
_Host: String;
_SAMLRequest: String;
Procedure ExctractLoginAction();
Var
sl: TStringList;
tmp, Prot, User, Pass, Host, Port, Path, Para: String;
i: Integer;
Begin
_Action := '';
_RelayState := '';
_SAMLRequest := '';
Host := '';
sl := TStringList.Create;
CopyStreamToStrings(fClient.Document, sl);
// sl.SaveToFile('C:\Desktop\ExctractLoginAction.txt'); // Debugg, to be removed
For i := 0 To sl.count - 1 Do Begin
If pos('form action="', sl[i]) <> 0 Then Begin
tmp := copy(sl[i], pos('"', sl[i]) + 1, length(sl[i]));
tmp := copy(tmp, 1, pos('"', tmp) - 1);
_Action := DecodeUTF8EntityString(tmp);
End;
If pos('name="RelayState"', sl[i]) <> 0 Then Begin
tmp := copy(sl[i], pos('value=', sl[i]), length(sl[i]));
tmp := copy(tmp, pos('"', tmp) + 1, length(tmp));
tmp := copy(tmp, 1, pos('"', tmp) - 1);
_RelayState := tmp;
ParseURL(DecodeUTF8EntityString(tmp), Prot, User, Pass, Host, Port, Path, Para);
_Host := Prot + '://' + Host;
End;
// <input type="hidden" name="SAMLRequest" value="PDc3Q+"/>
If pos('name="SAMLRequest"', sl[i]) <> 0 Then Begin
tmp := copy(sl[i], pos('value=', sl[i]), length(sl[i]));
tmp := copy(tmp, pos('"', tmp) + 1, length(tmp));
tmp := copy(tmp, 1, pos('"', tmp) - 1);
_SAMLRequest := tmp; // = PDc3Q+
End;
End;
sl.free;
End;
Var
Body: TStringlist;
Begin
result := false;
fLoggedIn := false;
fLastError := '';
If assigned(fClient) Then fClient.Free;
fClient := THTTPSend.Create;
fClient.KeepAlive := true; // Braucht man das, ich weis es nicht ?
fClient.Cookies.Clear;
fClient.Headers.Clear;
// 1. Anfragen der Login Daten
fClient.HTTPMethod('GET', LoginURL);
ExctractLoginAction();
// 2. Auslesen der Post Anfrage Daten
If (_Action = '') Or
(_RelayState = '') Or
(_SAMLRequest = '') Then Begin
fLastError := 'Could not extract action links.';
exit;
End;
If (fClient.ResultCode <> 200) Then Begin
fLastError := 'HTTP.ResultCode: ' + inttostr(fClient.ResultCode) + ' ; ' + fClient.ResultString + LineEnding +
'HTTP.Sock.LastError: ' + inttostr(fClient.Sock.LastError) + ' ; ' + fClient.Sock.LastErrorDesc + LineEnding +
'HTTP.Sock.SSL.LastError: ' + inttostr(fClient.Sock.SSL.LastError) + ' ; ' + fClient.Sock.SSL.LastErrorDesc;
(*
* Wenns nicht klappt, eine Abhilfe schafft evtl:
*
* sudo aptitude install libssl-dev
*)
exit;
End;
Body := TStringList.Create;
body.text := 'SAMLResponse=' + _SAMLRequest +
'&RelayState=' + _RelayState;
fClient.MimeType := 'application/x-www-form-urlencoded';
fClient.Document.Clear;
fClient.Headers.Clear;
CopyStringsToStream(body, fClient.Document);
// body.SaveToFile('C:\Desktop\SAML_Body.txt'); // Debugg, to be removed
body.free;
fclient.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/60.0'; // -- Manchmal akzeptieren die Gegenstellen nicht, das wir Synaptik sind.
fClient.HTTPMethod('POST', _Host + SSOFilename); // <-- Hier kommt die 403 Antwort, wo im Firefox alles aktzepiert wird
body := TStringList.Create;
CopyStreamToStrings(fClient.Document, body);
body.SaveToFile('C:\Desktop\Nach_Post_vor_Follow.txt'); // Debugg, to be removed
body.free;
Follow_Links(_Host + SSOFilename);
body := TStringList.Create;
CopyStreamToStrings(fClient.Document, body);
body.SaveToFile('C:\Desktop\Nach_Post_nach_Follow.txt'); // Debugg, to be removed
body.free;
//sl.Clear;
//CopyStreamToStrings(fClient.Document, sl);
//sl.SaveToFile('C:\Desktop\Nach_Follow.txt');
//sl.free;
End;