[ _deran_ @ 29.07.2020. 07:10 ] @
Kako da napravim autentifikaciju za HTTP server (indy) koristeći korisnikovu prijavu u Windows? Dovoljno mi je username da dobijem.
[ savkic @ 29.07.2020. 09:22 ] @
Da se klijent autentifikuje na tvoj indy server preko windows username/pass? Najlakse je verovatno da pozoves LogonUser.
Ako hoces sigurnije resenje onda treba da pogledas SSPI i Kerberos, ali mislim da nema Delphi implementacije, eventualno ona u mORMotu.
[ _deran_ @ 29.07.2020. 11:47 ] @
Kako mislis "pozoves LogonUser"?
U mrezi imamo 2 servera sa ASP.NET aplikacijama u koje ne moram da se logujem, sam nekako prepozna koji mi je windows user. Kad im pristupam spolja, trazi mi user/pass. To bih i ja hteo na mom http serveru.
Dovoljno mi je samo windows username da dobijem pa cu na osnovu toga da radim dalje sta sam mislio. Gledao sam header requestova koje pravi jedna od tih asp aplikacija, ne vidim nista specificno sto bi pomoglo serveru da zna ko sam (ako browser slucajno zna i moze da salje nesto vise od reginal settingsa, rezolucije i tih sitnica, onda smo svi u problemu )
Jedino sto mi pada na pamet je da domain zna koji user je na kojem ip-u prijavljen pa na osnovu peer ip odredi koji sam user...
[ bokinet @ 29.07.2020. 13:36 ] @
Trenutno nemam vremena da pisem... nada se da ce pomoci ovo dole na linkovima a tu je i google za ostalo:


developer.mozilla.org/en-US/docs/Web/HTTP/Authentication



c-sharpcorner.com/UploadFile/84c85b/understanding-windows-authentication-in-detail/


baeldung.com/httpclient-4-basic-authentication
[ _deran_ @ 29.07.2020. 13:59 ] @
Jasno je meni koji su sve načini autentifikacije, sada me interesuje samo ovaj sa windows domain nalogom. Na drugom linku što si poslao piše nešto o tome ali takođe piše i da je ograničeno samo na IIS i windows platforme. Ako je to čist TCP, kako može biti ograničeno na windows??? Šta je to što browser kroz TCP pošalje serveru da on zna ko je klijent (osim ip adrese)? Ako server samo na osnovu IP-a sazna koji windows user je logovan na tom računaru, kako ja to sa delphi-em da saznam? Pošto to u mreži radi za asp.net, siguran sam da u mreži postoji sve što treba (active directory itd). Nisam stručnjak za asp i trenutno nemam pristup serveru (mogao bih da dobijem ali moram znati šta mi treba).
[ Milan Milosevic @ 29.07.2020. 14:28 ] @
Pitanje je kako ti klijenti pristupaju serveru, da li preko tvoje klijent aplikacije ili preko običnog browsera. Ako je preko tvoje korisničke app, onda je lako, ako je u pitanju brower onda bolje postavi pitanje na nekom php forumu.
[ _deran_ @ 29.07.2020. 20:57 ] @
Preko obicnog browsera pristupaju. Pitanje je za delphi jer je http server u delphiu i on prima request. Ako treba da se kacim na ldap ili slicno, i to bi trebao u delphiu. U ovom slucaju nije mi opcija da radim php ili asp jer je dosta logike vec u delphiu. Mozda samo auth da mi radi asp ali ne bih da pravim "Frankestajna" ako ne moram...
[ Milan Milosevic @ 29.07.2020. 21:01 ] @
Mislim da pitaš php programere koji podatak šalje brower, pa onda da tražiš rešenje za Delphi. teško da neko zna od Delphi programera direktno. Ovako bi imao neki trag.
[ savkic @ 29.07.2020. 21:52 ] @
Ja i dalje ne kapiram da li ti pravis klijent ili server?
[ djoka_l @ 29.07.2020. 22:13 ] @
Evo jednog dela JS iz HTML-a
...
var wshell = new ActiveXObject("WScript.Shell");
var username = wshell.ExpandEnvironmentStrings("%USERNAME%");
...

Ovaj skript daje Windows username SAMO AKO SE STRANICA OTVORI IZ IE!!!

Ni jedan drugi browser ne dozvoljava da JS izađe iz sendbox-a i da čita varijable okruženja na klijentskoj mašini.

