ActiveDirectory Doğrulama

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

ActiveDirectory Doğrulama

Mesaj gönderen vkamadan »

Merhaba değerli üyeler ,
ActiveDirectory üzerinden doğrulama yapıyorum, masaüstü uygulamalarda sorun yok ancak IIS üzerinde çalıştırdığım web servis metodumda bir süre sonra aşağıdaki hata oluşmaya başlıyor

Kod: Tümünü seç

Multiple connections to a server or shared resource by the same user, using more than one user name, are not allowed. Disconnect all previous connections to the server or shared resource and try again
AdsOpenObject api si ile aşağıdaki şekilde bir yapı kullnaıyorum, sanırım birşeyler açık kalıyor yok edilmesi gereken birşeyler varmı tecrübeniz dahilinde onu öğrenmek istedim.

Kod: Tümünü seç

uses 
ActiveDs_TLB
function doLogin(pUserName,pPassword : String) : Boolean;
var
  intResult : Integer ;
   Obj : IADs ;
begin
 try
                    CoInitialize(nil);
                       try
                       intREsult := ADsOpenObject('WinNT://'+FieldByName('domain').AsString,pUserName,pPassword,1,IADs,Obj);
                       Result := Succeeded( intResult ) ;
                       except on e: exception do
                         begin
                          Result := False;                         
                         end;
                       end;
                       finally
                         CoUninitialize;
                       end;
end;
Volkan KAMADAN
www.polisoft.com.tr
m_yaprakci

Re: ActiveDirectory Doğrulama

Mesaj gönderen m_yaprakci »

Tam hatırlayamamakla birlikte active directory kullanıcı ayarlarında bağlantısı kesilen oturumu yok et diye bi seçenek olacaktı.
Yine IIS'de (yıllardır kullanmam bu nedenle biraz havada bi cevap olacak) aynı şekilde bağlantısı kesilen oturumu yok et veya buna benzer bi ayar ile maximum bağlantı sayısı, çoklu oturum açma gibi ayarlar olması gerekiyordu.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: ActiveDirectory Doğrulama

Mesaj gönderen vkamadan »

@m_yaprakci , paylaşımınız için teşekkürler, ilgili sorun sadece IIS için de ki metodlarımda meydana geliyor dışarda çalışırken hiç bir sorun yok tahminimce sorun Uygulama Havuzu nun çalışma mantığıyla ilgili teknik olarak servis isteği geldiğinde bir örneği yaratılan sınıfın istek cevaplandığında otomatikş yok ediliyor olması gerekir ancak burada farklı birşeyler oluyor olmalı, masaüstü uygulamamda A.D loginden sonra uygulamayı kullanıcı kapatıyor ve kapantığından emin oluyoruz varsa A.D ile ilgili bişrşeyler uygulama kapanırken beraberinde yok ediyor, IIS üzerinde ise Uygulama Havuzu yada IIS in kendisi yeniden başlatılmadan oluşan sorun giderilmiyor, bu nedenle ilgili API nin bir uzantısıyla tersine oturum kapatma yada A.D. ye nesneyle işimizin bittiğini iletebiliyor olmam gerekiyor düşüncesindeyim bu API yi arıyorum.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: ActiveDirectory Doğrulama

Mesaj gönderen mrmarman »

Merhaba..
Böyle bir sorunla karşılaşmamıştım ama çalıştığım yerde Active Directory ile işim hep oluyor.
Sorunu yanlış anlamış da olabilirim, öyle ise özür.
Sorunu uygulamanın açık oluşu mu yoksa açık olan path mi olduğunu anlamadığımdan boşuna da yazıyor olabilirim.
Şimdi konu ile ilgili Google ile kısa bir tarama yapınca gördüklerimi paylaşayım.

NET USE ile baktığınızda gördüğünüz bağlantıyı NET USE /DELETE <bağlantı yolu> ile silip bir deneyelim ?
Eğer yeni bağlantıya bu sayede izin veriyorsa bir çıkış noktası bulunabilir.
Çıkış noktasını WMI aracılığıyla direkt SQL sorgusu ile Win32_NetworkConnection üzerinden command prompt'da NET USE ile sorgulanan içeriği MSDN'de buraya tıklayınca görünen şekilde ayrıntılanıyor.

WMI ile silinebilir mi bilmiyorum ancak periyodik olarak bakarak WinExec veya ShellExecute ile bir kaç defa denenerek kontrol altına alınabilir diye değerlendiriyorum.
Resim
Resim ....Resim
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: ActiveDirectory Doğrulama

Mesaj gönderen xxxjedixxx »

Merhaba,

Eğer sunucu AD üyesi ise aşağıdaki kodu da kullanabilirsiniz. Ben web servislerinde bunu kullanıyorum. IIS'de de sorun çıkarmıyor.

Kod: Tümünü seç

function LogonTest(pUser, pDomain, pPwd: string; var ErrorCode: Integer): Boolean;
var Token: THandle;
begin
  ErrorCode := 0;
  Result := LogonUser(PChar(pUser), PChar(pDomain), PChar(pPwd),
                      LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, Token);
  if Result then CloseHandle(Token) else ErrorCode := GetLastError;
