Bu makalemizde ASP.NET projelerinde, active directory’ye ulaşılırak yapılan bazı işlemler üzerinde duracağız;
- Web projesinin client’ının açıldığı bilgisayarda açık olan account sahibinin kullanıcı adı ve bağlı olduğu domain alınabilir.
- Bir active directory’den kullanıcı adı ile kullanıcının grupları ve bazı bilgileri alınabilir.
- Kullanıcı adı, şifresi ve domain biliniyorsa bu bilgilerin doğruluğu active directory’ye login olmaya çalışılarak kontrol edilebilir.
Bu işlemler için bazı referansları projeye eklememiz ve dll’leri kullanmamız gerekmektedir. İlk olarak account’tan kullanıcı ismi ve domain adı alma ve sonrasında bu kullanıcının active directory gruplarını alma işlemine göz atacağız:
İlk olarak proje referanslarına System.DirectoryServices eklenir: Şekil 1. Referans eklenmesi |
Daha sonra “System.DirectoryServices” active directory’ye erişilecek sınıf içerisinden import edilir:
Imports System.Security.Principal
Imports System.Security.Permissions
Imports System.Runtime.InteropServices
Imports System.DirectoryServices
Imports System.Security.Permissions
Imports System.Runtime.InteropServices
Imports System.DirectoryServices
Domain’e bağlı olan kullanıcı ismi ve domain adı aşağıdaki şekilde alınabilir:
strDomainAndUser = My.User.CurrentPrincipal.Identity.Name.ToString
My.User.CurrentPrincipal.Identity.Name
My.User.CurrentPrincipal.Identity.Name
içerisinden dönen string “domain/username” şeklinde olur, mesela; “univera/nimet.sozeri”.
Web projemizin virtual directory özellikleri ve Web.Config içeriği kullanıcı ismini alabilmek için ayarlanmalıdır; Virtual directory özelliklerinden “Directory Security” tabı altındaki “Anonymous access and authentication control” kısmındaki “Edit” butonu ile açılan “Authentication Methods” penceresinde anonymous access seçeneği işaretlenmemiş olmalıdır. Bu şekilde domain’e bağlanmış olan kullanıcı adı ve bağlı olduğu domain adı alınabilir.
Şekil 2. Authentication mode ayarlanması |
Ayrıca Web.Config içerisinde “authentication” elemanının mode özelliği “Forms” olmamalıdır. Bu özellik de “Windows” olarak değiştirilmelidir.
<authentication mode="Windows"/>
Kullanıcı adı alındıktan sonra da active directory’de kullanıcının dahil olduğu gruplar “DirectoryServices”a ait olan “DirectoryEntry”, “DirectroySearcher” sınıfları kullanılarak alınabilir:
Dim objRsl As SearchResult
Dim objDE As New DirectoryEntry(LDAP://DC=Univera,DC=NET)
Dim objSrc As New DirectorySearcher(objDE)
objSrc.Filter = String.Format("(SAMAccountName={0})", userName)objSrc.PropertiesToLoad.Add("memberOf")
objRsl = objSrc.FindOne()
Dim objDE As New DirectoryEntry(LDAP://DC=Univera,DC=NET)
Dim objSrc As New DirectorySearcher(objDE)
objSrc.Filter = String.Format("(SAMAccountName={0})", userName)objSrc.PropertiesToLoad.Add("memberOf")
objRsl = objSrc.FindOne()
If Not objRsl Is Nothing Then
For i = 0 To objRsl.Properties("memberOf").Count – 1
‘memberOf özelliğinden gruplar alınıp amaca uygun işleme katılır
Next
End If
For i = 0 To objRsl.Properties("memberOf").Count – 1
‘memberOf özelliğinden gruplar alınıp amaca uygun işleme katılır
Next
End If
SearchResult nesnesinin içerisinden memberOf değerleri alınabilir ve kullanıcının grupları bu şekilde belirlenebilir. Kullanıcının active directory gruplarını alabilmek için de Web.Config’te bir özellik uyarlanmalıdır; identity elemanının impersonate özelliği “True” olarak belirlenmelidir:
<identity impersonate="true" />
Son olarak kullanıcı adı, domain adı ve şifre elimizde varsa bu değerlerin active directory’den kontrol edilmesi işlemini inceleyelim. Bu işlem için de “C:\WINDOWS\system32” altından “advapi32.dll” alınıp projeye eklenir.
Şekil 3. Advapi32.dll’in projeye eklenmesi |
Kod içerisinden bu dll daha sonra import edilerek kullanılacak fonksiyonlar belirtilir.
<DllImport("advapi32.dll")> _
Private Shared Function LogonUser(ByVal _
lpszUsername As String, ByVal lpszDomain _
As String, ByVal lpszPassword As String, _
ByVal dwLogonType As Integer, _
ByVal dwLogonProvider As Integer, _
ByRef phToken As Integer) As Boolean
End Function
Private Shared Function LogonUser(ByVal _
lpszUsername As String, ByVal lpszDomain _
As String, ByVal lpszPassword As String, _
ByVal dwLogonType As Integer, _
ByVal dwLogonProvider As Integer, _
ByRef phToken As Integer) As Boolean
End Function
Biz burada “LogonUser” fonksiyonunu kullanacağız. Bu fonksiyon ile bir kullanıcı adı, domain adı ve şifrenin active directory’ye login olup olmadığı kontrol edilir, sonuçta login işlemi başarılı ise “True” olarak boolean değer döner.
Dim objAd As New AD
If objAd.LogOnToActiveDirectory("nimet.sozeri", "Univera", "Sifre") Then
Label1.Text = "Kullanıcı 'nimet.sozeri' ile 'Univera' domain'ine log in olunabildi!"
End If
If objAd.LogOnToActiveDirectory("nimet.sozeri", "Univera", "Sifre") Then
Label1.Text = "Kullanıcı 'nimet.sozeri' ile 'Univera' domain'ine log in olunabildi!"
End If
Nimet SÖZERİ
Öncelikle örnek için sağolun. Sorum şu;
YanıtlaSilActive Directory ile kullanıcın logonhours unu nasıl değiştirebilirim, teşekkürler.
Yorumunuz için teşekkürler,
YanıtlaSilActive Directory'de logonHours'u değiştirmek üzerine deneyimim yok, bunu yapabilmek için Active Directory'de admin olmak gerekiyor, bu nedenle ben yazdığım kodlarda yetki ile ilgili hata alıyorum, ancak sizin deneme şansınız varsa vereceğiniz mail adresine çalıştırmayı denediğim kodları gönderebilirim.
Merhaba makale için sağolun gerçekten işime yaradı.Web uygulamasında domaine login olan kullanıcının bilgisini alabilirmiyim acaba.Web sayfasının çağaran kullanıcının windows login bilgisi
YanıtlaSilTeşekkürler, işinize yaradığına sevindim,
YanıtlaSilDomain'e login olup da web sayfasını çağıran kullanıcının domain ve kullanıcı bilgisi My.User.CurrentPrincipal.Identity.Name özelliği kullanılarak alınabilir.
My.User.CurrentPrincipal.Identity.Name.ToString() ile dönen string içerisinde domain ve kullanıcı bilgisini bulabiliriz.
"domain/username" şeklinde gelen string parse edilerek bu iki bilgi alınabilir.
Dim UserDomain() As String = Split(My.User.CurrentPrincipal.Identity.Name.ToString(), "\")
Dim username As String = strUserDomain(1)
yukarıdaki şekilde username değişkenine kullanıcı bilgisini atabiliriz.
Paylaşımlarınız için teşekkür ederiz. Herhangi bir sorunda dell laptop tamircisi olarak hizmet vermekten onur duyarız.
YanıtlaSil