Dakle, ako se http servisu pristupa iz IE, može da se pročita windows logon, drugačije ne može!
Skript radi bez obzira na to šta se koristi na serverskoj strani (IIS, Apache, nginx...) ali je bitno da klijent bude IE na windowsu.
[ _deran_ @ 30.07.2020. 07:03 ] @
@savkic
Radim server, pise TIdHTTPServer :)

@djoka
Siguran sam da je na server strani komplet resenje a ne na klijentu (js). Radi iz svih browsera, ne samo iz IE. Bokinet je dao link gde se vidi kako to radi u asp.net, ali meni treba na indy http serveru.
[ djoka_l @ 30.07.2020. 07:59 ] @
Proveri ti i na Microsoft sajtu.
To rešenje iz gornjeg linka radi samo kada je http server IIS, a klijent IE.

Rešenje koje sam ja postavio je sa okruženja koje ja održavam i gde je Apache sa serverske strane. Dotično rešenje radi sa IE na klijentskoj strani i SAMO sa IE.
[ tkaranovic @ 30.07.2020. 08:06 ] @
Prvo sto treba da proveris je to sto pise dojka da li radi to resenje sa drugim browserima.

Ja sam nesto malo koristio indy server.

Kad mi je trebalo da proverim kako radi server (indy ili inace) sa browserima onda sam koristion tcp klijet koji se konektuje kao brwser.
Taj klijent mi je onda pravio log sa svom komunikacijom i znao sam sta se salje a sta se prima.

Inace za tcp klijenta treba vremena a ako imas onda se konektuje na port 80 i salje i prima podatke isto kaosvaka druga tcp konekcija.
Jedina razlika je sto mora da posalje http podatek sa http zaglavljem.

[ _deran_ @ 30.07.2020. 08:50 ] @
Resenje sa asp.net radi sa svim browserima, ne samo sa IE. Siguran sam da je resenje na strani servera a ne neka javascripta ili nesto sa klijenta. Gledao sam sa "Developer Tools" od chrome-a sta salje u headeru requesta ali nisam nasao nista neobicno sto bi moglo da identifikuje klijenta. Mogao bih i Wireshark da pustim i gledam ceo saobracaj ali mi se cini da je to pogresan put...
Gledam trenutno kako sa Delphi sa da nakacim na Active Directory, ima cak i preko ADO-a ali mi nesto zeza trenutno... Mozda bih mogao da vidim koji user je na kojem IP-u trenutno, pa iz requesta izvucem IP i vidim koji je user.
[ Milan Milosevic @ 30.07.2020. 10:04 ] @
Što ne napraviš da ti se korisnik registruje na serveru. Nisam baš siguran da ova auto detekcija radi, sem preko ip adrese.
[ tkaranovic @ 30.07.2020. 10:11 ] @
Kolikom se secam, Indy server salje fajlove iz web dira.
Jednostavno bi stavio taj asp.net fajl u web folder.
Na istom racunaru se moze konektovati na server sa:

localhost:80/asp.net
ili:
127.0.0.1/asp.net

Ili tako nesto, odnosno da posalje tako kako se vidi u toj komunikaciji.

Onda mozeda se vidista se dogadja u browseru.
Moze da se uporedi sa tom komunikacijom gde radi i vidi da li je nesto drugacije.
[ _deran_ @ 30.07.2020. 11:32 ] @
@milan
Trenutno mi se useri loguju sa username/passw, dobiju token koji ide uz svaki request. Posto vidim da moze i automatski preko windowsa, hteo sam da probam posto vidim da radi a ne znam kako :) aplikacija se vidi samo u lokalnoj mrezi, nije na internetu, pa bih mogao da se oslonim iskljucivo na windows auth kad bih znao kako.

@tkaranovic
Druze ili ja tebe potpuno ne razumem ili si potpuno omasio :) mozes malo objasniti?
[ tkaranovic @ 30.07.2020. 13:15 ] @
Rekao si da imas komunikaciju. Prepostavljam sa serverom koji radi to sto ti treba.

Tu kominiksciju mozes da snimis u fajlove.
recimo:
NBroswer je poslao: httpr1.txt
Server je odgovrio: httpo1.txt
Stavis jednostvnu TCP komponentu na formu sa activnim portom 80.
Startujes web serve tester na svom racunaru.
Startujes NBroswer na svom racunaru.
Ukucas u NBroswer:
localhot:80
NBroswer e poveze sa tvojim testerom.
NBroswer je posalje tvom web testeru: httpr1.txt
Tvoj web tester poslaje httpo1.txt