end;
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: ActiveDirectory Doğrulama

Mesaj gönderen vkamadan »

Cevaplarınız için teşekkürler,
@mrmarman ilgili sunucuda bir çok login işlemini IIS üzerinde ki SOAP fonksiyonumla gerçekleştirdikten sonra "NET USE" ile liste almak istediğimde tamamen boş geliyor.

@xxxjedixxx önerdiğiniz API ile sorun çözüldü çok teşekkür ederim.

İyi çalışmalar dilerim.
Volkan KAMADAN
www.polisoft.com.tr
myasa
Üye
Mesajlar: 5
Kayıt: 11 Ara 2003 07:15
Konum: Izmir/Turkiye

Re: ActiveDirectory Doğrulama

Mesaj gönderen myasa »

Merhaba arkadaşlar,
Ben de aynı konu ile ilgili uğraşıyorum ve bazı sorunlar yaşıyorum.
Kullanıcıadı ve şifresinin doğrulanmasını sunucu üzerindeki bir uygulama üzerinde gerçekleştiriyorum.

Result:=ADsOpenObject('WinNT://'+Domain.Text, UserID.Text, Password.Text, ADS_SECURE_AUTHENTICATION, IADs, Obj);

Bu şekilde kullanduğımda kullanıcı adı ve şifre doğru olduğunda sorun yok. Ancaş yanlış şifre girildiğinde kullanıcı hesabı lock oluyor. Bu durumu araştırdım ve flag olarak ADS_SECURE_AUTHENTICATION yerine 0 (sıfır) gönderdim. yanlış şifre girişlerinde kitlenmiyorum. Ancak hata mesajı olarak
"Multiple connections to a server or shared resource by the same user, using more than one user name, are not allowed. Disconnect all previous connections to the server or shared resource and try again"
mesajını alıyorum.

Amacım active directory login olmadan sadece mevcut kullanıcı hesabı için kullanıcı adı/şifre doğrulaması yaptırmak.

Bir detay daha ekleyeyim. ayptığım sorgulama bir test uygulamasında bu şekilde çalışıyor. Orjinal uygulama multithread bir uygulama. Orjinal uygulama 32 bit versiyonunda ADsOpenObject komutu çalıştığında uygulama crash oluyor. 64 bit sürümünde bu şekilde çalışıyor. 32 bit sürümde neden uygulamanın patladığını anlayamadım.

Yardımcı olacak bilgi ver yorumlarınız için şimdiden teşekkürler.
ertank
Kıdemli Üye
Mesajlar: 1651
Kayıt: 12 Eyl 2015 12:45

Re: ActiveDirectory Doğrulama

Mesaj gönderen ertank »

Merhaba,

Muhtemelen olan şu: API fonksiyonu ADsOpenObject sunucuya bağlantıyı ilk çağırıldığı zaman açıp sonra kapatmaz. Sizin bağlanmaya çalıştığınız Domain Controller da bir kullanıcı bağlı iken diğerine izin vermeyip hata durumu oluşuyor.
Sorun ile ilgili daha detaylı bilgi için: https://support.microsoft.com/en-us/kb/218497

Çözüm için "yapılabilecekler":
1- Doğrulama yapılacak kullanıcıyı "userid" üzerinden (domain olmadan) arayarak gerekli bilgileri okuyabilirsin. Ancak bunun detaylarına burada girmek istemediğim bazı sakıncaları var.
2- Microsoft tarafından önerilen yöntem: https://support.microsoft.com/en-us/kb/180548

Benim şahsi önerim işletim sistemini yazan firmanın önerdiği LogonUser() Win API fonksiyonunu LOGON32_LOGON_NETWORK parametresi ile kullanmak şeklinde olacak. Burada birkaç noktaya dikkat etmekte fayda var.
a- LogonUser() Windows XP öncesi sistemlerde "SE_TCB_NAME" yetkisi gerektirir. Bu yetki genellikle sıradan kullanıcılara verilmez. Windows NT ve Windows 2000 sistemlerde bu anlamda sorun yaşanabilir.
b- LogonUser() fonksiyonu Windows 95, Windows 98 ve Windows Millenium sürümlerinde mevcut değil. Bu sistemlerde kullanılamaz.

Active directory içinde arama yapmak için kaynaklar:
http://agnisoft.com/white_papers/active_directory.asp
http://adsi.mvps.org/adsi/Delphi/index.html
http://stackoverflow.com/questions/3373 ... -directory

Eğer LogonUser() ile devam etmek istersen, bu fonksiyon Windows.pas içinde tanımlıdır. Detaylarına oradan bakabilirsin. Ayrıca aşağıdaki bağlantıları da kullanabilirsin.
http://akini.mbnet.fi/delphi/ntlmlogin/
http://delphi-kb.blogspot.com.tr/2010/0 ... -call.html
http://www.delphigroups.info/2/66/489122.html
myasa
Üye
Mesajlar: 5
Kayıt: 11 Ara 2003 07:15
Konum: Izmir/Turkiye

Re: ActiveDirectory Doğrulama

Mesaj gönderen myasa »

Açıklamalar için teşekkür ederim. Linkleri inceleyeceğim.
Cevapla