Onda vidis da li NBroswer reaguje na isti nacin kao se povezivao sa serverom sa kojim si snimio uspesnu komunikaciju.

Ako je bilo vise slanja httpr2.txt, httpr2.txt... onda se samo poslje sledeci snimljeni fajl.

U sustini NBroswer nema pojma da li je povezan sa googlom (na primer) ili sa tvojim testerom.

Ja sam tako bio napravio "proxy" web server tester sa kojim se povezivao browser a "proxy" tester se povezivao sa pravim serverom i prosledjivao zahteve i odgovore i sve snimao fajlove.
Onda sam pregledao sta i kada salje i prima i to posle koristio.

Sad kad pogledam celu poruku vidim da je komplikovano to sto sam radio i sto sam sad nakucao :)
[ _deran_ @ 30.07.2020. 14:43 ] @
Imam komunikaciju sa nekom web aplikacijom u asp.net koja radi to sto želim i bilo kojim browserom.

Nešto kao proxy pass? Morao bih sve linkove i ajax pozive da preusmeravam na svoj "proxy", tj. da menjam html koji šaljem klijentu (browseru) jer ću ja od pravog servera dobiti https://intranet/bla?bla=bla a klijentu treba da saljem http://localhost/bla?bla=bla da bi sve islo preko tog "proxy"-a.

Bojim se da bih opet došao do zaključka da je sve "server-side" rešeno, da džaba analiziram request/response.
[ tkaranovic @ 30.07.2020. 15:19 ] @
Da sa web aplikacijom je sve komplikovanije...

Ako nije problem/(poslovna)tajna tvoja aplikacija radi kao ko indy server a na istoj masini je povezana sa tom web aplikacijom?
[ savkic @ 30.07.2020. 15:24 ] @
Uradi test, na jednom od klijenata gde radi taj ASP program, obrisi browser history za taj sajt, cookies, local storage, ponovo se ulogoj i snimi sta je ovaj poslao.
Onda iz tvog klijenta posalji isti sadrzaj i vidi sta se desava.
[ _deran_ @ 30.07.2020. 15:30 ] @
@tkaranovic
To nije tajna, imam indy http server za neku moju web aplikaciju (koristim trenutno username/passw za login) a asp.net aplikacija koja vidim da radi to sto bih zeleo je neka sasvim druga prica u istoj mrezi. Radi nesto sasvim drugo na drugom serveru, ali u istoj domain grupi


@savkic
Mislim da se nismo razumeli, ja ne pravim klijenta nego server. Klijenti ce biti razni browseri. Ta ASP.NET aplikacija mi je posluzila iskljucivo kao dokaz da to sto zelim moze da se izvede na neki nacin.
[ Milan Milosevic @ 30.07.2020. 15:33 ] @
Citat:
_deran_:
@milan
Trenutno mi se useri loguju sa username/passw, dobiju token koji ide uz svaki request. Posto vidim da moze i automatski preko windowsa, hteo sam da probam posto vidim da radi a ne znam kako :) aplikacija se vidi samo u lokalnoj mrezi, nije na internetu, pa bih mogao da se oslonim iskljucivo na windows auth kad bih znao kako.


To možeš da iskoristiš kao privremeno bolje rešenje od trenutnog, ali ne bih rekao da je bezbednije da propustaš ljude samo što neko prilazi serveru sa istog računara.
Kad ti se korisnik prvi put konektuje očitaj mu IP adresu i daj mu trajnu dozvolu za tu adresu, tako da može da se loguje uvek bez šifre sve dok ne promeni adresu. Znajući naše korisnike to se dešava jednom u 2 godine ili dok ne nestane struje.
A za ovo nebih znao. Liči mi na ovo kao što forum provaljuje koji je operativni sistem u pitanju ili nešto slično. Moguće je da server brosweru šalje neki js kod koji po kome on očitava podatke na računaru pa vraća serveru, ako je to protokolarno dozvoljeno zbog bezbednosni sistema.
[ savkic @ 30.07.2020. 15:34 ] @
Pa vidi sta ona salje, sto je posebno bitno ako nema kookija ili bilo cega drugog, npr aplikacija prvi put pristupa serveru.

U svakom slucaju ti na serveru i na osnovu IP adrese klijenta odnosno naziva tog racuna mozes videti username:

query user /server:IPKlijenta

[ savkic @ 30.07.2020. 15:36 ] @
Moze izgleda i:
wmic /node:IPAdresa COMPUTERSYSTEM GET USERNAME
[ _deran_ @ 30.07.2020. 15:51 ] @
@Milan Milosevic
Ne dajem dozvolu na osnovu racunara nego na osnovu korisnika koji se ulogovao na racunar


@savkic
TO!

query user /server:IPKlijenta

Vrati mi logovanog korisnika. Samo sto nisam siguran da li vrati bas trenutno logovanog jer mi za neke racunare vrati po 2 usera, a mislim da nam je to onemoguceno. Imam sad od cega da krenem dalje.

Hvala!


p.s.
Ako neko nadje neko elegantno delphi resenje neka napise :) Ako nema, mogu startovati dos komandu iz delphi-a i parsirati rezultat (create pipe, create process...) ali bilo bi lepse ako ima nesto za "query" komandu. "wmic" nam je "access denied"
[ savkic @ 30.07.2020. 15:54 ] @
Ja ti svakako ne bih preporucio tako nesto, nije bezbedno gledati samo ip adresu.

query user koristi neki Windows API, ali nemam pojma kako saznati koji.
[ Zlatni_bg @ 30.07.2020. 19:25 ] @
Sa iskustvom bekend programera... ovo je suplje k'o svajcarski sir ako ces to da koristis za auth :D
[ _deran_ @ 31.07.2020. 06:27 ] @
Zbog čega? Korisnici nemaju pravo fiksiranja ip adrese da bi mogli nekome da ukradu, sve mora preko DHCP. Aplikacija nije vidljiva s interneta, samo u lokalu.
Ako korisniku tražim da se jednom uloguje sa windows umesto aplikativnim userom, pa mi drugi put dolazi sa istim tokenom sa istim windows username-om, šta može da se desi? Ne mogu baš za mašinu da se vežem jer je kod nas normalno da isti comp koristi više korisnika, svako sa svojim nalogom.

OK, ako i nije bezbedno, ostaje pitanje kako to radi ASP na bezbedan način?
[ tkaranovic @ 31.07.2020. 07:01 ] @
Nisi bio pre pisao da je u lokalu!

Ta WEB aplikacija koja radi je isto ulokalu ili moze preko interneta danse vidi?
[ _deran_ @ 31.07.2020. 07:28 ] @
Isključivo lokal.


Našao sam ovo, možda je to rešenje. Nisam ranije koristio...

Nema mi ni smisla da radi preko interneta, mora comp da bude nakačen na domen.
[ tkaranovic @ 31.07.2020. 09:02 ] @
Nema potrebe za Internetom samo sam pitao.

POgledaj:

net user

odnosno:

https://docs.microsoft.com/en-...access/nf-lmaccess-netuserenum
[ _deran_ @ 31.07.2020. 09:23 ] @
Izgleda da je NTLM, i da mi je promaklo nešto u headeru koji se šalje ka ASP aplikaciji koja radi.

Ovde se vidi jednostavno kako ide protokol.

Na OnCommandGet, ako browser nije prosledio ništa za auth, ja mu vratim 401:

Code:
    AResponseInfo.CustomHeaders.Add('WWW-Authenticate: NTLM');
    AResponseInfo.ResponseNo := 401;
    AResponseInfo.ContentText := 'Unauthorized';


i on sam odmah pravi drugi get request gde mi šalje u headeru "Authorization: NTLM TlRMTVNTUAABAAAAB7IIog........". Delphi mi tad uđe u OnParseAuthentication pre nego što uđe u OnCommandGet i dalje ide komunikacija kako već ide, tako kako je opisano u linku.

Ostaje mi onda onaj deo sa proverom na domenu ali sad bar znam kako funkcioniše, pa kad bude vremena... rešiću jednom :)
[ tkaranovic @ 31.07.2020. 10:16 ] @
Lepo da si ipak napisao zasto NTLM da i mi imamo ovde povratnu informaciju :)
[ savkic @ 31.07.2020. 11:18 ] @
NTLM je deprecated jer nije siguran, bolji je Kerberos tj. SSPI. Imas to sve reseno u mORMot biblioteci za Delphi.